FALCON-2118 Proposal for new UI changes

changes as described in FALCON-2118

Author: Venkat Ranganathan <venkat@hortonworks.com>

Reviewers: Peeyush <peeyushb@apache.org>

Closes #268 from vrangan/FALCON-2118
diff --git a/falcon-ambari-view/Gruntfile.js b/falcon-ambari-view/Gruntfile.js
new file mode 100644
index 0000000..06ae4ea
--- /dev/null
+++ b/falcon-ambari-view/Gruntfile.js
@@ -0,0 +1,55 @@
+/**
+ * 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.
+ */
+(function () {
+  "use strict";
+
+  module.exports = function (grunt) {
+
+    grunt.initConfig({
+
+      scp: {
+        options: {
+          host: 'sandbox.hortonworks.com',
+          username: 'root',
+          password: 'hadoop'
+        },
+
+        sandbox: {
+          files: [
+            {
+              cwd: 'target',
+              src: '*.jar',
+              filter: 'isFile',
+              // path on the server
+              dest: '/var/lib/ambari-server/resources/views'
+            }
+          ]
+        }
+      }
+
+    });
+
+    grunt.registerTask('deploy', [
+      'scp'
+    ]);
+
+    grunt.loadNpmTasks('grunt-scp');
+
+  };
+
+}());
\ No newline at end of file
diff --git a/falcon-ambari-view/README b/falcon-ambari-view/README
new file mode 100644
index 0000000..07cb13b
--- /dev/null
+++ b/falcon-ambari-view/README
@@ -0,0 +1,53 @@
+/**
+ * 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.
+ */
+
+Falcon-Ambari-UI
+=========
+Web UI inside ambari for the Falcon-UI
+
+To clone the repository
+===============================
+- git clone https://github.com/hortonworks/falcon.git
+- git checkout dal
+
+
+Before starting
+===============
+NodeJs , npm, Grunt must be installed in the local pc.
+
+- From git root cd to /falcon-ui
+- npm install (this will install all the app related node modules)
+
+
+To deploy to the sandbox (v2-2)
+===============================
+- Deploy ambari view in order to generate falcon-ambari-view-0.7-incubating-SNAPSHOT.jar:
+ 1. cd falcon-ui
+ 2. grunt ambariview
+ 3. cd ..
+ 4. cd falcon-ambari-view
+ 5. mvn clean install
+ 6. falcon-ambari-view-0.7-incubating-SNAPSHOT.jar will be generated inside the taget directory
+
+- Upload falcon-ambari-view-0.7-incubating-SNAPSHOT.jar to /var/lib/ambari-server/resources/views/
+- Restart ambari server
+- Go to ambari admin -> Manage Ambari -> Falcon Ambari View -> Create Instance
+- Enter the API URL in the falcon.service.uri property
+
+Important!
+Security/Kerberos must be enabled, otherwise the services will ask for user.name param
diff --git a/falcon-ambari-view/package.json b/falcon-ambari-view/package.json
new file mode 100644
index 0000000..1aa99d4
--- /dev/null
+++ b/falcon-ambari-view/package.json
@@ -0,0 +1,38 @@
+/*
+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.
+*/
+
+{
+  "name": "falcon-ambari-view",
+  "version": "1.0.0",
+  "description": "UI to communicate with the ambari views",
+  "author": "Apache Foundation",
+  "license": "ISC",
+  "devDependencies": {
+    "grunt": "~0.4.4",
+    "grunt-concurrent": "^1.0.0",
+    "grunt-contrib-clean": "^0.6.0",
+    "grunt-contrib-concat": "^0.5.0",
+    "grunt-contrib-copy": "~0.5.0",
+    "grunt-contrib-csslint": "~0.2.0",
+    "grunt-contrib-jshint": "~0.10.0",
+    "grunt-contrib-less": "~0.11.0",
+    "grunt-contrib-uglify": "~0.4.0",
+    "grunt-contrib-watch": "~0.6.1",
+    "grunt-scp": "^0.1.7"
+  }
+}
diff --git a/falcon-ambari-view/pom.xml b/falcon-ambari-view/pom.xml
new file mode 100644
index 0000000..00176b5
--- /dev/null
+++ b/falcon-ambari-view/pom.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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. -->
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.falcon</groupId>
+		<artifactId>falcon-main</artifactId>
+		<version>0.10</version>
+	</parent>
+
+	<artifactId>falcon-ambari-view</artifactId>
+	<packaging>jar</packaging>
+	<name>Apache Falcon Ambari Views Integration</name>
+	<description>Apache Falcon UI Application</description>
+
+
+
+	<dependencies>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+			<version>2.5</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-client</artifactId>
+			<version>${jersey.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-json</artifactId>
+        </dependency>
+		<dependency>
+			<groupId>javax.inject</groupId>
+			<artifactId>javax.inject</artifactId>
+			<version>1</version>
+		</dependency>
+
+		<!-- Unit testing ====================================================== -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.11</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-core</artifactId>
+			<version>1.9.0</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>com.google.inject</groupId>
+		    <artifactId>guice</artifactId>
+		    <version>4.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.ambari.contrib.views</groupId>
+			<artifactId>ambari-views</artifactId>
+			<version>2.4.0.0.1019</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/lib/ambari-views-2.4.0.0.1019.jar</systemPath>
+		</dependency>
+	</dependencies>
+
+	<build>
+
+		<plugins>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>2.12</version>
+			</plugin>
+
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>package.json</exclude>
+						<exclude>src/main/resources/ui/css/**</exclude>
+						<exclude>src/main/resources/ui/js/**</exclude>
+						<exclude>src/main/resources/ui/config/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+			<plugin>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<phase>generate-resources</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+							<outputDirectory>${project.build.directory}/lib</outputDirectory>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+
+		<resources>
+			<resource>
+				<directory>src/main/resources/ui/</directory>
+				<filtering>false</filtering>
+			</resource>
+			<resource>
+				<directory>src/main/resources/</directory>
+				<filtering>false</filtering>
+				<includes>
+					<include>view.xml</include>
+				</includes>
+			</resource>
+			<resource>
+				<targetPath>WEB-INF/lib</targetPath>
+				<filtering>false</filtering>
+				<directory>target/lib</directory>
+			</resource>
+		</resources>
+	</build>
+
+</project>
diff --git a/falcon-ambari-view/src/build/findbugs-exclude.xml b/falcon-ambari-view/src/build/findbugs-exclude.xml
new file mode 100644
index 0000000..d548c0e
--- /dev/null
+++ b/falcon-ambari-view/src/build/findbugs-exclude.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+ -->
+<FindBugsFilter>
+
+    <!--
+    Disable encoding as this might give an impression that Falcon code base is
+    "Internationalization" ready, but we haven't done anything consciously to guarantee that.
+    -->
+    <Match>
+        <Bug pattern="DM_DEFAULT_ENCODING" />
+    </Match>
+
+    <Match>
+        <Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" />
+    </Match>
+</FindBugsFilter>
diff --git a/falcon-ambari-view/src/main/java/org/apache/falcon/ambari/view/FalconProxyImpersonator.java b/falcon-ambari-view/src/main/java/org/apache/falcon/ambari/view/FalconProxyImpersonator.java
new file mode 100644
index 0000000..15b0997
--- /dev/null
+++ b/falcon-ambari-view/src/main/java/org/apache/falcon/ambari/view/FalconProxyImpersonator.java
@@ -0,0 +1,346 @@
+/**
+ * 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.falcon.ambari.view;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import com.google.inject.Singleton;
+
+import javax.inject.Inject;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.ambari.view.URLStreamProvider;
+import org.apache.ambari.view.ViewContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This is a class used to bridge the communication between the falcon-ui and
+ * the falcon API executing inside ambari.
+ */
+
+@Singleton
+public class FalconProxyImpersonator {
+    private static final Logger LOG = LoggerFactory
+            .getLogger(FalconProxyImpersonator.class);
+    private static final String GET_METHOD = "GET";
+    private static final String POST_METHOD = "POST";
+    private static final String DELETE_METHOD = "DELETE";
+
+    private static final String FALCON_ERROR = "<result><status>FAILED</status>";
+    private static final String[] FORCE_JSON_RESPONSE = { "/entities/list/", "admin/version", };
+
+    public static final String VIEW_KERBEROS_PRINCIPAL = "view.kerberos.principal";
+    public static final String VIEW_KERBEROS_PRINCIPAL_KEYTAB = "view.kerberos.principal.keytab";
+
+    private ViewContext viewContext;
+
+    /**
+     * Constructor to get the default viewcontext.
+     * @param viewContext
+     */
+    @Inject
+    public FalconProxyImpersonator(ViewContext viewContext) {
+        this.viewContext = viewContext;
+    }
+
+    /**
+     * Method to set the ambari user.
+     * @param headers
+     * @param ui
+     * @return
+     */
+    @GET
+    @Path("/")
+    public Response setUser(@Context HttpHeaders headers, @Context UriInfo ui) {
+        try {
+            String userName = viewContext.getUsername();
+            return Response.ok(userName).type(getResponseType(userName))
+                    .build();
+        } catch (Exception ex) {
+            LOG.error(ex.getMessage(), ex);
+            return Response.status(Response.Status.BAD_REQUEST)
+                    .entity(ex.toString()).build();
+        }
+    }
+
+    /**
+     * Method to attend all the GET calls.
+     * @param headers
+     * @param ui
+     * @return
+     */
+    @GET
+    @Path("/{path: .*}")
+    public Response getUsage(@Context HttpHeaders headers, @Context UriInfo ui) {
+        try {
+            String serviceURI = buildURI(ui);
+            return consumeService(headers, serviceURI, GET_METHOD, null);
+        } catch (Exception ex) {
+            LOG.error(ex.getMessage(), ex);
+            return Response.status(Response.Status.BAD_REQUEST)
+                    .entity(ex.toString()).build();
+        }
+    }
+
+    /**
+     * Method to attend all the POST calls.
+     * @param xml
+     * @param headers
+     * @param ui
+     * @return
+     * @throws IOException
+     */
+    @POST
+    @Path("/{path: .*}")
+    public Response handlePost(String xml, @Context HttpHeaders headers,
+            @Context UriInfo ui) throws IOException {
+        try {
+            String serviceURI = buildURI(ui);
+            return consumeService(headers, serviceURI, POST_METHOD, xml);
+        } catch (Exception ex) {
+            LOG.error(ex.getMessage(), ex);
+            return Response.status(Response.Status.BAD_REQUEST)
+                    .entity(ex.toString()).build();
+        }
+    }
+
+    /**
+     * Method to attend all the DELETE calls.
+     * @param headers
+     * @param ui
+     * @return
+     * @throws IOException
+     */
+    @DELETE
+    @Path("/{path: .*}")
+    public Response handleDelete(@Context HttpHeaders headers,
+            @Context UriInfo ui) throws IOException {
+        try {
+            String serviceURI = buildURI(ui);
+            return consumeService(headers, serviceURI, DELETE_METHOD, null);
+        } catch (Exception ex) {
+            LOG.error(ex.getMessage(), ex);
+            return Response.status(Response.Status.BAD_REQUEST)
+                    .entity(ex.toString()).build();
+        }
+    }
+
+    /**
+     * Method set the parametters and cast them to a String.
+     * @param ui
+     * @return
+     */
+    private String buildURI(UriInfo ui) {
+        String serviceURI = getFalconURL();
+        serviceURI += getUIURI(ui);
+        StringBuilder urlBuilder = new StringBuilder(serviceURI);
+        MultivaluedMap<String, String> parameters = ui.getQueryParameters();
+        boolean firstEntry = true;
+        for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
+            if (firstEntry) {
+                urlBuilder.append("?");
+            } else {
+                urlBuilder.append("&");
+            }
+            boolean firstVal = true;
+            for (String val : entry.getValue()) {
+                urlBuilder.append(firstVal ? "" : "&").append(entry.getKey())
+                        .append("=").append(val);
+                firstVal = false;
+            }
+            firstEntry = false;
+        }
+        return urlBuilder.toString();
+    }
+
+    private String getUIURI(UriInfo uriInfo) {
+        String uriPath = uriInfo.getAbsolutePath().getPath();
+        int index = uriPath.indexOf("proxy/") + 5;
+        return uriPath.substring(index);
+    }
+
+    /**
+     * Method to consume the API from the URLStreamProvider.
+     * @param headers
+     * @param urlToRead
+     * @param method
+     * @param xml
+     * @return
+     * @throws Exception
+     */
+    private Response consumeService(HttpHeaders headers, String urlToRead,
+            String method, String xml) throws Exception {
+        Response response;
+        URLStreamProvider streamProvider = viewContext.getURLStreamProvider();
+        Map<String, String> newHeaders = getHeaders(headers);
+        newHeaders.put("user.name", viewContext.getUsername());
+
+        if (checkForceJsonRepsonse(urlToRead, newHeaders)) {
+            newHeaders.put("Accept", MediaType.APPLICATION_JSON);
+        }
+        LOG.info(String.format("Falcon Url[%s]", urlToRead));
+        InputStream stream = null;
+        if (isSecurityEnabled()) {
+            stream = streamProvider.readAsCurrent(urlToRead, method, xml,
+                    newHeaders);
+        } else {
+            stream = streamProvider
+                    .readFrom(urlToRead, method, xml, newHeaders);
+        }
+
+        String sresponse = getStringFromInputStream(stream);
+
+        if (sresponse.contains(FALCON_ERROR)
+                || sresponse.contains(Response.Status.BAD_REQUEST.name())) {
+            response = Response.status(Response.Status.BAD_REQUEST)
+                    .entity(sresponse).type(MediaType.TEXT_PLAIN).build();
+        } else {
+            return Response.status(Response.Status.OK).entity(sresponse)
+                    .type(getResponseType(sresponse)).build();
+        }
+
+        return response;
+    }
+
+    private boolean isSecurityEnabled() {
+        return !"simple".equals(viewContext.getProperties().get(
+                "falcon.authentication.type"));
+    }
+
+    private String getFalconURL() {
+        String falconUri = "";
+        if (viewContext.getCluster() != null) {
+            String tlsEnabled = viewContext.getCluster().getConfigurationValue(
+                    "falcon_startup.properties", "falcon.enableTLS");
+            String scheme = Boolean.parseBoolean(tlsEnabled) ? "https" : "http";
+            String falconHost = viewContext.getCluster()
+                    .getHostsForServiceComponent("FALCON", "FALCON_SERVER")
+                    .get(0);
+            String falconPort = viewContext.getCluster().getConfigurationValue(
+                    "falcon-env", "falcon_port");
+            falconUri = scheme + "://" + falconHost + ":" + falconPort;
+
+        } else {
+            falconUri = viewContext.getProperties().get("falcon.service.uri");
+        }
+        LOG.info("Falcon URI==" + falconUri);
+        return falconUri;
+
+    }
+
+    /**
+     * Method to read the response and send it to the front.
+     * @param is
+     * @return
+     */
+    private String getStringFromInputStream(InputStream is) {
+
+        BufferedReader br = null;
+        StringBuilder sb = new StringBuilder();
+
+        String line;
+        try {
+            br = new BufferedReader(new InputStreamReader(is));
+            while ((line = br.readLine()) != null) {
+                sb.append(line);
+            }
+        } catch (IOException e) {
+            LOG.error(e.getMessage(), e);
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    LOG.error(e.getMessage(), e);
+                }
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Method to cast the response type.
+     * @param response
+     * @return
+     */
+    private String getResponseType(String response) {
+        if (response.startsWith("{")) {
+            return MediaType.TEXT_PLAIN;
+        } else if (response.startsWith("<")) {
+            return MediaType.TEXT_XML;
+        } else {
+            return MediaType.TEXT_PLAIN;
+        }
+    }
+
+    private boolean checkForceJsonRepsonse(String urlToRead,
+            Map<String, String> headers) throws Exception {
+        for (int i = 0; i < FORCE_JSON_RESPONSE.length; i++) {
+            if (urlToRead.contains(FORCE_JSON_RESPONSE[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private Map<String, String> getHeaders(HttpHeaders headers) {
+        MultivaluedMap<String, String> requestHeaders = headers
+                .getRequestHeaders();
+        Set<Entry<String, List<String>>> headerEntrySet = requestHeaders
+                .entrySet();
+        HashMap<String, String> headersMap = new HashMap<String, String>();
+        for (Entry<String, List<String>> headerEntry : headerEntrySet) {
+            String key = headerEntry.getKey();
+            List<String> values = headerEntry.getValue();
+            headersMap.put(key, strJoin(values, ","));
+        }
+        return headersMap;
+    }
+
+    // TODO use one of libraries.
+    private String strJoin(List<String> strings, String separator) {
+
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0, il = strings.size(); i < il; i++) {
+            if (i > 0) {
+                stringBuilder.append(separator);
+            }
+            stringBuilder.append(strings.get(i));
+        }
+        return stringBuilder.toString();
+    }
+
+}
diff --git a/falcon-ambari-view/src/main/lib/ambari-views-2.4.0.0.1019.jar b/falcon-ambari-view/src/main/lib/ambari-views-2.4.0.0.1019.jar
new file mode 100644
index 0000000..6865744
--- /dev/null
+++ b/falcon-ambari-view/src/main/lib/ambari-views-2.4.0.0.1019.jar
Binary files differ
diff --git a/falcon-ambari-view/src/main/resources/WEB-INF/web.xml b/falcon-ambari-view/src/main/resources/WEB-INF/web.xml
new file mode 100644
index 0000000..aad4c20
--- /dev/null
+++ b/falcon-ambari-view/src/main/resources/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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. Kerberos, LDAP, Custom. Binary/Htt
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1">
+</web-app>
\ No newline at end of file
diff --git a/falcon-ambari-view/src/main/resources/view.xml b/falcon-ambari-view/src/main/resources/view.xml
new file mode 100644
index 0000000..1a8d914
--- /dev/null
+++ b/falcon-ambari-view/src/main/resources/view.xml
@@ -0,0 +1,39 @@
+<!--
+   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.
+-->
+<view>
+  <name>Falcon</name>
+  <label>Falcon View</label>
+  <version>1.1.0</version>
+  <build>${env.BUILD_NUMBER}</build>
+  <resource>
+    <name>proxy</name>
+    <service-class>org.apache.falcon.ambari.view.FalconProxyImpersonator</service-class>
+  </resource>
+  <parameter>
+    <name>falcon.service.uri</name>
+    <description>The URI to which the falcon services will route. Default: "http://sandbox.hortonworks.com:15000"</description>
+    <required>false</required>
+    <cluster-config>fake</cluster-config>
+  </parameter>
+    <parameter>
+    <name>falcon.authentication.type</name>
+    <description>Authentication Type(simple|kerberos)</description>
+    <required>false</required>
+    <default-value>simple</default-value>
+    <cluster-config>falcon_startup.properties/falcon.authentication.type</cluster-config>
+  </parameter>
+</view>
diff --git a/falcon-ambari-view/src/test/java/org/apache/falcon/ambari/view/FalconProxyImpersonatorTest.java b/falcon-ambari-view/src/test/java/org/apache/falcon/ambari/view/FalconProxyImpersonatorTest.java
new file mode 100644
index 0000000..e01fed5
--- /dev/null
+++ b/falcon-ambari-view/src/test/java/org/apache/falcon/ambari/view/FalconProxyImpersonatorTest.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.falcon.ambari.view;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+
+import org.apache.ambari.view.ViewContext;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+/**
+ * This is a class used to test FalconProxyImpersonator to bridge the communication between the falcon-ui
+ * and the falcon API executing inside ambari.
+ */
+public class FalconProxyImpersonatorTest {
+
+    private ViewContext viewContext;
+    private HttpHeaders headers;
+    private UriInfo ui;
+
+    private FalconProxyImpersonator impersonator;
+
+    @Before
+    public void setUp() throws Exception {
+        viewContext = mock(ViewContext.class);
+        headers = mock(HttpHeaders.class);
+        ui = mock(UriInfo.class);
+        impersonator = new FalconProxyImpersonator(viewContext);
+    }
+
+    @Test
+    public void testSetUser(){
+        Mockito.when(viewContext.getUsername()).thenReturn("ambari-qa");
+        Response response = impersonator.setUser(headers, ui);
+        assertEquals(200, response.getStatus());
+    }
+
+}
diff --git a/falcon-ui/Gruntfile.js b/falcon-ui/Gruntfile.js
index 112ad49..2ba3343 100644
--- a/falcon-ui/Gruntfile.js
+++ b/falcon-ui/Gruntfile.js
@@ -24,7 +24,7 @@
       copy: {
         resources: {
           cwd: 'app',
-          src: ['html/**/*.html', 'index.html', 'config/*'],
+          src: ['html/**/*.html', 'index.html', 'config/*', 'css/jquery-ui.css'],
           dest: 'dist/',
           expand: true
         },
@@ -34,6 +34,12 @@
           dest: 'dist/',
           expand: true
         },
+        webapp : {
+          cwd: 'dist',
+          src: ['**/*.*'],
+          dest: '../webapp/src/main/webapp/',
+          expand: true
+        },
 	ambariview : {
           cwd: 'dist',
           src: ['**/*.*'],
@@ -54,6 +60,7 @@
             'app/js/lib/jquery-1.11.1.min.js',
             'app/js/lib/angular.min.js',
             'app/js/lib/angular-cookies.min.js',
+            'app/js/lib/angular-ngStorage.js',
             'app/js/lib/uirouter.min.js',
             'app/js/lib/ui-bootstrap-tpls-0.11.0.min.js',
             'app/js/lib/d3.min.js',
@@ -65,7 +72,10 @@
             'app/js/lib/ng-tags-input.js',
             'app/js/lib/popover.js',
             'app/js/lib/ng-mask.min.js',
-            'app/js/lib/dagre.min.js'
+            'app/js/lib/dagre.min.js',
+			'app/js/lib/focusIf.min.js',
+            'app/js/lib/jquery.mask.min.js',
+			'app/js/lib/jquery-ui.min.js'
             //'app/js/lib/bootstrap.notify.js'
           ],
           dest: 'dist/js/vendor.min.js'
@@ -151,7 +161,10 @@
             ieCompat: false
           },
           files: {
-            'dist/css/main.css': 'app/css/main.less'
+            'dist/css/dark-theme.css': 'app/css/main.less',
+            'dist/css/white-theme.css': 'app/css/white-theme.less',
+            'dist/css/gray-theme.css': 'app/css/gray-theme.less',
+			'dist/css/default-theme.css': 'app/css/default-theme.less'
           }
         }
       },
diff --git a/falcon-ui/Installation-steps.txt b/falcon-ui/Installation-steps.txt
index 3f9968d..d4d3fb5 100644
--- a/falcon-ui/Installation-steps.txt
+++ b/falcon-ui/Installation-steps.txt
@@ -44,4 +44,8 @@
 -------------------
 - grunt dev
 This will launch an express server with the falcon-ui to localhost:3000
-(You can test there all UI related behaviours and express will mock all falcon REST calls)
\ No newline at end of file
+(You can test there all UI related behaviours and express will mock all falcon REST calls)
+
+
+## Font/Icons
+http://web.archive.org/web/20140912210715/http://entypo.com/characters/
\ No newline at end of file
diff --git a/falcon-ui/app/css/bootstrap/less/dropdowns.less b/falcon-ui/app/css/bootstrap/less/dropdowns.less
index 3eb7fc0..aed4d90 100644
--- a/falcon-ui/app/css/bootstrap/less/dropdowns.less
+++ b/falcon-ui/app/css/bootstrap/less/dropdowns.less
@@ -33,8 +33,8 @@
   z-index: @zindex-dropdown;
   display: none; // none by default, but block on "open" of the menu
   float: left;
-  min-width: 160px;
-  padding: 5px 0;
+  min-width: 60px;
+  padding: 0px 0;
   margin: 2px 0 0; // override default ul
   list-style: none;
   font-size: @font-size-base;
@@ -213,3 +213,7 @@
   }
 }
 
+.dropdown-submenu {
+  list-style: none;
+  padding: 0 0 0 10px;
+}
diff --git a/falcon-ui/app/css/bootstrap/less/forms.less b/falcon-ui/app/css/bootstrap/less/forms.less
index 2c5e9bf..6c4c6bb 100644
--- a/falcon-ui/app/css/bootstrap/less/forms.less
+++ b/falcon-ui/app/css/bootstrap/less/forms.less
@@ -51,8 +51,7 @@
 // Position radios and checkboxes better
 input[type="radio"],
 input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9; // IE8-9
+  vertical-align: middle;
   line-height: normal;
 }
 
diff --git a/falcon-ui/app/css/bootstrap/less/pagination.less b/falcon-ui/app/css/bootstrap/less/pagination.less
index b2856ae..9bcd05b 100644
--- a/falcon-ui/app/css/bootstrap/less/pagination.less
+++ b/falcon-ui/app/css/bootstrap/less/pagination.less
@@ -4,7 +4,7 @@
 .pagination {
   display: inline-block;
   padding-left: 0;
-  margin: @line-height-computed 0;
+  margin-bottom: -5px;
   border-radius: @border-radius-base;
 
   > li {
diff --git a/falcon-ui/app/css/bootstrap/less/responsive-utilities.less b/falcon-ui/app/css/bootstrap/less/responsive-utilities.less
index b1db31d..1862e71 100644
--- a/falcon-ui/app/css/bootstrap/less/responsive-utilities.less
+++ b/falcon-ui/app/css/bootstrap/less/responsive-utilities.less
@@ -126,7 +126,7 @@
   }
 }
 .visible-lg-inline-block {
-  @media (min-width: @screen-lg-min) {
+  @media (min-width: @screen-xs-min) {
     display: inline-block !important;
   }
 }
diff --git a/falcon-ui/app/css/bootstrap/less/tables.less b/falcon-ui/app/css/bootstrap/less/tables.less
index 2e1ef33..76b51de 100644
--- a/falcon-ui/app/css/bootstrap/less/tables.less
+++ b/falcon-ui/app/css/bootstrap/less/tables.less
@@ -26,7 +26,7 @@
       > td {
         padding: @table-cell-padding;
         line-height: @line-height-base;
-        vertical-align: top;
+        vertical-align: middle;
         border-top: 1px solid @table-border-color;
       }
     }
@@ -231,3 +231,11 @@
     }
   }
 }
+
+.evenRow {
+  background: #fff;
+}
+
+.oddRow {
+  background: #F9F9F9;
+}
diff --git a/falcon-ui/app/css/bootstrap/less/variables.less b/falcon-ui/app/css/bootstrap/less/variables.less
index 582f0f8..6298c5f 100644
--- a/falcon-ui/app/css/bootstrap/less/variables.less
+++ b/falcon-ui/app/css/bootstrap/less/variables.less
@@ -119,7 +119,7 @@
 //## Customizes the `.table` component with basic values, each used across all table variations.
 
 //** Padding for `<th>`s and `<td>`s.
-@table-cell-padding:            8px;
+@table-cell-padding:            5px;
 //** Padding for cells in `.table-condensed`.
 @table-condensed-cell-padding:  5px;
 
@@ -842,5 +842,3 @@
 @dl-horizontal-offset:        @component-offset-horizontal;
 //** Horizontal line color.
 @hr-border:                   @gray-lighter;
-
-
diff --git a/falcon-ui/app/css/default-theme.less b/falcon-ui/app/css/default-theme.less
new file mode 100644
index 0000000..e2e3117
--- /dev/null
+++ b/falcon-ui/app/css/default-theme.less
@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+// Core variables and mixins
+@import "main.less";
+@import "styles/default.less";
diff --git a/falcon-ui/app/css/fonts/entypo.less b/falcon-ui/app/css/fonts/entypo.less
index 3b90398..cd67f6a 100644
--- a/falcon-ui/app/css/fonts/entypo.less
+++ b/falcon-ui/app/css/fonts/entypo.less
@@ -46,6 +46,10 @@
   line-height: 0;
 }
 
+.entypo-align-sub {
+  vertical-align: sub;
+}
+
 .entypo-social {
   font-family: 'EntypoSocialRegular';
   font-size: 2em;
@@ -1187,4 +1191,4 @@
 
 .entypo-social.smashing:before {
   content: '\F357';
-}
\ No newline at end of file
+}
diff --git a/falcon-ui/app/css/gray-theme.less b/falcon-ui/app/css/gray-theme.less
new file mode 100644
index 0000000..5f6ec7e
--- /dev/null
+++ b/falcon-ui/app/css/gray-theme.less
@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+// Core variables and mixins
+@import "main.less";
+@import "styles/gray.less";
diff --git a/falcon-ui/app/css/img/32x32_create-entity-hover.png b/falcon-ui/app/css/img/32x32_create-entity-hover.png
new file mode 100755
index 0000000..32361ae
--- /dev/null
+++ b/falcon-ui/app/css/img/32x32_create-entity-hover.png
Binary files differ
diff --git a/falcon-ui/app/css/img/32x32_create-entity.png b/falcon-ui/app/css/img/32x32_create-entity.png
new file mode 100755
index 0000000..30e6f65
--- /dev/null
+++ b/falcon-ui/app/css/img/32x32_create-entity.png
Binary files differ
diff --git a/falcon-ui/app/css/img/32x32_upload.png b/falcon-ui/app/css/img/32x32_upload.png
new file mode 100755
index 0000000..d18c2df
--- /dev/null
+++ b/falcon-ui/app/css/img/32x32_upload.png
Binary files differ
diff --git a/falcon-ui/app/css/img/cloud.png b/falcon-ui/app/css/img/cloud.png
new file mode 100644
index 0000000..1cb0075
--- /dev/null
+++ b/falcon-ui/app/css/img/cloud.png
Binary files differ
diff --git a/falcon-ui/app/css/img/falcon-logo.jpg b/falcon-ui/app/css/img/falcon-logo.jpg
new file mode 100755
index 0000000..3eadaa6
--- /dev/null
+++ b/falcon-ui/app/css/img/falcon-logo.jpg
Binary files differ
diff --git a/falcon-ui/app/css/img/falcon.png b/falcon-ui/app/css/img/falcon.png
deleted file mode 100644
index f0e6934..0000000
--- a/falcon-ui/app/css/img/falcon.png
+++ /dev/null
Binary files differ
diff --git a/falcon-ui/app/css/img/feed.png b/falcon-ui/app/css/img/feed.png
new file mode 100644
index 0000000..b6e9836
--- /dev/null
+++ b/falcon-ui/app/css/img/feed.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-bg_glass_55_fbf9ee_1x400.png b/falcon-ui/app/css/img/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644
index 0000000..f2811e5
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-bg_glass_55_fbf9ee_1x400.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-bg_glass_65_ffffff_1x400.png b/falcon-ui/app/css/img/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 0000000..c2c7126
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-bg_glass_75_dadada_1x400.png b/falcon-ui/app/css/img/ui-bg_glass_75_dadada_1x400.png
new file mode 100644
index 0000000..a1d1e14
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-bg_glass_75_dadada_1x400.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-bg_glass_75_e6e6e6_1x400.png b/falcon-ui/app/css/img/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 0000000..af8a90c
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-bg_glass_75_e6e6e6_1x400.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-bg_glass_95_fef1ec_1x400.png b/falcon-ui/app/css/img/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 0000000..078e793
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-bg_glass_95_fef1ec_1x400.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-bg_highlight-soft_75_cccccc_1x100.png b/falcon-ui/app/css/img/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644
index 0000000..88d1855
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-bg_highlight-soft_75_cccccc_1x100.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-icons_222222_256x240.png b/falcon-ui/app/css/img/ui-icons_222222_256x240.png
new file mode 100644
index 0000000..e9c8e16
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-icons_222222_256x240.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-icons_2e83ff_256x240.png b/falcon-ui/app/css/img/ui-icons_2e83ff_256x240.png
new file mode 100644
index 0000000..f2bf838
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-icons_2e83ff_256x240.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-icons_454545_256x240.png b/falcon-ui/app/css/img/ui-icons_454545_256x240.png
new file mode 100644
index 0000000..d6169e8
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-icons_454545_256x240.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-icons_888888_256x240.png b/falcon-ui/app/css/img/ui-icons_888888_256x240.png
new file mode 100644
index 0000000..d3e6e02
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-icons_888888_256x240.png
Binary files differ
diff --git a/falcon-ui/app/css/img/ui-icons_cd0a0a_256x240.png b/falcon-ui/app/css/img/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 0000000..4937018
--- /dev/null
+++ b/falcon-ui/app/css/img/ui-icons_cd0a0a_256x240.png
Binary files differ
diff --git a/falcon-ui/app/css/img/user.svg b/falcon-ui/app/css/img/user.svg
index fb534c2..60ac6c5 100644
--- a/falcon-ui/app/css/img/user.svg
+++ b/falcon-ui/app/css/img/user.svg
@@ -1,20 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!--
-   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.
-  -->
 <!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 <svg version="1.1" id="User" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
diff --git a/falcon-ui/app/css/jquery-ui.css b/falcon-ui/app/css/jquery-ui.css
new file mode 100644
index 0000000..826c967
--- /dev/null
+++ b/falcon-ui/app/css/jquery-ui.css
@@ -0,0 +1,1225 @@
+/*! jQuery UI - v1.11.4 - 2015-03-11
+* http://jqueryui.com
+* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+	display: none;
+}
+.ui-helper-hidden-accessible {
+	border: 0;
+	clip: rect(0 0 0 0);
+	height: 1px;
+	margin: -1px;
+	overflow: hidden;
+	padding: 0;
+	position: absolute;
+	width: 1px;
+}
+.ui-helper-reset {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	outline: 0;
+	line-height: 1.3;
+	text-decoration: none;
+	font-size: 100%;
+	list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+	content: "";
+	display: table;
+	border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+	clear: both;
+}
+.ui-helper-clearfix {
+	min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+	width: 100%;
+	height: 100%;
+	top: 0;
+	left: 0;
+	position: absolute;
+	opacity: 0;
+	filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+	z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+	cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	display: block;
+	text-indent: -99999px;
+	overflow: hidden;
+	background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.ui-accordion .ui-accordion-header {
+	display: block;
+	cursor: pointer;
+	position: relative;
+	margin: 2px 0 0 0;
+	padding: .5em .5em .5em .7em;
+	min-height: 0; /* support: IE7 */
+	font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+	position: absolute;
+	left: .5em;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+	padding: 1em 2.2em;
+	border-top: 0;
+	overflow: auto;
+}
+.ui-autocomplete {
+	position: absolute;
+	top: 0;
+	left: 0;
+	cursor: default;
+}
+.ui-button {
+	display: inline-block;
+	position: relative;
+	padding: 0;
+	line-height: normal;
+	margin-right: .1em;
+	cursor: pointer;
+	vertical-align: middle;
+	text-align: center;
+	overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+	text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+	width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+	width: 2.4em;
+}
+.ui-button-icons-only {
+	width: 3.4em;
+}
+button.ui-button-icons-only {
+	width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+	display: block;
+	line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+	padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+	padding: .4em;
+	text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+	padding-left: 2.1em;
+	padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+	padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+	position: absolute;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+	left: 50%;
+	margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+	left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+	right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+	margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+	margin-left: 0;
+	margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+	border: 0;
+	padding: 0;
+}
+.ui-datepicker {
+	width: 17em;
+	padding: .2em .2em 0;
+	display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+	position: relative;
+	padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+	position: absolute;
+	top: 2px;
+	width: 1.8em;
+	height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+	top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+	left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+	right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+	left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+	right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+	display: block;
+	position: absolute;
+	left: 50%;
+	margin-left: -8px;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+	margin: 0 2.3em;
+	line-height: 1.8em;
+	text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+	font-size: 1em;
+	margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+	width: 45%;
+}
+.ui-datepicker table {
+	width: 100%;
+	font-size: .9em;
+	border-collapse: collapse;
+	margin: 0 0 .4em;
+}
+.ui-datepicker th {
+	padding: .7em .3em;
+	text-align: center;
+	font-weight: bold;
+	border: 0;
+}
+.ui-datepicker td {
+	border: 0;
+	padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+	display: block;
+	padding: .2em;
+	text-align: right;
+	text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+	background-image: none;
+	margin: .7em 0 0 0;
+	padding: 0 .2em;
+	border-left: 0;
+	border-right: 0;
+	border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+	float: right;
+	margin: .5em .2em .4em;
+	cursor: pointer;
+	padding: .2em .6em .3em .6em;
+	width: auto;
+	overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+	float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+	width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+	float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+	width: 95%;
+	margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+	width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+	width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+	width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+	border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+	clear: left;
+}
+.ui-datepicker-row-break {
+	clear: both;
+	width: 100%;
+	font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+	direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+	right: 2px;
+	left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+	left: 2px;
+	right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+	right: 1px;
+	left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+	left: 1px;
+	right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+	clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+	float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+	float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+	border-right-width: 0;
+	border-left-width: 1px;
+}
+.ui-dialog {
+	overflow: hidden;
+	position: absolute;
+	top: 0;
+	left: 0;
+	padding: .2em;
+	outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+	padding: .4em 1em;
+	position: relative;
+}
+.ui-dialog .ui-dialog-title {
+	float: left;
+	margin: .1em 0;
+	white-space: nowrap;
+	width: 90%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+	position: absolute;
+	right: .3em;
+	top: 50%;
+	width: 20px;
+	margin: -10px 0 0 0;
+	padding: 1px;
+	height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+	position: relative;
+	border: 0;
+	padding: .5em 1em;
+	background: none;
+	overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+	text-align: left;
+	border-width: 1px 0 0 0;
+	background-image: none;
+	margin-top: .5em;
+	padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+	float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+	margin: .5em .4em .5em 0;
+	cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+	width: 12px;
+	height: 12px;
+	right: -5px;
+	bottom: -5px;
+	background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+	cursor: move;
+}
+.ui-draggable-handle {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-menu {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+	display: block;
+	outline: none;
+}
+.ui-menu .ui-menu {
+	position: absolute;
+}
+.ui-menu .ui-menu-item {
+	position: relative;
+	margin: 0;
+	padding: 3px 1em 3px .4em;
+	cursor: pointer;
+	min-height: 0; /* support: IE7 */
+	/* support: IE10, see #8844 */
+	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+	margin: 5px 0;
+	height: 0;
+	font-size: 0;
+	line-height: 0;
+	border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+	margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+	position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+	padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: .2em;
+	margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+	left: auto;
+	right: 0;
+}
+.ui-progressbar {
+	height: 2em;
+	text-align: left;
+	overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+	margin: -1px;
+	height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+	height: 100%;
+	filter: alpha(opacity=25); /* support: IE8 */
+	opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+	background-image: none;
+}
+.ui-resizable {
+	position: relative;
+}
+.ui-resizable-handle {
+	position: absolute;
+	font-size: 0.1px;
+	display: block;
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+	display: none;
+}
+.ui-resizable-n {
+	cursor: n-resize;
+	height: 7px;
+	width: 100%;
+	top: -5px;
+	left: 0;
+}
+.ui-resizable-s {
+	cursor: s-resize;
+	height: 7px;
+	width: 100%;
+	bottom: -5px;
+	left: 0;
+}
+.ui-resizable-e {
+	cursor: e-resize;
+	width: 7px;
+	right: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-w {
+	cursor: w-resize;
+	width: 7px;
+	left: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-se {
+	cursor: se-resize;
+	width: 12px;
+	height: 12px;
+	right: 1px;
+	bottom: 1px;
+}
+.ui-resizable-sw {
+	cursor: sw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	bottom: -5px;
+}
+.ui-resizable-nw {
+	cursor: nw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	top: -5px;
+}
+.ui-resizable-ne {
+	cursor: ne-resize;
+	width: 9px;
+	height: 9px;
+	right: -5px;
+	top: -5px;
+}
+.ui-selectable {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-selectable-helper {
+	position: absolute;
+	z-index: 100;
+	border: 1px dotted black;
+}
+.ui-selectmenu-menu {
+	padding: 0;
+	margin: 0;
+	position: absolute;
+	top: 0;
+	left: 0;
+	display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+	overflow: auto;
+	/* Support: IE7 */
+	overflow-x: hidden;
+	padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+	font-size: 1em;
+	font-weight: bold;
+	line-height: 1.5;
+	padding: 2px 0.4em;
+	margin: 0.5em 0 0 0;
+	height: auto;
+	border: 0;
+}
+.ui-selectmenu-open {
+	display: block;
+}
+.ui-selectmenu-button {
+	display: inline-block;
+	overflow: hidden;
+	position: relative;
+	text-decoration: none;
+	cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+	right: 0.5em;
+	left: auto;
+	margin-top: -8px;
+	position: absolute;
+	top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+	text-align: left;
+	padding: 0.4em 2.1em 0.4em 1em;
+	display: block;
+	line-height: 1.4;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+.ui-slider {
+	position: relative;
+	text-align: left;
+}
+.ui-slider .ui-slider-handle {
+	position: absolute;
+	z-index: 2;
+	width: 1.2em;
+	height: 1.2em;
+	cursor: default;
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-slider .ui-slider-range {
+	position: absolute;
+	z-index: 1;
+	font-size: .7em;
+	display: block;
+	border: 0;
+	background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+	filter: inherit;
+}
+
+.ui-slider-horizontal {
+	height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+	top: -.3em;
+	margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+	top: 0;
+	height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+	left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+	right: 0;
+}
+
+.ui-slider-vertical {
+	width: .8em;
+	height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+	left: -.3em;
+	margin-left: 0;
+	margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+	left: 0;
+	width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+	bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+	top: 0;
+}
+.ui-sortable-handle {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-spinner {
+	position: relative;
+	display: inline-block;
+	overflow: hidden;
+	padding: 0;
+	vertical-align: middle;
+}
+.ui-spinner-input {
+	border: none;
+	background: none;
+	color: inherit;
+	padding: 0;
+	margin: .2em 0;
+	vertical-align: middle;
+	margin-left: .4em;
+	margin-right: 22px;
+}
+.ui-spinner-button {
+	width: 16px;
+	height: 50%;
+	font-size: .5em;
+	padding: 0;
+	margin: 0;
+	text-align: center;
+	position: absolute;
+	cursor: default;
+	display: block;
+	overflow: hidden;
+	right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+	border-top: none;
+	border-bottom: none;
+	border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+	position: absolute;
+	margin-top: -8px;
+	top: 50%;
+	left: 0;
+}
+.ui-spinner-up {
+	top: 0;
+}
+.ui-spinner-down {
+	bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+	/* need to fix icons sprite */
+	background-position: -65px -16px;
+}
+.ui-tabs {
+	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+	padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+	margin: 0;
+	padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+	list-style: none;
+	float: left;
+	position: relative;
+	top: 0;
+	margin: 1px .2em 0 0;
+	border-bottom-width: 0;
+	padding: 0;
+	white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+	float: left;
+	padding: .5em 1em;
+	text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+	margin-bottom: -1px;
+	padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+	cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+	cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+	display: block;
+	border-width: 0;
+	padding: 1em 1.4em;
+	background: none;
+}
+.ui-tooltip {
+	padding: 8px;
+	position: absolute;
+	z-index: 9999;
+	max-width: 300px;
+	-webkit-box-shadow: 0 0 5px #aaa;
+	box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+	border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+	font-family: Verdana,Arial,sans-serif;
+	font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+	font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+	font-family: Verdana,Arial,sans-serif;
+	font-size: 1em;
+}
+.ui-widget-content {
+	border: 1px solid #aaaaaa;
+	background: #ffffff url("img/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
+	color: #222222;
+}
+.ui-widget-content a {
+	color: #222222;
+}
+.ui-widget-header {
+	border: 1px solid #aaaaaa;
+	background: #cccccc url("img/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
+	color: #222222;
+	font-weight: bold;
+}
+.ui-widget-header a {
+	color: #222222;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+	border: 1px solid #d3d3d3;
+	background: #e6e6e6 url("img/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
+	font-weight: normal;
+	color: #555555;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+	color: #555555;
+	text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+	border: 1px solid #999999;
+	background: #dadada url("img/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
+	font-weight: normal;
+	color: #212121;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+	color: #212121;
+	text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+	border: 1px solid #aaaaaa;
+	background: #ffffff url("img/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
+	font-weight: normal;
+	color: #212121;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+	color: #212121;
+	text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+	border: 1px solid #fcefa1;
+	background: #fbf9ee url("img/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
+	color: #363636;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+	color: #363636;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+	border: 1px solid #cd0a0a;
+	background: #fef1ec url("img/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
+	color: #cd0a0a;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+	color: #cd0a0a;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+	color: #cd0a0a;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+	font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+	opacity: .7;
+	filter:Alpha(Opacity=70); /* support: IE8 */
+	font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+	opacity: .35;
+	filter:Alpha(Opacity=35); /* support: IE8 */
+	background-image: none;
+}
+.ui-state-disabled .ui-icon {
+	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	width: 16px;
+	height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+	background-image: url("img/ui-icons_222222_256x240.png");
+}
+.ui-widget-header .ui-icon {
+	background-image: url("img/ui-icons_222222_256x240.png");
+}
+.ui-state-default .ui-icon {
+	background-image: url("img/ui-icons_888888_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+	background-image: url("img/ui-icons_454545_256x240.png");
+}
+.ui-state-active .ui-icon {
+	background-image: url("img/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+	background-image: url("img/ui-icons_2e83ff_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+	background-image: url("img/ui-icons_cd0a0a_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+	border-top-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+	border-top-right-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+	border-bottom-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+	border-bottom-right-radius: 4px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+	background: #aaaaaa url("img/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+	opacity: .3;
+	filter: Alpha(Opacity=30); /* support: IE8 */
+}
+.ui-widget-shadow {
+	margin: -8px 0 0 -8px;
+	padding: 8px;
+	background: #aaaaaa url("img/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+	opacity: .3;
+	filter: Alpha(Opacity=30); /* support: IE8 */
+	border-radius: 8px;
+}
diff --git a/falcon-ui/app/css/main.less b/falcon-ui/app/css/main.less
index 3bb7393..8ccfbad 100644
--- a/falcon-ui/app/css/main.less
+++ b/falcon-ui/app/css/main.less
@@ -73,6 +73,8 @@
 //custom styles for the page
 @import "styles/mixins.less";
 @import "styles/common.less";
+@import "styles/ng-tags-input.less";
+//@import "styles/ng-tags-input.bootstrap.less";
 @import "styles/nav-header.less";
 @import "styles/entity-summary.less";
 @import "styles/entities-list.less";
@@ -81,6 +83,10 @@
 @import "styles/server-messages.less";
 @import "styles/chart.less";
 @import "styles/dataset-form.less";
+@import "styles/snapshot-form.less";
+@import "styles/feed-form.less";
+@import "styles/datasource-form.less";
 @import "styles/popover.less";
 @import "styles/animate.less";
+@import "styles/lineage.less";
 @import "styles/autocomplete-tags.less";
\ No newline at end of file
diff --git a/falcon-ui/app/css/styles/autocomplete-tags.less b/falcon-ui/app/css/styles/autocomplete-tags.less
index 4c6fc96..c2f5dc2 100644
--- a/falcon-ui/app/css/styles/autocomplete-tags.less
+++ b/falcon-ui/app/css/styles/autocomplete-tags.less
@@ -1,21 +1,3 @@
-/**
- * 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.
- */
-
 .top-buffer{
   padding-top:20px;
 }
@@ -85,4 +67,4 @@
 }
 .suggestions-list:focus{
   outline:none;
-}
+}
\ No newline at end of file
diff --git a/falcon-ui/app/css/styles/common.less b/falcon-ui/app/css/styles/common.less
index 1ce62f7..17552a8 100644
--- a/falcon-ui/app/css/styles/common.less
+++ b/falcon-ui/app/css/styles/common.less
@@ -20,7 +20,7 @@
   display: none !important;
 }
 html, body { height: 100%; }
-body { background-color: rgba(246, 246, 246, 1); }
+body { background-color: @body-bg; }
 
 .color-success{
   color: #3c763d !important;
@@ -34,9 +34,6 @@
 .color-danger{
   color: #a94442 !important;
 }
-.error{
-  color: #ff3333 !important;
-}
 
 //--------------------VALIDATION---------------------//
 @shadow-valid: rgba(0, 255, 0, .6);
@@ -125,7 +122,7 @@
     input[type="radio"] {
       border-width: 0;
       box-shadow: unset!important;
-      vertical-align: bottom;
+      vertical-align: middle;
     }
   }
   .validationMessageGral {
@@ -154,9 +151,7 @@
 }
 //------nameCheck ------------------//
 .nameInputDisplay {
-  position: absolute;
-  top:27px;
-  right:10px;
+  /*position: absolute;*/
   z-index:2;
 }
 //----------------mozilla outline hack-------------------//
@@ -167,24 +162,24 @@
 //-------------------------------------------------------//
 .mainUIView {
   //padding: 10px 0 30px 0;
-  padding-top: 10px;
+  /*padding-top: 10px;*/
   padding-bottom: 30px;
 }
 //-----------------------------------------//
 //----------------FILE UPLOAD---------------------//
 .btn-file {
   cursor: pointer;
-  position: relative;
-  overflow: hidden;
+  /*position: relative;
+  overflow: hidden;*/
   // margin: 40px 0 40px 30px;
 }
 .btn-file input[type=file] {
   position: absolute;
   top: 0;
-  right: 0;
-  min-width: 100%;
-  min-height: 100%;
-  font-size: 100px;
+  /*right: 0;*/
+  width: 32px;
+  height: 32px;
+  /*font-size: 100px;*/
   text-align: right;
   filter: alpha(opacity=0);
   opacity: 0;
@@ -220,7 +215,7 @@
   padding: 0;
 }
 .dynamic-table-spacer {
-  margin-top: 5px;
+  margin-bottom: 5px;
 }
 .buttonsWrapper {
   text-align: center;
@@ -269,7 +264,7 @@
   }
 }
 
-@keyframes blink-success {
+/*@keyframes blink-success {
   0% { color: @summarySuccess; }
   100% { color: black; }
 }
@@ -323,6 +318,22 @@
   -webkit-animation: blink-notification 1s linear infinite;
   -moz-animation: blink-notification 1s linear infinite;
   animation: blink-notification 1s linear infinite;
+}*/
+
+.blink-success {
+  color: @green-light;
+}
+
+.blink-warning {
+  color: @summaryWarning;
+}
+
+.blink-danger {
+  color: @summaryWarning;
+}
+
+.blink-notification {
+  color: #ffff00;
 }
 
 .text-success {
@@ -342,16 +353,26 @@
 .border-right{
   border-right: 2px solid @gray-lighter;
 }
-
+.pt15px {
+	padding-top:15px;
+}
+.border0px {
+	border: 0px;
+}
+.border1px {
+	border: 1px solid #666666;
+}
+.p10px {
+	padding : 10px;
+}
 .summaryBox {
-  border-radius: 5px;
-  border: 1px solid @gray-light2;
-  margin: 5px 0;
-  padding: 15px 5px;
+  border: 1px solid @detail-border-color;
+  padding: 15px 5px 8px;
   font-size: 12px;
-  background-color: #ffffff;
+  color: @detail-color;
+  background-color: transparent;
   h4 {
-    font-weight: bold;
+    /*font-weight: bold;*/
     margin:5px 0;
   }
   h5 {
@@ -370,7 +391,7 @@
   textarea {
     width: 100%;
   }
-  &.processCluster {
+  /*&.processCluster {
     padding: 15px 4%;
     margin: 5px auto;
     h5 {
@@ -379,13 +400,19 @@
         margin-top:0;
       }
     }
-  }
+  }*/
   .detailsBox{
     margin-left: 10px;
   }
+  .light {
+    font-weight: normal;
+  }
 }
 
 /*************************************** SEARCH **************************************/
+@searchIconTop:  8px;
+@searchFontSize:  13px;
+
 .search {
   height: 45px;
   font-weight: 400;
@@ -395,7 +422,8 @@
 }
 
 .searchBoxContainer{
-  margin: 25px 0;
+  padding-top: 4px;
+  /*margin: 10px -5px;*/
   .popover{
     right: 5px !important;
     width: 400px;
@@ -408,55 +436,56 @@
 .search-icon {
   cursor: pointer;
   position: absolute;
-  top: 13px;
-  left: 13px;
-  z-index: 2;
+  top: @searchIconTop;
+  right: 44px;
+  /*z-index: 2;*/
   display: block;
   line-height: 23px;
   text-align: center;
-  font-size: 26px;
-  color: #777;
+  font-size: @searchFontSize;
+  color: @search-icon-color;
 }
 
 .search-loading-icon {
   cursor: pointer;
   position: absolute;
-  top: 15px;
-  left: 15px;
+  background: transparent;
+  top: @searchIconTop;
+  right: 48px;
   z-index: 2;
   display: block;
   line-height: 23px;
   text-align: center;
-  font-size: 26px;
-  color: #777;
-  margin-right: 40px;
+  font-size: @searchFontSize;
+  color: @search-icon-color;
+  width: 23px;
 }
 
 .remove-icon {
   cursor: pointer;
   position: absolute;
-  top: 13px;
-  right: 14px;
+  top: @searchIconTop;
+  right: 64px;
 //  z-index: 2;
   display: block;
   line-height: 23px;
   text-align: center;
-  font-size: 26px;
-  color: #777;
+  font-size: @searchFontSize;
+  color: @search-icon-color;
 }
 
 .question-icon {
   cursor: pointer;
   position: absolute;
-  top: 13px;
-  right: 40px;
+  top: @searchIconTop;
+  right: 9px;
 //  z-index: 2;
   display: block;
   line-height: 23px;
   text-align: center;
-  font-size: 26px;
-  color: #777;
-  margin-right: 5px;
+  font-size: @searchFontSize;
+  color: @search-icon-color;
+  margin-right: 15px;
 }
 
 .searchBox {
@@ -491,150 +520,15 @@
   }
 }
 
-tags-input {
-  display: block;
-  height: 40px;
-}
-tags-input *, tags-input *:before, tags-input *:after {
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-tags-input .host {
-  position: relative;
-  margin-top: 5px;
-  margin-bottom: 5px;
-  height: 100%;
-}
-tags-input .host:active {
-  outline: none;
-}
-
-tags-input .tags {
-  -moz-appearance: textfield;
-  -webkit-appearance: textfield;
-  padding: 1px;
-  overflow: hidden;
-  word-wrap: break-word;
-  cursor: text;
-  background-color: white;
-//  border: 1px solid darkgray;
-//  box-shadow: 1px 1px 1px 0 lightgray inset;
-  height: 100%;
-  padding-left: 40px;
-}
-tags-input .tags.focused {
-  outline: none;
-  -webkit-box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6);
-  -moz-box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6);
-  box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6);
-}
-tags-input .tags .tag-list {
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-}
-tags-input .tags .tag-item {
-  margin: 3px;
-  padding: 3px;
-  display: inline-block;
-  float: left;
-  font: 18px cabin, Arial, sans-serif;
-  height: 32px;
-  line-height: 25px;
-  border: 1px solid #acacac;
-  border-radius: 3px;
-  background: -webkit-linear-gradient(top, #ede4e4 0%, #d5cccc 47%, #bcb2b2 100%);
-  background: linear-gradient(to bottom, #ede4e4 0%, #d5cccc 47%, #bcb2b2 100%);
-}
-tags-input .tags .tag-item.selected {
-  background: -webkit-linear-gradient(top, #febbbb 0%, #fe9090 45%, #ff5c5c 100%);
-  background: linear-gradient(to bottom, #febbbb 0%, #fe9090 45%, #ff5c5c 100%);
-}
-tags-input .tags .tag-item .remove-button {
-  margin: 0 0 0 5px;
-  padding: 0;
-  border: none;
-  background: none;
-  cursor: pointer;
-  vertical-align: middle;
-  font: bold 18px cabin, Arial, sans-serif;
-  color: #585858;
-}
-tags-input .tags .tag-item .remove-button:active {
-  color: red;
-}
-tags-input .tags .input {
-  border: 0;
-  outline: none;
-  margin: 2px;
-  padding: 0;
-  padding-left: 5px;
-  float: left;
-  height: 32px;
-  font: 18px cabin, Arial, sans-serif;
-}
-tags-input .tags .input.invalid-tag {
-  color: red;
-}
-tags-input .tags .input::-ms-clear {
-  display: none;
-}
-tags-input.ng-invalid .tags {
-  -webkit-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
-  -moz-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
-  box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
-}
-
-tags-input .autocomplete {
-  margin-top: 5px;
-  position: absolute;
-  padding: 5px 0;
-  z-index: 999;
-  width: 100%;
-  background-color: white;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-}
-tags-input .autocomplete .suggestion-list {
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-}
-tags-input .autocomplete .suggestion-item {
-  padding: 5px 10px;
-  cursor: pointer;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  font: 16px cabin, Arial, sans-serif;
-  color: black;
-  background-color: white;
-}
-tags-input .autocomplete .suggestion-item.selected {
-  color: white;
-  background-color: #0097cf;
-}
-tags-input .autocomplete .suggestion-item.selected em {
-  color: white;
-  background-color: #0097cf;
-}
-tags-input .autocomplete .suggestion-item em {
-  font: normal bold 16px cabin, Arial, sans-serif;
-  color: black;
-  background-color: white;
+.searchResultContainer {
+  background-color: @body-bg;
+  margin-top: 25px;
 }
 
 .tag-striked{
   text-decoration: line-through;
 }
 
-.pagination {
-  margin: 10px 0 5px 0;
-}
-
 .pagDisabled{
   cursor: default !important;
   background-color: #eee !important;
@@ -647,8 +541,10 @@
 .buttonsRow {
   height: 43px;
   td {
-    border-top: none;
-    border-bottom: 1px solid @gray-lighter;
+    /*border-top: none !important;*/
+    border-width: @table-header-border-width;
+    border-style: solid;
+    border-color: @table-header-border-color;
   }
   margin-bottom: 8px;
 }
@@ -670,9 +566,12 @@
 }
 
 .btn-gray {
-  color: #333;
-  background-color: #ccc;
-  border-color: #ccc;
+  color: #FFFFFF;
+  background-color: transparent;
+  border-color: transparent;
+  &:hover {
+    color: #FFFFFF;
+  }
 }
 
 .btn-big {
@@ -710,6 +609,10 @@
   padding: 0 10px;
 }
 
+.filtersSearchBox {
+  line-height: 2.3em;
+}
+
 .vertical-align {
   min-height: 5vh;
   display: -webkit-box;
@@ -727,18 +630,17 @@
 
 .dependencies-graph{
   text-align: center;
+  padding: 10px 0;
+  /*border: 1px solid @detail-border-color;*/
+  svg {
+    padding: 8px;
+  }
 }
 
 /**
   DEPENDENCIES & LINEAGE GRAPHS
 **/
 
-.node {
-  .foreignObject {
-    padding: 5px;
-  }
-}
-
 .node-name:before {
   font-family: 'Glyphicons Halflings';
   -webkit-font-smoothing: antialiased;
@@ -764,31 +666,34 @@
 }
 
 .node rect {
-  stroke-width: 0.5px;
-  stroke: #999;
-  fill: @gray-dark;
-  fill-opacity: 5%;
-  &:hover {
-    fill-opacity: 10%;
-  }
+  stroke-width: 1px;
+  stroke: @lineage-rect-stroke-color;
+  fill: @lineage-rect-fill-color;
+  fill-opacity: 20%;
 }
 
 .edge path {
   fill: none;
-  stroke: #333;
-  stroke-width: 1px;
+  stroke: @lineage-path-stroke-color;
+  stroke-width: 2px;
+}
+
+marker {
+  fill: @lineage-marker-fill-color;
 }
 
 .node-name {
-  font-size: 12px;
   vertical-align: middle;
   margin: 10px;
+  font-size: 15px;
+  padding-top: 18px;
+  color: @lineage-node-text-color;
 }
 
 .lineage-link {
   fill: none;
-  stroke: #eee;
-  stroke-width: 1.5px;
+  stroke: @lineage-path-stroke-color;
+  stroke-width: 2px;
 }
 
 .lineage-node, .lineage-href {
@@ -811,6 +716,7 @@
   font-size: 8pt;
   fill: #fff;
   word-wrap: break-word;
+  color: @lineage-node-text-color;
 }
 
 .lineage-node-feed-instance {
@@ -877,4 +783,81 @@
 
 .prettyXml{
   min-height: 800px;
-}
\ No newline at end of file
+}
+
+
+.auth
+{
+  color:#69be28;
+}
+
+.entities-tooltip-theme {
+  display: none;
+  position: absolute;
+  z-index: 100;
+  margin-top: -3px;
+}
+
+.entities-tooltip {
+  -webkit-box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+  -moz-box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+  box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+  border: solid 1px #d2d2d2;
+  border-radius: 3px;
+  box-sizing: border-box;
+  background-color: #fff;
+  padding: 5px 7px;
+  margin-left: -3px;
+  margin-top: 6px;
+  font-weight: normal;
+}
+
+.arrow-up {
+  content: "";
+  display: block;
+  width: 0;
+  height: 0;
+  border: solid 5px;
+  border-color: transparent;
+  position: absolute;
+  border-bottom-color: #d2d2d2;
+  top: -3px;
+  margin-left: 4px;
+}
+
+.arrow-up::after {
+  top: -9px;
+  margin-left: -10px;
+  content: " ";
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border: solid 10px;
+  border-color: transparent;
+  border-bottom-color: #fff;
+}
+
+.accordion-toggle {
+  text-decoration: none !important;
+}
+
+.advancedOption {
+  cursor: pointer;
+  .glyphicon {
+    top : 3px;
+  }
+}
+
+.align-top {
+  vertical-align: top !important;
+}
+
+.no-entity {
+  position: absolute;
+  margin-top:25px;
+  left:15%;
+  padding: 10px;
+  overflow: auto;
+  border: 1px solid @green-light;
+}
diff --git a/falcon-ui/app/css/styles/dataset-form.less b/falcon-ui/app/css/styles/dataset-form.less
index 1416dba..3774e1c 100644
--- a/falcon-ui/app/css/styles/dataset-form.less
+++ b/falcon-ui/app/css/styles/dataset-form.less
@@ -50,7 +50,7 @@
 .tr { text-align: right; }
 
 .pointer{ cursor: pointer; }
-.db { display: block; }
+/*.db { display: block; }*/
 
 //-----------------------------------------//
 
@@ -59,28 +59,27 @@
 
 #sourceClusterSelect, #targetClusterSelect {
   display: block;
-  margin-bottom: 8px;
 }
 #formBox {
   padding: 0 2%;
   .dateInput {
     padding-right:0!important;
   }
-  .formBoxWrapper {
+  /*.formBoxWrapper {
     width: 500px;
     margin:0 auto;
-  }
-  .locationBox {
+  }*/
+  /*.locationBox {
     label { margin:0 0 10px 0 };
-  }
+  }*/
 
-  label {
+  /*label {
     font-weight: normal;
     font-size: 11px;
     max-width: none;
 
-  }
-  input[type="text"], select {
+  }*/
+  /*input[type="text"], select {
     .p0;
     padding-left: 1px;
     font-size: 13px;
@@ -92,7 +91,7 @@
     padding-left: 1px;
     font-size: 13px;
     line-height: 15px;
-  }
+  }*/
   .tablesTextArea {
     height: 50px;
   }
@@ -100,7 +99,7 @@
     height: 97px;
   }
 
-  a {
+  /*a {
     line-height: 30px;
     cursor: pointer;
     margin: 5px 15px;
@@ -109,13 +108,13 @@
     &:focus {
       color: red;
     }
-  }
+  }*/
   h4 {
     font-size: 14px;
     font-weight: 700;
   }
 
-  .formTitol {
+  /*.formTitol {
     width: 500px;
     margin:0 auto;
     padding-top: 10px;
@@ -131,12 +130,10 @@
       margin:0;
       letter-spacing: 0.5px;
     }
-  }
+  }*/
   .tagsBox, .alertsBox {
     .btn {
-      border-radius: 5px;
       padding: 1px;
-      border-color: @gray;
       height: 25px;
       width: 65px;
       line-height: 23px;
@@ -149,7 +146,7 @@
     }
   }
 
-  .typeButtonsBox {
+  /*.typeButtonsBox {
     background-color: @gray-lighter;
     width: 264px;
     padding:5px;
@@ -164,7 +161,7 @@
         color: white;
       }
     }
-  }
+  }*/
 
   .formBoxWrapper {
     border: 1px solid @gray-lighter;
@@ -173,32 +170,36 @@
   }
 
   .clusterBox {
-    border: 1px solid @gray-light;
-    border-radius: 5px;
-    .mt20;
-    .mb10;
-    padding-top: 15px;
-    padding-bottom: 15px;
+    border-top: 1px solid #aaa;
+    padding: 10px 0px 15px;
+    margin-left: 5px;
+    margin: 35px 10px 10px 0px;
+    border-radius: 0px;
 
     h3, .runJobOnBox {
       .pa;
-      background-color: white;
-      padding: 0 5px;
+      color: inherit;
+      background-color: #FFFFFF;
+      border: 1px solid #aaa;
+      border-radius: 0px;
+      padding: 6px 6px;
     }
 
     h3 {
-      font-size: 16px;
-      font-weight: 700;
       display: inline-block;
-      top: -30px;
-
+      border: none;
+      top: -47px;
+      font-size: 13px;
     }
     .runJobOnBox {
-      width: 110px;
+      width: 111px;
       right: 5px;
-      top: -13px;
+      top: -17px;
+      input[type=radio] {
+        margin-right: 5px;
+      }
     }
-    .hiveDatabasesTitol {
+    /*.hiveDatabasesTitol {
       font-size: 12px;
       padding-left: 5px;
     }
@@ -207,9 +208,9 @@
       input {
         margin-left: 5px;
       }
-    }
+    }*/
   }
-  .alertsBox {
+  /*.alertsBox {
     .mt10;
     h4 {
       margin: 0;
@@ -245,21 +246,22 @@
         margin-right: 4px;
       }
     }
-  }
+  }*/
 
 }
 .advancedOptionsButton {
-  cursor: pointer;
-  hr {
+  /*cursor: pointer;*/
+  /*hr {
     width: 67%;
     margin-top: -7px;
     margin-bottom:0;
     margin-left: 128px;
     border-top: 1px solid @gray-dark;
-  }
+  }*/
   span.entypo {
-    float: right;
-    margin: 7px 5px;
+    color: #FFFFFF;
+    /*float: right;
+    margin: 7px 5px;*/
     font-size: 50px;
   }
 }
@@ -270,6 +272,9 @@
   &.expanded {
     max-height: 850px;
   }
+  h4 {
+    margin: 15px 0px;
+  }
   .frequencyBox {
     width: 36%;
     display: inline-block;
@@ -277,12 +282,6 @@
     input, select {
       display: inline-block;
     }
-    input {
-      width: 20px;
-    }
-    select {
-      width: 80px;
-    }
     label {
       margin:0;
     }
@@ -290,12 +289,11 @@
 
   .allocationBox {
     >div>div {
-      width: 24%;
       display: inline-block;
     }
-
   }
-  .retryBox {
+
+  /*.retryBox {
     .policyBox {
       width: 45%;
       select {
@@ -324,11 +322,37 @@
         padding-right: 20px;
       }
     }
+  }*/
+
+
+  .retryBox {
+    .policyBox {
+      select {
+        position: inherit;
+      }
+    }
+    > div {
+      label {
+        margin-top: 0px;
+        font-weight: normal;
+        width: 95%;
+        input {
+          margin-right: 10px;
+        }
+        select {
+          position: relative;
+          left: 50px;
+        }
+      }
+      display: inline-block;
+      vertical-align: top;
+    }
   }
 
   .hiveOptBox {
     label {
       display: block;
+      margin-top: 10px;
     }
   }
 }
@@ -338,18 +362,18 @@
 
 #formSummaryBox {
   font-size: 12px;
+  padding: 0 5px;
   h4 {
     margin-bottom:0;
-    font-size: 12px;
+  }
+  .locationBox {
+    margin-top: 5px !important;
   }
   h5 {
     font-size: 12px;
     font-weight: bold;
     display: inline-block;
   }
-  span {
-    font-weight: bold;
-  }
   .lightSubtitle {
     color: @gray-light;
     font-weight: bold;
@@ -363,13 +387,14 @@
     margin-top: 15px;
 
     h3 {
-      font-size: 18px;
+      font-size: 14px;
       margin-top: -25px;
       margin-left: -10px;
       padding: 0 5px;
       background-color: white;
       display: inline-block;
       position: absolute;
+      color: #777;
     }
     h4 {
       margin-top:0;
@@ -394,6 +419,7 @@
 
 //////////////////////////////
 
+/*
 #formBox {
   .progressBox {
     height: 75px;
@@ -491,4 +517,4 @@
       h6 { font-weight: bold; }
     }
   }
-}
\ No newline at end of file
+}*/
diff --git a/falcon-ui/app/css/styles/datasource-form.less b/falcon-ui/app/css/styles/datasource-form.less
new file mode 100644
index 0000000..9122855
--- /dev/null
+++ b/falcon-ui/app/css/styles/datasource-form.less
@@ -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
+ *
+ *     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.
+ */
+//----------------mozilla outline hack-------------------//
+.datasourceConnectionBox {
+  border: 1px solid #d2d2d2;
+  border-radius: 5px;
+  padding: 15px 10px 41px;
+  color: @gray-light;
+  margin-top: 25px;
+
+  h3 {
+    font-size: 14px;
+    display: inline-block;
+    top: -7px;
+    position: absolute;
+    border-radius: 2px;
+    padding: 5px 9px;
+    background-color: #fff;
+  }
+
+  span {
+    padding-left: 10px;
+  }
+}
+
+#datasourceFormGeneralStep {
+  input[type="radio"], input[type="checkbox"] {
+    margin-left: 20px;
+  }
+}
+
+.datasourceForm {
+  .btn-browse {
+    padding: 0px 12px;
+    background: #f5f5f5;
+    color: #777;
+  }
+}
+.btn-sharp {
+  border-radius: 0;
+}
+
+.datasource-link {
+  margin: 0px !important;
+  color: @green-light !important;
+  font-style: italic;
+  line-height: 26px !important;
+}
+.driver-jar-link {
+    margin: 0px !important;
+    color: @green-light !important;
+    font-style: italic;
+    line-height: 26px !important;
+}
+
+.btn-datasource {
+  font-size: 12px;
+  line-height: 25px;
+  width: 100px;
+  padding: 0px;
+  border-radius: 4px;
+}
+
+.interface-endpoint {
+  margin: 0 10px;
+}
+
+.ml0 {
+  margin-left: 0 !important;
+}
+
+.mt5 {
+  margin-top: 5px !important;
+}
+//---------------SUMMARY------------------//
diff --git a/falcon-ui/app/css/styles/default.less b/falcon-ui/app/css/styles/default.less
new file mode 100644
index 0000000..324ebaf
--- /dev/null
+++ b/falcon-ui/app/css/styles/default.less
@@ -0,0 +1,72 @@
+@body-bg: @white;
+@header1Border: @gray-light;
+@header2NavBG: @gray-lighter;
+@header3NavBG: @white;
+@header2Border:@gray-light;
+/** Menu */
+/*
+@header-menu-color: @green-light;
+*/
+
+/** Search */
+@search-box-border: @gray-light;
+@search-input-color: @gray-light;
+@search-icon-color: @gray-light;
+
+/** Search:Popover */
+@popover-text-color: @gray-light;
+@popover-header-color: @gray-light;
+
+/* Entity Detail Screen */
+@entity-detail-background-color: @white;
+
+/* Detail Screen */
+@detail-header-color: @gray-light;
+@detail-header-button-background-color: @gray-lighter;
+@detail-background-color: @white;
+@detail-border-color: @gray-light;
+@detail-color: @gray-light;
+
+/* Lineage Graph*/
+@lineage-path-stroke-color: @gray-light;
+@lineage-rect-fill-color: @gray-lighter;
+@lineage-rect-stroke-color: @gray-light;
+@lineage-node-text-color: @gray-light;
+@lineage-marker-fill-color: @gray-light;
+
+/* Controls */
+@input-background-color:@gray-light; /* light gray for table instance  */
+@input-color: @cool-gray;
+@form-input-background-color: @white;
+@details-box-dt-bg : @white;
+@form-box-clusterBox-runJobOnBox : @cool-gray;
+@form-table-color :@gray-light;
+@details-form-border :@gray-light;
+@form-nxt-btn: @gray-lightest;
+
+@progress-div-active-bg:@gray-light;
+@progress-div-active-color: @white;
+@progress-div-completed-bg :@cool-gray;
+@progress-div-completed-color: @gray-lightest;
+@progress-div-border : @cool-gray;
+@progress-div-color : @cool-gray;
+@progress-div-bottom-border: transparent;
+
+/** Table */
+@table-header-color: @gray-light;
+@table-header-background-color: @gray-lighter;
+@table-border-color: @gray-light;
+@table-header-border-color: @gray-light;
+@table-header-border-width: 0px 0px 1px;
+@table-header-button-color: @gray-dark;
+@table-header-button-hover-color: @gray-light;
+@table-cell-color:              #000;
+@table-cell-hover-color:        @gray-dark;
+@table-row-selected-background-color: @gray-lighter;
+@table-inactive-bg: @gray-lighter;
+
+/** Pagination */
+@pagination-active-bg:                 @white;
+@pagination-active-color:              @gray-light;
+@pagination-disabled-bg:               @gray-light;
+@pagination-disabled-color:            @white;
diff --git a/falcon-ui/app/css/styles/entities-list.less b/falcon-ui/app/css/styles/entities-list.less
index 6ea757f..e442c67 100644
--- a/falcon-ui/app/css/styles/entities-list.less
+++ b/falcon-ui/app/css/styles/entities-list.less
@@ -22,15 +22,30 @@
   }
 }
 
+@listTbodyBackground: transparent;
+
 .listTable {
   margin-top: 5px;
   border-collapse: separate;
-  border-radius: 4px;
-  //border: 1px solid @gray;
+  /*border-radius: 4px;*/
+  border: 1px solid @table-border-color;
   width: 100%;
   min-height: 140px;
   overflow: hidden;
   position: relative;
+  font-size: 12px;
+  .ptb5px {
+	padding: 5px 0;
+  }
+  input , select {
+	background-color: @input-background-color;
+	padding-left: 4px;
+	color: @input-color;
+    font-weight: normal;
+  }
+  .border0px {
+	border: 0px;
+  }
   .spinner {
     .transition (all, 1s, linear);
     display: none;
@@ -46,7 +61,7 @@
       display: block;
       position: absolute;
       z-index: 2;
-      .background-opacity(black, 0.8);
+      .background-opacity(@table-inactive-bg, 0.8);
       width: 100%;
       height: 100%;
       top: 0;
@@ -70,17 +85,22 @@
   thead {
     padding: 5px;
     text-align: left;
-    background-color: @gray-dark;
-    color: white;
-    tr > th { border-bottom: none; }
+    background-color: @table-header-background-color;
+    color: @table-header-color;
+    tr > th { border: none; }
   }
   tbody {
     padding: 5px;
     display: table-row-group;
-    background-color: white;
+    background-color: @listTbodyBackground;
+	tr > th { border: none; }
+  }
+  tbody:nth-child(2) {
+    border-bottom: 20px solid transparent;
   }
   tr {
     width: 100%;
+    height: 24px;
   }
   .filtersBox {
     font-weight: normal;
@@ -107,28 +127,47 @@
 
   .entityRow {
     &:hover, &.rowSelected {
-      background: #F2F2F2;
+      background: @table-row-selected-background-color;
+	  color: @table-cell-hover-color;
       td {
-        border-color: #E2E2E2;
+        color: @table-cell-hover-color;
       }
     }
 
     td {
-      padding: 3px 3px;
+      padding: 0;
       line-height: 22px;
-      border-top: 1px solid transparent;
-      border-bottom: 1px solid transparent;
+      border-top: 0;
+      border-bottom: 0;
       vertical-align: middle;
+      color: @table-cell-color;
     }
-    &.firstEntityRow {
-      td { padding-top: 6px; }
-    }
+
     &.lastEntityRow {
       td {
         padding-bottom: 6px;
       }
     }
   }
+  .paginationRow td {
+    background-color: @table-header-background-color;
+    .pagination {
+      border-radius: 0px;
+      li {
+        a {
+          background-color: @pagination-active-bg;
+          color: @pagination-active-color;
+          border: none;
+          border-radius: inherit;
+          &.pagDisabled {
+            background-color: @pagination-disabled-bg !important;
+            text-decoration: underline;
+            color: @pagination-disabled-color;
+          }
+        }
+      }
+    }
+  }
   label {
     font-weight: normal;
     font-size: 10px;
@@ -136,6 +175,9 @@
   .checkboxCell {
     width: 20px;
     text-align: center;
+	  input[type="radio"], input[type="checkbox"] {
+	    vertical-align: middle;
+	  }
   }
   .stateCell {
     width: 120px;
@@ -148,13 +190,27 @@
 
   .nameCell {
     cursor: pointer;
+	.entypo {
+	  font-size: 1.4em;
+	}
     &:hover {
       text-decoration: underline;
     }
+    button {
+      color: @green-light;
+	  padding: 0 6px;
+      border: none;
+      background-color: transparent;
+      font-size: 12px;
+    }
   }
 }
 .buttons-to-show {
   margin:2px 0;
+  color: @table-header-button-color;
+  &:hover {
+    color: @table-header-button-hover-color;
+  }
 }
 /* LOGIN */
 .login {
@@ -188,11 +244,14 @@
   }
 }
 
-.tag:hover {
-  cursor: pointer;
-  color: #fff;
-  background-color: #5fa33e;
-  font-weight: bold;
+.tag {
+  padding: 0px 3px;
+  &:hover {
+    cursor: pointer;
+    color: #fff;
+    background-color: #5fa33e;
+    /*font-weight: bold;*/
+  }
 }
 
 
diff --git a/falcon-ui/app/css/styles/feed-form.less b/falcon-ui/app/css/styles/feed-form.less
new file mode 100644
index 0000000..356d3e6
--- /dev/null
+++ b/falcon-ui/app/css/styles/feed-form.less
@@ -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.
+ */
+#feedFormGeneralStep {
+  .clusterBox {
+      border-top: 1px solid #aaa;
+      padding: 0px 0px 15px;
+      margin-left: 5px;
+      margin: 35px 10px 10px 0px;
+      border-radius: 0px;
+
+      h3 {
+        color: inherit;
+        background-color: #FFFFFF;
+        border: none;
+        border-radius: 0px;
+        padding: 6px 6px;
+        top: -47px;
+        font-size: 13px;
+      }
+  }
+
+  .advancedOtptions {
+    margin-top: -30px;
+  }
+}
diff --git a/falcon-ui/app/css/styles/form-pages.less b/falcon-ui/app/css/styles/form-pages.less
index 957e148..4cbe178 100644
--- a/falcon-ui/app/css/styles/form-pages.less
+++ b/falcon-ui/app/css/styles/form-pages.less
@@ -20,46 +20,138 @@
 .mt1 {
   margin-top: 1px;
 }
+.mt3 {
+  margin-top: 3px;
+}
 .mt5 {
   margin-top: 5px;
 }
+.mt8 {
+  margin-top: 8px;
+}
 .mt10 {
   margin-top: 10px;
 }
+.mt15 {
+  margin-top: 15px !important;
+}
 .mt20 {
   margin-top: 20px;
 }
+.mt25 {
+  margin-top: 25px;
+}
+.mt30 {
+  margin-top: 30px;
+}
+.mt35 {
+  margin-top: 35px;
+}
+.mb0 {
+  margin-bottom: 0px !important;
+}
+.mb5 {
+  margin-bottom: 5px;
+}
+.mb7 {
+  margin-bottom: 7px;
+}
 .mb10 {
   margin-bottom: 10px;
 }
-.formViewContainer {
-  .mt10;
-
+.mr20 {
+  margin-right: 20px;
 }
+.ml20{
+  margin-left: 20px;
+}
+.pt15px{
+  padding-top:15px;
+}
+.pt35px{
+  padding-top:35px;
+}
+.pt5px{
+  padding-top:5px;
+}
+.pt3px{
+  padding-top:3px;
+}
+.pb5px{
+  padding-bottom:5px;
+}
+.pl0px{
+  padding-left: 8px;
+}
+.p0px{
+  padding: 0px;
+}
+.plr0px{
+  padding-left: 0px;
+  padding-right: 0px;
+}
+
+.pl5 {
+  padding-left: 5px;
+}
+
 //-----------------next and previous buttons----------//
-@nextBtnBackground: #666666;
+@nextBtnBackground: #69be28;
 @prevBtnBackground: #CCCCCC;
-.nextBtn, .prevBtn {
+.nextBtn, .prevBtn ,.cnclBtn {
   .transition(background, 0.3s, ease);
   border: 0px none;
-  width: 90px;
-  border-radius: 7px!important;
-  padding: 10px;
+  width: 100px;
+  font-size: 12px;
+  line-height: 1.3em;
 }
-.nextBtn {
-  background: @nextBtnBackground;
-  color: white;
+.advancedSaveBtn {
+  .transition(background, 0.3s, ease);
+  border: 0px none;
+  font-size: 12px;
+  line-height: 1.3em;
+  width: 180px;
+}
+.datasourceBtn {
+  .transition(background, 0.3s, ease);
+  border: 0px none;
+  width: 120px;
+  font-size: 12px;
+  line-height: 1.3em;
+}
+a.cnclBtn {
+	height:24px;
+	background-color:#cccccc;
+	/*border-radius:7px;*/
+	margin:0px;
+	line-height: 1.3em;
   &:hover {
-    background: darken(@nextBtnBackground, 10%);
-    color: white;
+    background: darken(#cccccc, 10%);
+    color: #232323;
     outline: hidden;
-    border-radius: 7px!important;
+    /*border-radius: 7px!important;*/
   }
   &:focus, &:active, &:visited {
-    background: darken(@nextBtnBackground, 10%);
-    color: white;
+    background: darken(#cccccc, 10%);
+    color: #232323;
     outline: hidden;
-    border-radius: 10px!important;
+	/*border-radius: 7px!important;*/
+  }
+}
+.nextBtn {
+  background: @form-nxt-btn;
+  color: @progress-div-active-color;
+  /*line-height: 1.3em;*/
+  &:hover {
+    background: darken(@form-nxt-btn, 10%);
+    color: @progress-div-active-color;
+    outline: hidden;
+    /*border-radius: 7px!important;*/
+  }
+  &:focus, &:active, &:visited {
+    background: darken(@form-nxt-btn, 10%);
+    color: @progress-div-active-color;
+    outline: hidden;
   }
 }
 .prevBtn {
@@ -67,17 +159,46 @@
   &:hover {
     background: darken(@prevBtnBackground, 10%);
     outline: hidden;
-    border-radius: 7px!important;
+    /*border-radius: 7px!important;*/
   }
   &:focus, &:active, &:visited {
     background: darken(@prevBtnBackground, 10%);
     outline: hidden;
-    border-radius: 10px!important;
+    /*border-radius: 10px!important;*/
+  }
+}
+.advancedSaveBtn {
+  background: @form-nxt-btn;
+  color: @progress-div-active-color;
+  &:hover {
+    background: darken(@form-nxt-btn, 10%);
+    color: @progress-div-active-color;
+    outline: hidden;
+  }
+  &:focus, &:active, &:visited {
+    background: darken(@form-nxt-btn, 10%);
+    color: @progress-div-active-color;
+    outline: hidden;
+  }
+}
+.datasourceBtn {
+  background: @form-nxt-btn;
+  color: @progress-div-active-color;
+  /*line-height: 1.3em;*/
+  &:hover {
+    background: darken(@form-nxt-btn, 10%);
+    color: @progress-div-active-color;
+    outline: hidden;
+    /*border-radius: 7px!important;*/
+  }
+  &:focus, &:active, &:visited {
+    background: darken(@form-nxt-btn, 10%);
+    color: @progress-div-active-color;
+    outline: hidden;
   }
 }
 //-----------------------------------------------------//
 .aclBox {
-  .mt10;
 
   > div {
     label {
@@ -90,9 +211,23 @@
     vertical-align: top;
   }
 }
+.formBoxContainer {
+  .customContainer{
+	overflow:auto;
+	border:1px solid @details-form-border;
+	margin-left:0px;
+	margin-right:0px;
+  }
+}
 .dt {
   //display: table;
 }
+/*.xmlPreviewContainer {
+  position: absolute;
+  left: 530px;
+  top: 55px;
+  right: 0;
+}
 @media screen and (max-width: @grid-float-breakpoint) {
   .xmlPreviewContainer {
     position: relative;
@@ -100,18 +235,43 @@
     top:0;
     width: 500px;
   }
-}
+}*/
 .formPage {
 
   h3 {
     font-weight: bold;
   }
+  a.cnclBtn {
+	height:24px;
+	background-color:#cccccc;
+	/*border-radius:7px;*/
+	margin:0px;
+	text-decoration: none;
+	text-align: center;
+	line-height: 1.3em;
+	&:hover {
+		background: darken(#cccccc, 10%);
+		color: #232323;
+		outline: hidden;
+		/*border-radius: 7px!important;*/
+	  }
+	  &:focus, &:active, &:visited {
+		background: darken(#cccccc, 10%);
+		color: #232323;
+		outline: hidden;
+		/*border-radius: 7px!important;*/
+	  }
+	}
   .entypo {
     font-size: 22px;
+	color: #000;
    /* line-height: 14px;*/
     /*vertical-align: top;
     display: inline-table;*/
   }
+  .addTag {
+	background-color:#cccccc;
+  }
   h4 {
     font-size: 14px;
     font-weight: bold;
@@ -130,6 +290,9 @@
     line-height: 12px;
     margin: 10px 0 2px 0;
   }
+  .font11px {
+    font-size: 11px;
+  }
   .light {
     font-weight: normal;
   }
@@ -165,7 +328,7 @@
     &:last-child { margin-right:0;}
   }
   input[type="text"] {
-    width: 20px;
+    width: 43px;
     //height: 18px;
     //line-height: 18px;
     vertical-align: top;
@@ -178,7 +341,6 @@
     margin:0;
     vertical-align: middle;
   }
-  div { margin-bottom: 5px;}
   #availInput {
     width: 60px;
   }
@@ -196,16 +358,43 @@
   }
 
 }
-.clusterSummaryRow {
+
+#clusterSummaryStep, #feedSummaryStep, #processSummaryStep, #formSummaryBox, #datasourceSummaryStep {
   padding: 0 10px;
+  h4 {
+    margin-top: 25px;
+    margin-bottom: 0px;
+  }
 }
-.clusterForm, .feedForm, .entityForm {
-  input {
+
+.clusterForm, .feedForm, .entityForm, .datasetForm, .snapshotForm, .datasourceForm {
+  input, input[disabled],textarea, textarea[disabled] {
     padding-left: 1px;
     border-width: 1px;
+    background-color:@form-input-background-color;
+    color:#333333;
+    &.form-control {
+      background-color:@form-input-background-color;
+    }
+    &[disabled] {
+      background-color:@input-bg-disabled;
+    }
+  }
+  input:active,input:focus,input:visited,
+  select:active,select:focus,select:visited,
+  textarea:active,textarea:focus,textarea:visited {
+    background-color:#ffffff;
+    color:#333333;
   }
   select {
-    background-color: white;
+    background-color: @form-input-background-color;
+    color:#333333;
+  }
+  select[disabled] {
+    background-color:@input-bg-disabled;
+  }
+  .p0px{
+	padding:0px;
   }
   > div {
     &:first-child {
@@ -226,16 +415,41 @@
     margin-top: 10px;
   }
   label {
-    font-size: 12px;
     margin:0;
   }
   input[type="checkbox"] {
-    vertical-align: sub;
+    vertical-align: middle;
+  }
+}
+#clusterLocationBox {
+  label {
+    margin:0;
   }
 }
 //---------------------------------//
-.feedForm, .entityForm {
+.clusterForm, .feedForm, .entityForm, .datasetForm, .snapshotForm, .datasourceForm {
+  .pullOver {
 
+    button {
+      transform: rotate(90deg);
+      height:auto!important;
+      position: absolute;
+      right: -61px;
+      top: 57px;
+
+    }
+  }
+  .pullOverXml {
+
+
+    button {
+      transform: rotate(90deg);
+      height:auto!important;
+      position: absolute;
+      right: -88px;
+      top: 57px;
+    }
+  }
   .small {
     display: inline-block;
     width: 30px;
@@ -250,6 +464,30 @@
   .freqTitle {
     margin: 0 0 5px 0;
   }
+  .title {
+	font-size: 14px;
+	color: @form-label-color;
+    .mb0;
+  }
+  .pb15px {
+	padding-bottom:15px;
+  }
+  .pb30px {
+	padding-bottom:30px;
+  }
+  .bb1pxw {
+	border-bottom: 1px solid #666666;
+  }
+  input,select,button,textarea {
+	height:24px;
+	border-color:#cccccc;
+  }
+  .labelCheckBox  {
+    height:17px;
+  }
+  input[type="radio"] {
+    height: auto
+  }
   .top-buffer {
     margin-top: 8px;
   }
@@ -361,9 +599,9 @@
       margin-top: 0;
     }
   }
-  .TZSelect {
+  /*.TZSelect {
     margin: 5px 0;
-  }
+  }*/
   .addProperty {
     margin: 12px 5px;
     display: inline-block;
@@ -373,16 +611,21 @@
 
 //----old entity details------------------//
 .detailsHeaders {
-  h3 { display: inline-block;}
-  small{
+  /*h3 { display: inline-block;}
+  small {
     color: @gray-light;
     display: block;
     margin-bottom: -2px;
-  }
+  }*/
   .btn {
     margin-top: -2px;
-    background-color: @gray;
-    color: white;
+    background-color: @detail-header-button-background-color;
+    color: @detail-header-color;
+  }
+  .entityName {
+    color: @detail-header-color;
+    font-size: 15px;
+    padding-left: 5px;
   }
 }
 
@@ -391,34 +634,106 @@
     float:none!important;
   }
 }
+.entityDetailsBox {
+	background-color: @entity-detail-background-color;
+	color: @detail-color;
+    border: 1px solid @detail-border-color;
+}
+
+.instanceDetails {
+  .detailsBox {
+    border: 1px solid @detail-border-color;
+    margin: 5px;
+    padding: 15px;
+  }
+}
+
 .detailsBox {
-  border-radius: 5px;
-  border: 1px solid @gray-light2;
-  margin: 5px 0;
-  padding: 15px 5px;
+  /*border-radius: 5px;
+  border: 1px solid @gray-light2;*/
+  margin: 0px;
+  padding: 0px;
   font-size: 12px;
-  background-color: #ffffff;
+  background-color: @detail-background-color;
   h4 {
     font-weight: bold;
     margin:5px 0;
+    color: @form-label-color;
   }
   h5 {
     font-weight: bold;
     margin-top:2px;
+	color:  @form-label-color;
   }
   table {
     width: 100%;
     border-spacing: 5px;
     border-collapse: separate;
   }
+  .blink-success {
+	color: #69be28;
+  }
+  .blink-warning {
+	color: #E6DD00;
+  }
+  .blink-danger {
+    color: #E6DD00;
+  }
+  .blink-notification {
+	color: #ffff00;
+  }
+  .text-success {
+	color: #3c763d;
+  }
+  table.properties {
+	color: @form-table-color;
+	border-collapse: collapse;
+    .mb0;
+  }
+  .no-border-top {
+	border-top:0px;
+  }
+  .no-border-bottom {
+	border-bottom:0px;
+  }
+
+  .editXMLBtn {
+	backgorund-color:#cccccc;
+	color:#232323;
+	font-size:12px;
+  }
   .tableHeader {
     width: 70px;
     font-weight: bold;
   }
-  textarea {
-    width: 100%;
+  label, span {
+    color: @form-label-color;
   }
-  &.processCluster {
+  label {
+    margin-top: 15px;
+  }
+  label.custom-danger {
+	color: #f33;
+  }
+  textarea.form-control {
+    width: 100%;
+	/*background-color:#232323;
+	color:#ffffff;
+	border:0px;
+	font-size:12px;*/
+  }
+  .dt {
+	background-color: @details-box-dt-bg;
+	border:1px solid #666666;
+  }
+
+  .processCluster {
+    border-radius: 5px;
+    border: 1px solid #a6a6a6;
+    padding: 15px 4%;
+    margin: 10px auto;
+  }
+  /*&.processCluster {
     padding: 15px 4%;
     margin: 5px auto;
     h5 {
@@ -427,6 +742,14 @@
         margin-top:0;
       }
     }
+  }*/
+  &.xmlPreviewContainer {
+    margin-left: 25px;
+    margin-right: -25px;
+    textarea[disabled] {
+      border: none;
+      background-color: transparent;
+    }
   }
 }
 
@@ -449,35 +772,36 @@
 ///////VALIDITY BOXES//////////////////////////
 ///////////////////////////////////////////////
 .validityBox {
-  label, input, button {
+  /*label, input, button {
     font-weight: normal;
-  }
+  }*/
 
-  > div {
+  /*> div {
     display: inline-block;
     margin: 0 2px;
-  }
+  }*/
 
   h4 {
     margin-top: 5px;
     margin-bottom: 0;
   }
   .startDateBox, .endDateBox {
-    width: 20%;
+    /*width: 20%;*/
     vertical-align: top;
+    margin-right: 5px;
   }
   .startTimeBox, .endTimeBox {
-    width: 15%;
+    /*width: 15%;*/
     vertical-align: top;
-    padding-left:0;
     input {
-      //width: 20px;
-      //margin:0;
+      width: 45px;
+      margin-right: 5px;
+      /*margin:0 auto;*/
     }
     button {
       border-radius: 0;
       width: 25px;
-      height: 25px;
+      /*height: 25px;*/
       padding:0;
       margin-left: 1px;
     }
@@ -504,17 +828,90 @@
   .endTimeBox {
 
   }
-  .tzBox {
+  /* Date-picker */
+  ul.dropdown-menu {
+    color: @gray-dark;
+    span, label {
+      color: @gray-dark;
+    }
+    button {
+      height: auto;
+    }
+  }
+  /*.tzBox {
     width: 22%;
     //padding-top: 20px;
-  }
+  }*/
 }
 
-.feedForm, .entityForm {
-  .validityBox {
+.clusterForm, .feedForm, .entityForm, .datasetForm, .snapshotForm, .datasourceForm {
+  margin-top: 25px;
+  /*.validityBox {
     .startDateBox, .endDateBox { width: 27%;}
     .startTimeBox, .endTimeBox {width: 17%;}
     .endDateBox { margin-left: 20px;}
-    .error_input { border:1px solid red !important;}
-  }
-}
\ No newline at end of file
+  }*/
+}
+
+.feedFormClusters {
+  padding-top: 50px;
+}
+
+.feedForm .clusterSelect {
+  display: inline;
+  width: auto;
+}
+
+.feedForm .clusterAddBtn {
+  margin: 0px 0px 1px 8px;
+}
+
+.feedForm .sourceClusterList, .feedForm .targetClusterList {
+  padding-top: 7px;
+}
+
+.feedForm .clusterListLabel {
+  font-size: 13px;
+  margin-bottom: 7px;
+}
+
+.feedForm .panel-heading {
+  padding: 1px;
+}
+
+.feedForm .panel-group .panel {
+  border-radius: 0px;
+  margin-top: -1px;
+}
+
+.feedForm .panel-group .panel .panel-collapse {
+  padding: 0px;
+}
+
+.feedFormInputBorder {
+  border: 1px solid @input-border;
+}
+
+.feedForm .partition-panel-body {
+  padding: 5px 5px 30px 5px;
+}
+
+.aclPermission {
+  min-width: 250px;
+}
+
+.endpointDefault {
+  color : @form-label-color !important;
+}
+
+.endpointChanged {
+  color: @gray-darker !important;
+}
+
+.clusterBoxEndLine {
+  border-top: 1px solid #aaa;
+}
+
+.disabledEditBtn {
+  pointer-events: auto !important;
+}
diff --git a/falcon-ui/app/css/styles/gray.less b/falcon-ui/app/css/styles/gray.less
new file mode 100644
index 0000000..b48affa
--- /dev/null
+++ b/falcon-ui/app/css/styles/gray.less
@@ -0,0 +1,65 @@
+@body-bg: @white;
+@header1Border: @gray-light;
+@header2NavBG: @gray-lighter;
+@header3NavBG: @white;
+@header2Border:@gray-light;
+/** Menu */
+/*
+@header-menu-color: @green-light;
+*/
+
+/** Search */
+@search-box-border: @gray-light;
+@search-input-color: @gray-light;
+@search-icon-color: @gray-light;
+
+/** Search:Popover */
+@popover-text-color: @gray-light;
+@popover-header-color: @gray-light;
+
+/* Entity Detail Screen */
+@entity-detail-background-color: @white;
+
+/* Detail Screen */
+@detail-header-color: @gray-light;
+@detail-header-button-background-color: @gray-lighter;
+@detail-background-color: @white;
+@detail-border-color: @gray-light;
+@detail-color: @gray-light;
+
+/* Lineage Graph*/
+@lineage-path-stroke-color: @gray-light;
+@lineage-rect-fill-color: @gray-lighter;
+@lineage-rect-stroke-color: @gray-light;
+@lineage-node-text-color: @gray-light;
+@lineage-marker-fill-color: @gray-light;
+
+/* Controls */
+@input-background-color:@gray-light; /* light gray for table instance  */
+@input-color: @white;
+@form-input-background-color: @green-light;
+@details-box-dt-bg : @green-light;
+@form-box-clusterBox-runJobOnBox : @cool-gray;
+@form-table-color :@green-light;
+@details-form-border :@gray-light;
+@progress-div-bottom-border : transparent;
+@progress-div-completed-bg: @gray-lighter;
+
+/** Table */
+@table-header-color: @gray-light;
+@table-header-background-color: @gray-lighter;
+@table-border-color: @gray-light;
+@table-header-border-color: @gray-light;
+@table-header-border-width: 0px 0px 1px;
+@table-header-button-color: @gray-dark;
+@table-header-button-hover-color: @gray-light;
+@table-cell-color:              #000;
+@table-cell-hover-color:        @gray-dark;
+@table-row-selected-background-color: @gray-lighter;
+@table-inactive-bg: @gray-lighter;
+
+/** Pagination */
+@pagination-active-bg:                 @white;
+@pagination-active-color:              @gray-light;
+@pagination-disabled-bg:               @gray-light;
+@pagination-disabled-color:            @white;
diff --git a/falcon-ui/app/css/styles/lineage.less b/falcon-ui/app/css/styles/lineage.less
new file mode 100644
index 0000000..e3225d2
--- /dev/null
+++ b/falcon-ui/app/css/styles/lineage.less
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.link {
+  fill: none;
+  stroke: green;
+  stroke-width: 2px;
+}
+g {
+  text {
+    pointer-events: none;
+    text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;
+    text-align: center;
+    font-size: 15px !important;
+  }
+}
+.d3-tip {
+  pre {
+    max-width: 400px;
+  }
+}
+div.lineage {
+  border-bottom: 2px solid #006600;
+}
+.edgePath {
+  path {
+    stroke: #333;
+    fill: #333;
+    stroke-width: 1.5px;
+  }
+}
+.lineage-viz {
+  margin: 0 auto;
+  overflow: auto;
+}
diff --git a/falcon-ui/app/css/styles/nav-header.less b/falcon-ui/app/css/styles/nav-header.less
index 2be45af..5f5c197 100644
--- a/falcon-ui/app/css/styles/nav-header.less
+++ b/falcon-ui/app/css/styles/nav-header.less
@@ -19,17 +19,41 @@
 //---------navHeader----------------------//
 
 .navbar {
-  z-index: 2;
-  background-color: @headerNavBG;
+  /*z-index: 2;*/
   margin: 0;
   color: white;
-  padding: 5px 0;
+  /*padding: 5px 0;*/
   border-width: 0;
   border-radius: 0;
-  position: relative;
+  /*position: relative;*/
   &:hover{
     cursor: default;
   }
+  &.header1 {
+    background-color: @headerNavBG;
+    .loginHeaderBox {
+      /*position: relative;
+      top: 50%;*/
+      /*transform: translateY(80%);*/
+      .btn-link {
+        color: @green-light !important;
+        padding-top: 12px;
+        text-align: left;
+        /*height: 40px;*/
+        &:hover {
+          color: @green-light;
+        }
+      }
+    }
+  }
+  &.header2 {
+    min-height: 42px;
+    background-color: @header2NavBG;
+  }
+  &.header3 {
+    min-height: 32px;
+    background-color: @header3NavBG;
+  }
 }
 .logoTitle {
   background: transparent;
@@ -40,14 +64,14 @@
     display: inline-block;
   }
   .falconLogo{
-    background: url(img/falcon.png) no-repeat center center;
+    background: url(img/falcon-logo.jpg) no-repeat center center;
     background-size: 100%;
-    width: 30px;
-    height: 44px;
+    width: 100px;
+    height: 72px;
   }
 }
 .navbar-header {
-  margin: 5px 15px 5px 5px;
+  margin: 6px;
   font-size: 30px;
   cursor: pointer;
   font-weight: bolder;
@@ -58,23 +82,35 @@
 
 .createNavWrapper, .uploadNavWrapper {
   float: left;
-  margin: 0 10px;
-  > h4 {
+  padding-top:9px;
+  /*margin: 0 10px;*/
+  /*> h4 {
     font-size: 14px;
     font-weight: bold;
     margin: 2px 0;
-  }
-  > button {
-    padding: 5px 10px;
-    border: 1px solid white;
-    border-radius: 3px;
+  }*/
+  button {
+    border: none;
+    /*border: 1px solid white;*/
+    /*border-radius: 3px;*/
     display: inline-block;
     cursor: pointer;
     background-color: transparent;
+    color: @green-light;
+    &:hover {
+      color: #FFFFFF;
+    }
+    &.btn-link {
+      text-decoration: none;
+      color: @green-light;
+      height: 24px;
+      padding-top: 1px;
+    }
   }
   span {
     vertical-align: middle;
-    margin-right: 6px;
+    /*margin-right: 6px;*/
+    font-size: 13px;
     &.entypo, &.glyphicon{
       vertical-align: sub;
       &.up{
@@ -82,56 +118,111 @@
       }
     }
   }
-  .disabled {
-    //color: lighten(@headerNavBG, 30%);
-    //border-color: lighten(@headerNavBG, 10%);
-    cursor: default;
-    .background-opacity(black, 0.2);
+  ul.dropdown-menu {
+    border:none;
+    margin: 0px;
+    border-radius: inherit;
+    color: @green-light;
   }
 }
+
+/*.createNavWrapper {
+  position: relative;
+  left: -80px;
+  top: 25px;
+  height: 60px;
+  margin: 10px 0px 5px;
+}*/
+
+/** Deprecated */
 .uploadNavWrapper {
+  /*height: 35px;*/
   > div {
-    min-width:183px;
-    padding: 5px 10px;
-    border: 1px solid white;
+    width: 120px;
+    height: 20px;
+    float: left;
+    margin-right: 5px;
+    /*padding: 5px 10px;*/
     border-radius: 3px;
-    display: inline-block;
+    /*display: inline-block;*/
     cursor: pointer;
-    &.fakeFocus {
+    background-size: 100%;
+    background: 50% no-repeat;
+    /*&.fakeFocus {
       .box-shadow(0 0 2px white);
+    }*/
+    .btn-upload, .btn-create {
+      width: 120px;
+      color: @white;
+      background-color: @green-light;
+      height: 27px;
     }
   }
 }
-.loginHeaderBox {
-  margin: 0;
-  display: inline-block;
-  //width: 100%;
-  text-align: right;
-  margin-top: 10px;
 
-  .pull-right;
-  >*{
+.loginHeaderBox {
+  /*margin: 0;
+  display: inline-block;*/
+  //width: 100%;
+  /*float: right;*/
+  /*margin-top: 20px;*/
+  color: @green-light;
+  position: absolute;
+  right: 1%;
+  top: 25px;
+  font-size: 18px;
+
+  /*.pull-right;*/
+  /*>* {
     vertical-align: middle;
     display: inline-block;
-    margin-right: 10px;
+    margin-right: 3px;
     >*{
       display: inline-block;
       vertical-align: middle;
     }
+  }*/
+  .dropdown-toggle {
+    padding-left: 6px;
+  }
+
+  .btn-link {
+    padding: 6px 3px;
+    color: @green-light;
+    text-decoration: none;
+    &:hover {
+      color: #FFFFFF;
+    }
+    .glyphicon {
+      font-size: 1.1em;
+    }
   }
   span.entypo{
     vertical-align: sub;
   }
-  span.user{
+  /*span.user {
     background: url(img/user.svg) no-repeat center center;
     background-size: 35px 35px;
     height: 35px;
     width: 35px;
-  }
-  button {
+  }*/
+  /*button {
     border: none;
     cursor: pointer;
     background-color: transparent;
+  }*/
+  button {
+    padding: 5px 10px;
+    border: none;
+    /*border: 1px solid white;*/
+    /*border-radius: 3px;*/
+    display: inline-block;
+    cursor: pointer;
+    background-color: transparent;
+    color: @green-light;
+    &:hover {
+      color: #FFFFFF;
+    }
   }
   a {
     color: white;
@@ -145,6 +236,14 @@
       text-decoration: none;
     }
   }
+  ul.dropdown-menu {
+    border:none;
+    margin: 0px;
+    border-radius: inherit;
+    color: @green-light;
+    text-align: center;
+
+  }
 }
 
 /* NOTIFICATIONS */
@@ -152,26 +251,29 @@
 .notifications .messages {
   display:none;
   position: absolute;
-  top:50px;
-  right:0px;
-  width:280px;
-  max-width:280px;
+  top:35px;
+  right:7%;
+  width:400px;
+  max-width:400px;
   max-height:300px;
   overflow: auto;
+  border: 1px solid @green-light;
+  background-color: white;
+  z-index: 1000;
 }
 
 .messagesArrow {
   content:'.';
   display:none;
   position:absolute;
-  margin-left:-10px;
-  top:30px;
-  right:130px;
+  margin-left:49px;
+  top: 17px;
+  /*right: 166px;*/
   width:0;
   height:0;
-  color:transparent;
+  color:@green-light;
   border:10px solid black;
-  border-color:transparent transparent white;
+  border-color:transparent transparent @green-light;
 }
 
 .notifications .messages:before {
@@ -201,6 +303,16 @@
   padding:10px;
   background-color:white;
   text-decoration:none;
+  font-size:14px;
+  // white-space:nowrap;
+  white-space: -moz-pre-wrap !important;  /* Mozilla, since 1999 */
+  white-space: -webkit-pre-wrap; /*Chrome & Safari */
+  white-space: -pre-wrap;      /* Opera 4-6 */
+  white-space: -o-pre-wrap;    /* Opera 7 */
+  white-space: pre-wrap;       /* css-3 */
+  word-wrap: break-word;       /* Internet Explorer 5.5+ */
+  word-break: break-all;
+  white-space: normal;
   a {
     font-weight: bold;
     text-decoration: underline;
@@ -236,5 +348,17 @@
 }
 
 .unreaded-notif {
-  background-color: #EDEDED !important;
-}
\ No newline at end of file
+  background-color: #e6ece1 !important;
+}
+
+.notification-icon {
+  top: 0px;
+}
+
+.listing-icon {
+  top: -1px;
+}
+
+.settings-icon {
+  top: 0px;
+}
diff --git a/falcon-ui/app/css/styles/ng-tags-input.bootstrap.less b/falcon-ui/app/css/styles/ng-tags-input.bootstrap.less
new file mode 100755
index 0000000..0e9de7a
--- /dev/null
+++ b/falcon-ui/app/css/styles/ng-tags-input.bootstrap.less
@@ -0,0 +1,167 @@
+tags-input {
+  box-shadow: none;
+  border: none;
+  padding: 0;
+  min-height: 34px;
+}
+tags-input .host {
+  margin: 0;
+}
+tags-input .tags {
+  -moz-appearance: none;
+  -webkit-appearance: none;
+  border: 1px solid #cccccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  -moz-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+tags-input .tags .tag-item {
+  margin-right: 3px;
+  color: white;
+  background: #428bca;
+  border: 1px solid #357ebd;
+  border-radius: 4px;
+}
+tags-input .tags .tag-item.selected {
+  color: white;
+  background: #d9534f;
+  border: 1px solid #d43f3a;
+}
+tags-input .tags .tag-item .remove-button:hover {
+  text-decoration: none;
+}
+tags-input .tags.focused {
+  border: 1px solid #66afe9;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+tags-input .autocomplete {
+  border-radius: 4px;
+}
+tags-input .autocomplete .suggestion-item.selected {
+  color: #262626;
+  background-color: whitesmoke;
+}
+tags-input .autocomplete .suggestion-item.selected em {
+  color: #262626;
+  background-color: whitesmoke;
+}
+tags-input .autocomplete .suggestion-item em {
+  color: black;
+  background-color: white;
+}
+tags-input.ng-invalid .tags {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+
+.input-group tags-input {
+  padding: 0;
+  display: table-cell;
+}
+.input-group tags-input:not(:first-child) .tags {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.input-group tags-input:not(:last-child) .tags {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+
+.input-group-lg tags-input:first-child .tags {
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+}
+.input-group-lg tags-input:last-child .tags {
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+
+.input-group-sm tags-input:first-child .tags {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.input-group-sm tags-input:last-child .tags {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+
+tags-input.ti-input-lg, .input-group-lg tags-input {
+  min-height: 46px;
+}
+tags-input.ti-input-lg .tags, .input-group-lg tags-input .tags {
+  border-radius: 6px;
+}
+tags-input.ti-input-lg .tags .tag-item, .input-group-lg tags-input .tags .tag-item {
+  height: 38px;
+  line-height: 37px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+tags-input.ti-input-lg .tags .tag-item .remove-button, .input-group-lg tags-input .tags .tag-item .remove-button {
+  font-size: 20px;
+}
+tags-input.ti-input-lg .tags .input, .input-group-lg tags-input .tags .input {
+  height: 38px;
+  font-size: 18px;
+}
+tags-input.ti-input-sm, .input-group-sm tags-input {
+  min-height: 30px;
+}
+tags-input.ti-input-sm .tags, .input-group-sm tags-input .tags {
+  border-radius: 3px;
+}
+tags-input.ti-input-sm .tags .tag-item, .input-group-sm tags-input .tags .tag-item {
+  height: 22px;
+  line-height: 21px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+tags-input.ti-input-sm .tags .tag-item .remove-button, .input-group-sm tags-input .tags .tag-item .remove-button {
+  font-size: 16px;
+}
+tags-input.ti-input-sm .tags .input, .input-group-sm tags-input .tags .input {
+  height: 22px;
+  font-size: 12px;
+}
+
+.has-feedback tags-input .tags {
+  padding-right: 30px;
+}
+
+.has-success tags-input .tags {
+  border-color: #3c763d;
+}
+.has-success tags-input .tags.focused {
+  border-color: #2b542c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+}
+
+.has-error tags-input .tags {
+  border-color: #a94442;
+}
+.has-error tags-input .tags.focused {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+
+.has-warning tags-input .tags {
+  border-color: #8a6d3b;
+}
+.has-warning tags-input .tags.focused {
+  border-color: #66512c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+}
diff --git a/falcon-ui/app/css/styles/ng-tags-input.less b/falcon-ui/app/css/styles/ng-tags-input.less
new file mode 100644
index 0000000..69b1480
--- /dev/null
+++ b/falcon-ui/app/css/styles/ng-tags-input.less
@@ -0,0 +1,134 @@
+tags-input {
+  display: block;
+  height: 35px;
+}
+tags-input *, tags-input *:before, tags-input *:after {
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+}
+tags-input .host {
+  position: relative;
+  margin-top: 5px;
+  margin-bottom: 5px;
+  height: 100%;
+}
+tags-input .host:active {
+  outline: none;
+}
+
+tags-input .tags {
+  -moz-appearance: textfield;
+  -webkit-appearance: textfield;
+  padding: 3px 1px 1px 1px;
+  overflow: hidden;
+  word-wrap: break-word;
+  cursor: text;
+  background-color: transparent;
+  border: 1px solid @search-box-border;
+  //  box-shadow: 1px 1px 1px 0 lightgray inset;
+  height: 80%;
+  padding-left: 10px;
+  overflow-y: auto;
+}
+//tags-input .tags.focused {
+tags-input .tags {
+  outline: none;
+  background-color: #fff;
+}
+tags-input .tags .tag-list {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+tags-input .tags .tag-item {
+  margin-right: 3px;
+  padding: 0px 5px;
+  margin-right : 3px;
+  margin-bottom: 3px;
+  display: inline-block;
+  float: left;
+  font: 13px Arial, sans-serif;
+  height: 19px;
+  background: -webkit-linear-gradient(top, #F89406 0%, #F89406 47%, #F89406 100%);
+  background: linear-gradient(to bottom, #F89406 0%, #F89406 47%, #F89406 100%);
+}
+tags-input .tags .tag-item.selected {
+  background: -webkit-linear-gradient(top, #febbbb 0%, #fe9090 45%, #ff5c5c 100%);
+  background: linear-gradient(to bottom, #febbbb 0%, #fe9090 45%, #ff5c5c 100%);
+}
+tags-input .tags .tag-item .remove-button {
+  margin: 0 0 0 5px;
+  padding: 0;
+  border: none;
+  background: none;
+  cursor: pointer;
+  vertical-align: middle;
+  font: bold 18px Arial, sans-serif;
+  color: #585858;
+}
+tags-input .tags .tag-item .remove-button:active {
+  color: red;
+}
+tags-input .tags .input {
+  border: 0;
+  outline: none;
+  padding: 0;
+  padding-left: 5px;
+  float: left;
+  min-width: 65px !important;
+  background: transparent;
+  color: @search-input-color;
+}
+tags-input .tags .input.invalid-tag {
+  color: red;
+}
+tags-input .tags .input::-ms-clear {
+  display: none;
+}
+tags-input.ng-invalid .tags {
+  -webkit-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
+  -moz-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
+  box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
+}
+
+tags-input .autocomplete {
+  margin-top: 5px;
+  position: absolute;
+  padding: 5px 0;
+  z-index: 999;
+  width: 100%;
+  background-color: white;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+tags-input .autocomplete .suggestion-list {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+tags-input .autocomplete .suggestion-item {
+  padding: 5px 10px;
+  cursor: pointer;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font: 16px Arial, sans-serif;
+  color: black;
+  background-color: white;
+}
+tags-input .autocomplete .suggestion-item.selected {
+  color: white;
+  background-color: #0097cf;
+}
+tags-input .autocomplete .suggestion-item.selected em {
+  color: white;
+  background-color: #0097cf;
+}
+tags-input .autocomplete .suggestion-item em {
+  font: normal bold 16px Arial, sans-serif;
+  color: black;
+  background-color: white;
+}
\ No newline at end of file
diff --git a/falcon-ui/app/css/styles/popover.less b/falcon-ui/app/css/styles/popover.less
index 4218bc2..1de56c4 100644
--- a/falcon-ui/app/css/styles/popover.less
+++ b/falcon-ui/app/css/styles/popover.less
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 @popover-bg-color: #fff;
+@popover-text-color: #000;
+@popover-header-color: #777;
 @popover-border-color: #d2d2d2;
 
 @popover-triangle-size: 11px;
@@ -141,7 +143,7 @@
   box-sizing: border-box;
   z-index: 100;
   background-color: transparent;
-
+  color: @popover-text-color;
   .ns-popover-tooltip {
     box-sizing: border-box;
     border: solid 1px @popover-border-color;
@@ -157,7 +159,7 @@
     h5 {
       font-weight: bold;
       font-size: 16px;
-      color: #777;
+      color: @popover-header-color;
     }
 
     ul {
diff --git a/falcon-ui/app/css/styles/progress-bar.less b/falcon-ui/app/css/styles/progress-bar.less
index 5f0ad01..c20eaf9 100644
--- a/falcon-ui/app/css/styles/progress-bar.less
+++ b/falcon-ui/app/css/styles/progress-bar.less
@@ -19,18 +19,19 @@
 //---------------------------------//
 //---------progress Bar------------//
 //---------------------------------//
+/*
 .progressBar {
   overflow: hidden;
   padding: 10px 35px;
   .entypo {
-    /*float: none!important;
+    /!*float: none!important;
     position: absolute;
     margin: 0!important;
     top:0;
-    left:0;*/
-   /* line-height: 36px;
+    left:0;*!/
+   /!* line-height: 36px;
     height: 36px;
-    width: 36px;*/
+    width: 36px;*!/
 
     color: white;
     z-index:2;
@@ -310,4 +311,35 @@
       background-color: @gray-dark;
     }
   }
-}
\ No newline at end of file
+}*/
+.feedProgressBox, .clusterProgressBox, .processProgressBox, .datasetProgressBox,
+.snapshotProgressBox, .datasourceProgressBox {
+  .progressBar {
+    padding: 0px;
+    > div {
+      width: 19%;
+      margin-left: 1%;
+      float: left;
+      height: 32px;
+      border: 1px solid @progress-div-border;
+      border-bottom:1px solid @progress-div-bottom-border;
+      line-height: 32px;
+      font-size: 110%;
+      border-radius: 5px 5px 0px 0px;
+      color: @progress-div-color;
+      &.completed {
+        background-color: @progress-div-completed-bg;
+        color: @progress-div-completed-color;
+        border-color: @gray-lightest;
+        border-bottom: @progress-div-bottom-border;
+      }
+      &.active {
+        background-color: @progress-div-active-bg;
+        color: @progress-div-active-color;
+      }
+      &.fir {
+        margin-left: 0.5%;
+      }
+    }
+  }
+}
diff --git a/falcon-ui/app/css/styles/server-messages.less b/falcon-ui/app/css/styles/server-messages.less
index 0ab7d13..9737597 100644
--- a/falcon-ui/app/css/styles/server-messages.less
+++ b/falcon-ui/app/css/styles/server-messages.less
@@ -79,3 +79,16 @@
   text-align: center;
   margin: 10px 0;
 }
+
+.notif-close {
+  height: 15px;
+}
+
+.notif-close .close{
+  padding: 0px;
+  padding-right: 5px;
+}
+
+.notif-close .close:hover, .close:focus {
+  color: #4c8c1b;
+}
diff --git a/falcon-ui/app/css/styles/snapshot-form.less b/falcon-ui/app/css/styles/snapshot-form.less
new file mode 100644
index 0000000..a2532a8
--- /dev/null
+++ b/falcon-ui/app/css/styles/snapshot-form.less
@@ -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
+ *
+ *     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.
+ */
+
+#snapshotFormGeneralStep {
+  .clusterBox {
+      border: 1px solid #aaa;
+      border-left: 0;
+      border-right: 0;
+      padding: 10px 0px 15px;
+      margin-left: 5px;
+      margin: 35px 10px 10px 0px;
+      border-radius: 0px;
+
+      h3, .runJobOnBox {
+        color: inherit;
+        background-color: #FFFFFF;
+        border: 1px solid #aaa;
+        border-radius: 0px;
+        padding: 6px 6px;
+      }
+
+      h3 {
+        border: none;
+        top: -47px;
+        font-size: 13px;
+      }
+  }
+}
+
+.bandwidth-label {
+  margin-top: 5px !important;
+}
+
+.snapshotForm hr {
+  margin-top: 10px;
+  margin-bottom: 0;
+}
diff --git a/falcon-ui/app/css/styles/white.less b/falcon-ui/app/css/styles/white.less
new file mode 100644
index 0000000..c4e34cc
--- /dev/null
+++ b/falcon-ui/app/css/styles/white.less
@@ -0,0 +1,65 @@
+@body-bg: @white;
+@header1Border: @green-light;
+@header2NavBG: @green-lighter;
+@header3NavBG: @white;
+
+/** Menu */
+/*
+@header-menu-color: @green-light;
+*/
+
+/** Search */
+@search-box-border: @green-light;
+@search-input-color: @green-light;
+@search-icon-color: @green-light;
+
+/** Search:Popover */
+@popover-text-color: @green-light;
+@popover-header-color: @green-lighter;
+
+/* Entity Detail Screen */
+@entity-detail-background-color: @white;
+
+/* Detail Screen */
+@detail-header-color: @green-light;
+@detail-header-button-background-color: @green-lighter;
+@detail-background-color: @white;
+@detail-border-color: @green-light;
+@detail-color: @green-light;
+
+/* Lineage Graph*/
+@lineage-path-stroke-color: @green-light;
+@lineage-rect-fill-color: @green-lighter;
+@lineage-rect-stroke-color: @green-light;
+@lineage-node-text-color: @green-light;
+@lineage-marker-fill-color: @green-light;
+
+/* Controls */
+@input-background-color:@gray-light; /* light gray for table instance  */
+@input-color: @white;
+@form-input-background-color: @cool-gray;
+@details-box-dt-bg : @cool-gray;
+@form-box-clusterBox-runJobOnBox : @cool-gray;
+@form-table-color :@green-light;
+@details-form-border :@green-light;
+@progress-div-bottom-border : transparent;
+@progress-div-completed-bg: @green-lighter;
+
+/** Table */
+@table-header-color: @green-light;
+@table-header-background-color: @green-lighter;
+@table-border-color: @green-light;
+@table-header-border-color: @green-light;
+@table-header-border-width: 0px 0px 1px;
+@table-header-button-color: @gray-dark;
+@table-header-button-hover-color: @green-light;
+@table-cell-color:              #000;
+@table-cell-hover-color:        @gray-dark;
+@table-row-selected-background-color: @green-lighter;
+@table-inactive-bg: @green-lighter;
+
+/** Pagination */
+@pagination-active-bg:                 @white;
+@pagination-active-color:              @green-light;
+@pagination-disabled-bg:               @green-light;
+@pagination-disabled-color:            @white;
diff --git a/falcon-ui/app/css/variables.less b/falcon-ui/app/css/variables.less
index f1c81ab..ccec3c7 100644
--- a/falcon-ui/app/css/variables.less
+++ b/falcon-ui/app/css/variables.less
@@ -23,13 +23,20 @@
 //== Colors
 //
 //## Gray and brand colors for use across Bootstrap.
+@white: #FFFFFF;
 
 @gray-darker:            lighten(#000, 13.5%); // #222
 @gray-dark:              lighten(#000, 20%);   // #333
 @gray:                   lighten(#000, 33.5%); // #555
+@gray-lightest:           lighten(#000, 40%); // #666
 @gray-light:             lighten(#000, 46.7%); // #777
-@gray-light2:             lighten(#000, 65%); 
+@gray-light2:            lighten(#000, 65%);
 @gray-lighter:           lighten(#000, 93.5%); // #eee
+@gray-darken:           #232323;
+@cool-gray :			#aaaaaa;
+
+@green-light:           #69BE28;
+@green-lighter:         lighten(#69BE28, 40%);
 
 @brand-primary:         #428bca;
 @brand-success:         #5cb85c;
@@ -37,13 +44,64 @@
 @brand-warning:         #f0ad4e;
 @brand-danger:          #d9534f;
 
-@headerNavBG: #69BE28;
+
+@headerNavBG: @white;
+@header1Border: @white;
+@header2Border: @green-light;
+@header2NavBG: @green-light;
+@header3NavBG: @gray-dark;
+
+@search-box-border: @white;
+@search-input-color: @white;
+@search-icon-color: @white;
+/*@search-bar-background: #676567;*/
+
+/*
+@header-menu-color: #000;
+@header-menu-background-color: transparent;
+*/
+
+/* Entity Detail Screen */
+@entity-detail-background-color: @gray-darken;
+
+/* Detail Screen */
+@detail-header-color: @white;
+@detail-header-button-background-color: @gray;
+@detail-background-color: @gray-dark;
+@detail-border-color: @gray-lightest;
+@detail-color: @white;
+
+/* Lineage Graph*/
+@lineage-path-stroke-color: @white;
+@lineage-rect-fill-color: @gray-light;
+@lineage-rect-stroke-color: @white;
+@lineage-node-text-color: @white;
+@lineage-marker-fill-color: @white;
+
+/* Controls */
+@input-color: @white;
+@input-background-color: @gray-dark;
+
+@form-input-background-color: @gray-dark;
+@details-box-dt-bg : @gray-darken;
+@progress-div-active-bg:@green-light;
+@progress-div-active-color: @gray-darken;
+@progress-div-completed-bg :@gray-dark;
+@progress-div-completed-color: @gray-lightest;
+@progress-div-border : @green-light;
+@progress-div-color : @green-light;
+@form-label-color: @detail-color;
+@form-nxt-btn: @green-light;
+@form-box-clusterBox-runJobOnBox:@gray-dark;
+@form-table-color: @white;
+@details-form-border: transparent;
+@progress-div-bottom-border: @progress-div-border;
 //== Scaffolding
 //
 //## Settings for some of the most global styles.
 
 //** Background color for `<body>`.
-@body-bg:               #fff;
+@body-bg:               @gray-darken;
 //** Global text color on `<body>`.
 @text-color:            @gray-dark;
 
@@ -57,7 +115,7 @@
 //
 //## Font, line-height, and color for body text, headings, and more.
 
-@font-family-sans-serif:  cabin, Arial, sans-serif;
+@font-family-sans-serif:  Arial, sans-serif;
 @font-family-serif:       Georgia, "Times New Roman", Times, serif;
 //** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
 @font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
@@ -93,7 +151,7 @@
 //** Load fonts from this directory.
 @icon-font-path:          "fonts/";
 //** File name for all font files.
-@icon-font-name:          "glyphicons-halflings-regular"; 
+@icon-font-name:          "glyphicons-halflings-regular";
 //** Element ID within SVG icon file.
 @icon-font-svg-id:        "glyphicons_halflingsregular";
 
@@ -137,12 +195,17 @@
 //## Customizes the `.table` component with basic values, each used across all table variations.
 
 //** Padding for `<th>`s and `<td>`s.
-@table-cell-padding:            8px;
+@table-cell-padding:            5px;
+@table-cell-color:              @white;
+@table-cell-hover-color:        @white;
+
+@table-row-selected-background-color: @gray-dark;
 //** Padding for cells in `.table-condensed`.
 @table-condensed-cell-padding:  5px;
 
 //** Default background color used for all tables.
 @table-bg:                      transparent;
+@table-inactive-bg:             #000;
 //** Background color used for `.table-striped`.
 @table-bg-accent:               #f9f9f9;
 //** Background color used for `.table-hover`.
@@ -150,8 +213,14 @@
 @table-bg-active:               @table-bg-hover;
 
 //** Border color for table and cell borders.
-@table-border-color:            #ddd;
+@table-border-color:            transparent;
 
+@table-header-border-width: 0px 1px 1px;
+@table-header-border-color: @gray-dark;
+@table-header-color: @white;
+@table-header-background-color: @gray-dark;
+@table-header-button-color: @white;
+@table-header-button-hover-color: @white;
 
 //== Buttons
 //
@@ -453,12 +522,12 @@
 @pagination-hover-bg:                  @gray-lighter;
 @pagination-hover-border:              #ddd;
 
-@pagination-active-color:              #fff;
-@pagination-active-bg:                 @brand-primary;
+@pagination-active-color:              @white;
+@pagination-active-bg:                 @gray-dark;
 @pagination-active-border:             @brand-primary;
 
 @pagination-disabled-color:            @gray-light;
-@pagination-disabled-bg:               #fff;
+@pagination-disabled-bg:               @gray-dark;
 @pagination-disabled-border:           #ddd;
 
 
@@ -617,7 +686,7 @@
 //
 //## Define alert colors, border radius, and padding.
 
-@alert-padding:               5px; 
+@alert-padding:               5px;
 @alert-border-radius:         @border-radius-base;
 @alert-link-font-weight:      bold;
 
@@ -860,5 +929,3 @@
 @dl-horizontal-offset:        @component-offset-horizontal;
 //** Horizontal line color.
 @hr-border:                   @gray-lighter;
-
-
diff --git a/falcon-ui/app/css/white-theme.less b/falcon-ui/app/css/white-theme.less
new file mode 100644
index 0000000..4dbfbd9
--- /dev/null
+++ b/falcon-ui/app/css/white-theme.less
@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+// Core variables and mixins
+@import "main.less";
+@import "styles/white.less";
diff --git a/falcon-ui/app/html/authenticating.html b/falcon-ui/app/html/authenticating.html
index 8706322..9599249 100644
--- a/falcon-ui/app/html/authenticating.html
+++ b/falcon-ui/app/html/authenticating.html
@@ -26,7 +26,7 @@
       <div class="col-sm-12">
 
         <div class="col-sm-15 detailsBox centered">
-          <h3>Authenticating...</h3>
+          <h3 class="auth">Authenticating...</h3>
         </div>
 
       </div>
diff --git a/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html b/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html
index 8d76c90..cc592b2 100644
--- a/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html
+++ b/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html
@@ -18,29 +18,30 @@
  */
 -->
 <form novalidate name="clusterForm" id="clusterGeneralStep">
-  <div class="col-xs-24">
-    <label class="light">Name</label>
-    <input type="text" class="form-control nameInput"
+  <div class="col-xs-8">
+    <label class="light" tooltip="cluster.name">Cluster Name<mandatory-field></mandatory-field></label>
+    <input type="text" class="form-control nameInput" ng-disabled="editingMode"
 	ng-pattern="validations.patterns.name"
         ng-model="clusterEntity.clusterModel.cluster._name" ng-required="true"
         ng-keydown="validations.acceptNoSpaces($event)"
-        check-name="{type:'cluster', check:true}" ng-class="{fakeInvalid:!validations.nameAvailable}"
-        ng-disabled="xmlPreview.edit" />
+        check-name="{type:'cluster', check:!editingMode}"
+        ng-class="{fakeInvalid:!validations.nameAvailable}"
+        ng-disabled="xmlPreview.edit"/>
         <!--check-type="cluster" check-name-flag="nameValid" check="true"-->
 
   </div>
-  <div class="col-xs-12">
-    <label class="light">Colo</label>
+  <div class="col-xs-16">
+    <label class="light" tooltip="cluster.colo">Data Center or Colo Name<mandatory-field></mandatory-field></label>
     <input type="text" class="form-control"
-	ng-pattern="validations.patterns.freeText"
+	ng-pattern="validations.patterns.name"
         ng-required="true" ng-disabled="xmlPreview.edit"
         ng-model="clusterEntity.clusterModel.cluster._colo" validation-message="{{validations.messages.colo}}"/>
   </div>
-  <div class="col-xs-12">
+  <div class="col-xs-24">
     <label class="light">Description</label>
     <input type="text" class="form-control"
-	ng-pattern="validations.patterns.freeText"
-        ng-required="true" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.description}}"
+        ng-disabled="xmlPreview.edit"
+        ng-pattern="validations.patterns.freeText"
         ng-model="clusterEntity.clusterModel.cluster._description" />
   </div>
 
@@ -50,166 +51,207 @@
 
   <div class="col-xs-24">
     <div ng-repeat="tag in tagsArray" class="row dynamic-table-spacer">
-      <div class="col-xs-10">
+      <div class="col-xs-8">
         <input type="text" class="form-control" ng-model="tag.key" ng-disabled="xmlPreview.edit" placeholder="key"
                ng-pattern="validations.patterns.alpha" ng-required="tag.value" validation-optional-message="{{validations.messages.key}}"/>
       </div>
-      <div class="col-xs-11">
+      <div class="col-xs-8">
         <input type="text" class="form-control" ng-disabled="xmlPreview.edit" placeholder="value"
                ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key" validation-optional-message="{{validations.messages.value}}"/>
       </div>
-      <div class="col-xs-3">
-        <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-disabled="xmlPreview.edit" ng-if="$index>0">
+      <div class="col-xs-8">
+        <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-disabled="xmlPreview.edit" ng-if="!$first || !$last">
           <span class="entypo minus"></span> delete
         </button>
+        <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-disabled="xmlPreview.edit" ng-if="$last">
+          <span class="entypo plus"></span> add tag
+        </button>
       </div>
     </div>
   </div>
 
-  <div class="col-xs-24 mt5">
-    <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-disabled="xmlPreview.edit">
-      <span class="entypo plus"></span> add tag
-    </button>
-  </div>
-  <h4 class="col-xs-24"> Access Control List </h4>
-  <div class="col-xs-8">
-    <label class="light">Owner</label>
-    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.owner}}"
-           ng-required="true"
-           ng-pattern="validations.patterns.unixId"
-           ng-model="clusterEntity.clusterModel.cluster.ACL._owner"/>
-  </div>
-  <div class="col-xs-8">
-    <label class="light">Group</label>
-    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.group}}"
-           ng-required="true"
-           ng-pattern="validations.patterns.unixId"
-           ng-model="clusterEntity.clusterModel.cluster.ACL._group"/>
-  </div>
-  <div class="col-xs-8">
-    <label class="light">Permissions</label>
-    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.permission}}"
-           ng-required="true"
-           ng-pattern="validations.patterns.unixPermissions"
-           ng-model="clusterEntity.clusterModel.cluster.ACL._permission"/>
-  </div>
-
-  <h4 class="col-xs-24"> Interfaces </h4>
-  <label class="col-xs-4">
+  <div class="col-xs-24"><label class="mt15">INTERFACES</label></div>
+  <div class="col-xs-24 plr0px">
+    <label class="col-xs-6">
     Type
-  </label>
-  <label class="col-xs-16">
+    </label>
+    <label class="col-xs-10">
     Endpoint
-  </label>
-  <label class="col-xs-4">
-    Version
-  </label>
-  <div id="interfaces-detail" class="col-xs-24"
+    </label>
+    <div id="interfaces-detail" class="col-xs-24"
        ng-repeat="_interface in clusterEntity.clusterModel.cluster.interfaces.interface">
     <div class="row">
-      <div class="col-xs-4">
+      <div class="col-xs-6">
 
           <input type="checkbox" ng-checked="registry.check" ng-model="registry.check"
-                 ng-if="_interface._type === 'registry'" ng-disabled="xmlPreview.edit"/> {{_interface._type}}
+                 ng-if="_interface._type === 'registry'" ng-disabled="xmlPreview.edit"/>
+         <input type="checkbox" ng-checked="spark.check" ng-model="spark.check"
+                ng-if="_interface._type === 'spark'" ng-disabled="xmlPreview.edit"/>
+          <label class="light font11px pt5px" tooltip="cluster.interfaces.{{_interface._type}}">{{clusterInterfaceLabels(_interface._type)}}</label>
 
       </div>
-      <div class="col-xs-16">
-        <input type="text" class="form-control" ng-pattern="validations.patterns.osPath"
+      <div class="col-xs-10">
+        <input id="interface.{{_interface._type}}" type="text" class="form-control" ng-pattern="validations.patterns.interfaceEndpoints"
                ng-model="_interface._endpoint"
-               ng-disabled="_interface._type === 'registry' && !registry.check || xmlPreview.edit"/>
+               ng-required="true"
+               validation-optional-message="{{validations.messages.interfaceEndpoints}}"
+               ng-disabled="xmlPreview.edit" interface-endpoint
+               ng-if="_interface._type !== 'registry' && _interface._type !== 'spark'"/>
+        <input id="interface.{{upperCase(_interface._type)}}" type="text" class="form-control" ng-pattern="validations.patterns.interfaceEndpoints"
+               ng-model="_interface._endpoint" ng-required="registry.check" validation-optional-message="{{validations.messages.interfaceEndpoints}}"
+               ng-disabled="_interface._type === 'registry' && !registry.check || xmlPreview.edit" interface-endpoint
+               ng-if="_interface._type === 'registry'"/>
+
+        <div class="col-xs-24 plr0px" ng-if="_interface._type === 'spark'">
+          <input type="radio" name="sparkInterface" value="yarn-cluster" ng-model="_interface._endpoint"
+              ng-disabled="(_interface._type === 'spark' && !spark.check) || xmlPreview.edit"/>
+          Yarn Cluster
+          <input type="radio" name="sparkInterface" class="ml20" value="yarn-client" ng-model="_interface._endpoint"
+              ng-disabled="(_interface._type === 'spark' && !spark.check) || xmlPreview.edit"/>
+          Yarn Client
+          <input type="radio" name="sparkInterface" class="ml20" value="local" ng-model="_interface._endpoint"
+              ng-disabled="(_interface._type === 'spark' && !spark.check) || xmlPreview.edit"/>
+          Local
+
+          <input type="radio" name="sparkInterface" class="ml20"
+              value="local[*]" ng-model="_interface._endpoint"
+              ng-disabled="(_interface._type === 'spark' && !spark.check) || xmlPreview.edit"/>
+          Custom
+          <input id="interface.{{_interface._type}}" type="text"
+                ng-model="_interface._endpoint"
+                ng-required="spark.check"
+                ng-if="!(_interface._endpoint==='yarn-cluster' || _interface._endpoint==='yarn-client' || _interface._endpoint==='local')"
+                validation-optional-message="{{validations.messages.interfaceEndpoints}}"
+                ng-disabled="(_interface._type === 'spark' && !spark.check) || xmlPreview.edit" interface-endpoint
+                title="Custom spark url like local[*],local[1] etc."/>
+        </div>
       </div>
-      <div class="col-xs-4">
-        <input type="text" class="form-control" ng-pattern="validations.patterns.versionNumbers"
-               ng-disabled="(_interface._type === 'registry' && !registry.check) || xmlPreview.edit"
-               ng-model="_interface._version">
-      </div>
+    </div>
+    </div>
+  </div>
+  <div class="col-xs-24"><label class="mt15">PROPERTIES</label></div>
+  <div class="col-xs-24 plr0px">
+    <div class="row m0">
+      <label class="col-xs-8">Property Name</label><label class="col-xs-16">Value</label>
+    </div>
+    <div ng-repeat="property in clusterEntity.clusterModel.cluster.properties.property" class="row m0">
+        <div class="col-xs-8 dynamic-table-spacer">
+          <input type="text" class="form-control" ng-model="property._name"
+                 ng-pattern="validations.patterns.propertyName"
+                 validation-optional-message="{{validations.messages.name}}"
+                 ng-disabled="xmlPreview.edit"
+                 ng-required="property._value" placeholder="name" />
+        </div>
+        <div class="col-xs-8 dynamic-table-spacer">
+          <input type="text" class="form-control" ng-model="property._value"
+                 validation-optional-message="{{validations.messages.value}}"
+                 ng-disabled="xmlPreview.edit"
+                 ng-required="property._name" placeholder="value" />
+        </div>
+        <div class="dynamic-table-spacer">
+          <button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)" ng-if="!$first || !$last"
+               ng-disabled="xmlPreview.edit">
+            <span class="entypo minus"></span> delete
+          </button>
+          <button type="button" class="btn btn-default btn-xs" ng-click="addProperty()" ng-disabled="xmlPreview.edit" ng-if="$last">
+              <span class="entypo plus"></span> add property
+          </button>
+        </div>
     </div>
   </div>
 
-  <h4 class="col-xs-24"> Properties </h4>
-  <label class="col-xs-7">name</label><label class="col-xs-17">value</label>
-  <div ng-repeat="property in clusterEntity.clusterModel.cluster.properties.property">
-    <div class="col-xs-7 dynamic-table-spacer">
-      <input type="text" class="form-control" ng-model="property._name"
-             validation-optional-message="{{validations.messages.name}}"
-             ng-disabled="xmlPreview.edit"
-             ng-required="property._value" placeholder="name" />
+  <div class="col-xs-24"><label class="mt15">LOCATION</label></div>
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-24 mb5 plr0px">
+      <label class="col-xs-6">Location Name</label><label class="col-xs-10">Path</label>
     </div>
-    <div class="col-xs-15 dynamic-table-spacer">
-      <input type="text" class="form-control" ng-model="property._value"
-             validation-optional-message="{{validations.messages.value}}"
-             ng-disabled="xmlPreview.edit"
-             ng-required="property._name" placeholder="value" />
+    <div ng-repeat="location in clusterEntity.clusterModel.cluster.locations.location" class="col-xs-24 mt5">
+        <div id="clusterLocationBox" class="row" ng-if="location._name === 'staging' || location._name === 'working' || location._name === 'temp'">
+          <div class="col-xs-6 dynamic-table-spacer">
+              <label class="light font11px pt5px" tooltip="cluster.locations.{{location._name}}">
+                {{capitalize(location._name)}}<mandatory-field></mandatory-field>
+              </label>
+          </div>
+          <div class="col-xs-10 dynamic-table-spacer">
+            <input id="location.{{location._name}}" type="text" class="form-control" ng-model="location._path" ng-pattern="validations.patterns.path"
+                   ng-disabled="xmlPreview.edit" ng-required="location._name===staging" validation-optional-message="{{validations.messages.location}}"/>
+            <span class="error" ng-show="locationsEqualError">Staging and Working location should be different</span>
+          </div>
+          <div class="dynamic-table-spacer">
+            <button class="btn btn-default btn-xs" ng-click="removeLocation($index)" ng-if="$index>2 && !$last"
+                 ng-disabled="xmlPreview.edit" >
+              <span class="entypo minus"></span> delete
+            </button>
+            <button type="button" class="btn btn-default btn-xs" ng-click="addLocation()" ng-disabled="xmlPreview.edit" ng-if="$last">
+                <span class="entypo plus"></span> add location
+            </button>
+          </div>
+        </div>
+
+        <!-- <div class="row" ng-if="location._name !== 'staging' && location._name !== 'working' && location._name !== 'temp'">
+          <div class="col-xs-6 dynamic-table-spacer">
+            <input type="text" class="form-control" ng-model="location._name"
+                   validation-optional-message="{{validations.messages.name}}"
+                   ng-pattern="validations.patterns.name"
+                   ng-disabled="xmlPreview.edit" ng-required="location._path" placeholder="name" />
+          </div>
+          <div class="col-xs-10 dynamic-table-spacer">
+            <input type="text" class="form-control" ng-model="location._path"
+                   validation-optional-message="{{validations.messages.path}}"
+                   ng-pattern="validations.patterns.path"
+                   ng-disabled="xmlPreview.edit" ng-required="location._name" placeholder="path" />
+          </div>
+          <div class="dynamic-table-spacer">
+            <button class="btn btn-default btn-xs" ng-click="removeLocation($index)" ng-if="$index>3"
+                 ng-disabled="xmlPreview.edit" >
+              <span class="entypo minus"></span> delete
+            </button>
+            <button type="button" class="btn btn-default btn-xs" ng-click="addLocation()" ng-disabled="xmlPreview.edit" ng-if="$last">
+                <span class="entypo plus"></span> add location
+            </button>
+          </div>
+        </div> -->
     </div>
-    <div class="col-xs-2 dynamic-table-spacer">
-      <button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)" ng-if="$index > 0"
-           ng-disabled="xmlPreview.edit">
-        <span class="entypo minus"></span> delete
+  </div>
+  <div class="col-xs-24 advancedOption" ng-click="expandOptions = !expandOptions" id="clusterAdvancedOption">
+    <label class="mt15 pointer blink-success">ADVANCED OPTIONS</label>
+    <i class="glyphicon glyphicon-chevron-down mt15" ng-if="!expandOptions"></i>
+    <i class="glyphicon glyphicon-chevron-up mt15" ng-if="expandOptions"></i>
+  </div>
+
+  <div id="advancedOptionsBox" class="col-xs-24 plr0px" ng-class="{expanded:expandOptions}">
+    <div class="col-xs-24"><label class="mt15">ACCESS CONTROL LIST</label></div>
+    <div class="col-xs-24 plr0px">
+      <div class="col-xs-12">
+          <label class="light">Owner<mandatory-field></mandatory-field></label>
+          <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.owner}}"
+                 ng-required="true"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-model="clusterEntity.clusterModel.cluster.ACL._owner"/>
+      </div>
+      <div class="col-xs-12">
+          <label class="light">Group<mandatory-field></mandatory-field></label>
+          <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.group}}"
+                 ng-required="true"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-model="clusterEntity.clusterModel.cluster.ACL._group"/>
+      </div>
+      <div class="col-xs-12">
+          <label class="light">Permissions<mandatory-field></mandatory-field></label>
+          <acl-permissions acl-model="clusterEntity.clusterModel.cluster.ACL._permission"></acl-permissions>
+      </div>
+    </div>
+  </div>
+  <div class="col-xs-24 pb15px mt35">
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
+      </a>
+      <button id="cluster.step1" class="btn nextBtn" ng-disabled="xmlPreview.edit || buttonSpinners.show"
+           ng-click="goSummaryStep(clusterForm.$invalid)" scroll-to-error>
+        NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
       </button>
     </div>
-    <div class="clearfix hidden-md"></div>
-  </div>
-  <div class="col-xs-24 dynamic-table-spacer">
-    <button type="button" class="btn btn-default btn-xs" ng-click="addProperty()" ng-disabled="xmlPreview.edit">
-      <span class="entypo plus"></span> add property
-    </button>
   </div>
 
-  <h4 class="col-xs-24"> Location </h4>
-  <label class="col-xs-7">name</label><label class="col-xs-17">path</label>
-  <div ng-repeat="location in clusterEntity.clusterModel.cluster.locations.location" class="col-xs-24">
-
-    <div class="row" ng-if="location._name === 'staging' || location._name === 'working' || location._name === 'temp'">
-      <div class="col-xs-7 dynamic-table-spacer">
-        {{location._name}}
-      </div>
-      <div class="col-xs-15 dynamic-table-spacer">
-        <input id="location.{{location._name}}" type="text" class="form-control" ng-model="location._path" ng-pattern="validations.patterns.osPath"
-               ng-disabled="xmlPreview.edit" ng-required="true" validation-message="{{validations.messages.location}}"/>
-      </div>
-      <div class="col-xs-2 dynamic-table-spacer"></div>
-      <div class="clearfix hidden-md"></div>
-    </div>
-
-    <div class="row" ng-if="location._name !== 'staging' && location._name !== 'working' && location._name !== 'temp'">
-      <div class="col-xs-7 dynamic-table-spacer">
-        <input type="text" class="form-control" ng-model="location._name"
-               validation-optional-message="{{validations.messages.name}}"
-               ng-pattern="validations.patterns.alpha"
-               ng-disabled="xmlPreview.edit" ng-required="location._path" placeholder="name" />
-      </div>
-      <div class="col-xs-15 dynamic-table-spacer">
-        <input type="text" class="form-control" ng-model="location._path"
-               validation-optional-message="{{validations.messages.path}}"
-               ng-pattern="validations.patterns.osPath"
-               ng-disabled="xmlPreview.edit" ng-required="location._name" placeholder="path" />
-      </div>
-      <div class="col-xs-2 dynamic-table-spacer">
-        <button class="btn btn-default btn-xs" ng-click="removeLocation($index)" ng-if="$index>3"
-             ng-disabled="xmlPreview.edit" >
-          <span class="entypo minus"></span> delete
-        </button>
-      </div>
-      <div class="clearfix hidden-md"></div>
-    </div>
-
-  </div>
-
-  <div class="col-xs-24 dynamic-table-spacer">
-    <button type="button" class="btn btn-default btn-xs" ng-click="addLocation()" ng-disabled="xmlPreview.edit">
-      <span class="entypo plus"></span> add location
-    </button>
-  </div>
-  <div class="col-xs-24 mt20">
-
-    <button id="cluster.step1" class="btn nextBtn pull-right" ng-disabled="xmlPreview.edit || buttonSpinners.show"
-         ng-click="goSummaryStep(clusterForm.$invalid)">
-      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
-    </a>
-
-  </div>
-
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html b/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html
index a7caad9..2c9c34d 100644
--- a/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html
+++ b/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html
@@ -18,70 +18,75 @@
  */
 -->
 <div class="row clusterSummaryRow" id="clusterSummaryStep">
+  <h4 class="col-sm-24">
+    General
+  </h4>
   <div class="col-sm-24">
-    <label>Name</label>: {{clusterEntity.clusterModel.cluster._name}}
+    <label>Cluster Name</label>:<span data-qe-id="clusterName"> {{clusterEntity.clusterModel.cluster._name}}</span>
   </div>
   <div class="col-sm-24">
-    <label>Colo</label>: {{clusterEntity.clusterModel.cluster._colo}}
+    <label>Data Center or Colo Name</label>:<span data-qe-id="clusterColo"> {{clusterEntity.clusterModel.cluster._colo}}</span>
   </div>
   <div class="col-sm-24">
-    <label>Description</label>: {{clusterEntity.clusterModel.cluster._description}}
+    <label>Description</label>:<span data-qe-id="clusterDescription"> {{clusterEntity.clusterModel.cluster._description}}</span>
   </div>
   <div class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.tags">
-    <label>Tags</label>: {{clusterEntity.clusterModel.cluster.tags}}
+    <label>Tags</label>:<span data-qe-id="clusterTags"> {{clusterEntity.clusterModel.cluster.tags}}</span>
   </div>
   <h4 class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.ACL">
-    ACL
+    Access Control List
   </h4>
   <div class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.ACL" >
-    <label>Owner</label>: {{clusterEntity.clusterModel.cluster.ACL._owner}}
-    <label>Group</label>: {{clusterEntity.clusterModel.cluster.ACL._group}}
-    <label>Permission</label>: {{clusterEntity.clusterModel.cluster.ACL._permission}}
+    <label>Owner</label>:<span data-qe-id="clusterACLOwner"> {{clusterEntity.clusterModel.cluster.ACL._owner}}</span>
+    <label>Group</label>:<span data-qe-id="clusterACLGroup"> {{clusterEntity.clusterModel.cluster.ACL._group}}</span>
+    <label>Permission</label>:<span data-qe-id="clusterACLPermission"> {{clusterEntity.clusterModel.cluster.ACL._permission}}</span>
   </div>
   <h4 class="col-sm-24">
     Interfaces
   </h4>
 
   <div class="col-sm-24" ng-repeat="_interface in clusterEntity.clusterModel.cluster.interfaces.interface">
-    <label>{{_interface._type}}</label>: {{_interface._endpoint}} - {{ _interface._version }}
+    <label>{{clusterInterfaceLabels(_interface._type)}}</label>:
+    <span data-qe-id="clusterInterface{{_interface._type}}">{{_interface._endpoint}}</span>
+     <!-- - <span data-qe-id="clusterInterface{{_interface._type}}Version">{{ _interface._version }}</span> -->
   </div>
 
   <h4 class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.properties">
     Properties
   </h4>
 
-  <div class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.properties.property.length > 0"
+  <div data-qe-id="clusterProps" class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.properties.property.length > 0"
     ng-repeat="property in clusterEntity.clusterModel.cluster.properties.property">
-    <label>{{property._name}}</label>: {{property._value}}
+    <label>{{property._name}}</label>:<span data-qe-id="clusterProp{{property._name}}"> {{property._value}}</span>
   </div>
 
   <h4 class="col-sm-24">
     Locations
   </h4>
 
-  <div class="col-sm-24" ng-repeat="location in clusterEntity.clusterModel.cluster.locations.location">
-    <label>{{location._name}}</label>: {{location._path}}
+  <div data-qe-id="clusterLocations" class="col-sm-24" ng-repeat="location in clusterEntity.clusterModel.cluster.locations.location">
+    <label data-qe-id="{{location._name}}">{{capitalize(location._name)}}</label>:<span data-qe-id="clusterLocation{{capitalize(location._name)}}"> {{location._path}}</span>
   </div>
 </div>
 
 
-<div class="row clusterSummaryRow">
-  <div class="col-xs-24 mt20">
-    <button id="cluster.backToStep1"
-         class="btn prevBtn"
-         ui-sref="forms.cluster.general"
-         ng-click="goGeneralStep()"
-         ng-disabled="buttonSpinners.backShow">
-      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
-    </button>
+<div class="col-xs-24 mt35 pb15px pl0px">
+  <button id="cluster.backToStep1"
+       class="btn prevBtn"
+       ui-sref="forms.cluster.general"
+       ng-click="goGeneralStep()"
+       ng-disabled="buttonSpinners.backShow">
+    PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+  </button>
 
-    <button id="cluster.step2" class="btn btn-default nextBtn pull-right"
-         ng-click="saveCluster()" ng-disabled="xmlPreview.edit || buttonSpinners.show">
-      Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-
-    <a class="pull-right" ui-sref="main">
-      Cancel
+  <div class="pull-right">
+    <a class="btn cnclBtn" ui-sref="main">
+      CANCEL
     </a>
+    <button id="cluster.step2" class="btn nextBtn"
+         ng-click="saveCluster()" ng-disabled="xmlPreview.edit || buttonSpinners.show">
+      SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
   </div>
-</div>
\ No newline at end of file
+
+</div>
diff --git a/falcon-ui/app/html/cluster/clusterFormTpl.html b/falcon-ui/app/html/cluster/clusterFormTpl.html
index 1a65172..7b7af5e 100644
--- a/falcon-ui/app/html/cluster/clusterFormTpl.html
+++ b/falcon-ui/app/html/cluster/clusterFormTpl.html
@@ -17,67 +17,72 @@
  * limitations under the License.
  */
 -->
-<div class="col-xs-22 col-xs-offset-1 clusterForm" id="clusterForm">
-  <div class="col-xs-24">
-    <div class="row">
-
-      <h3 id="cluster.title" class="col-xs-24">
-        <span class="entypo archive icon-lg"></span> New Cluster
-      </h3>
-
-      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-20' : !propsOpen}">
-        <div class="detailsBox">
-          <div class="clusterProgressBox" ng-class="{summary:secondStep===true}">
-            <div class="progressBar col-xs-24">
-              <div>
-              <span>
-                <div>1<span class="entypo check"></span></div>
-                <h6>General</h6>
-              </span>
-              <span>
-                <div>2</div>
-                <h6>Summary</h6>
-              </span>
-              </div>
-            </div>
-          </div>
-          <div class="row">
-            <div class="col-xs-offset-1 col-xs-22" ui-view></div>
-          </div>
+<div class="clusterForm">
+    <div class="col-xs-22">
+        <div class="preview pullOver">
+            <button id="previewXMLBtn" type="button" class="btn btn-default btn-md pull-right nextBtn"
+              ng-disabled="invalidXml && xmlPreview.edit" ng-click="toggleclick()" >Preview XML</button>
         </div>
-      </div>
-
-      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-4' : !propsOpen}">
-        <div class="detailsBox">
-          <div class="row">
-
-            <div class="col-xs-13 col-xs-offset-1 noSpecial">
-              <h5><i class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-minus-sign':'glyphicon-plus-sign'"></i> XML Preview</h5>
-            </div>
-
-            <div ng-if="propsOpen" class="col-xs-9">
-              <button type="button"
-                      id="cluster.editXML"
-                      class="btn btn-default btn-xs pull-right"
-                      ng-click="xmlPreview.editXML()"
-                      ng-class="{'btn-warning':xmlPreview.edit}">
-                <div ng-if="!xmlPreview.edit">Edit XML</div>
-                <div ng-if="xmlPreview.edit">Finish</div>
-              </button>
-            </div>
-
-            <div ng-show="propsOpen" class="col-xs-24">
-              <div class="row">
-                <div class="col-xs-22 col-xs-offset-1">
-                  <textarea ng-model="prettyXml" elastic class="form-control prettyXml" ng-disabled="!xmlPreview.edit"></textarea>
+        <br/>
+        <div class="formBoxContainer detailsBox">
+            <div class="row clusterProgressBox" ng-class="{summary:secondStep===true}">
+                <div class="progressBar col-xs-24">
+                    <div class="text-center" ng-class="{
+                active:isActive('forms.cluster.general'),
+                completed:isCompleted('forms.cluster.general')}">General</div>
+                    <div class="text-center" ng-class="{
+                active:isActive('forms.cluster.summary'),
+                completed:isCompleted('forms.cluster.summary')}">Summary</div>
                 </div>
-              </div>
             </div>
-
-          </div>
+            <div class="row customContainer">
+                <div class="col-xs-offset-1 col-xs-22">
+                    <div class="col-xs-24">
+                        <label class="title"><span class="entypo archive icon-lg entypo-align-sub"></span> NEW CLUSTER</label>
+                    </div>
+                    <div ui-view></div>
+                </div>
+            </div>
         </div>
-      </div>
 
+        <div class="hide xmlPreviewContainer detailsBox" >
+            <div class="row dt">
+                <div class="col-xs-24 pt15px">
+                    <div class="col-xs-13 noSpecial">
+                        <h5>XML Preview</h5>
+                        <label style="margin-top: -10px;margin-bottom: -2px;" ng-if="invalidXml" class="custom-danger">Invalid Xml</label>
+                    </div>
+
+                    <div class="pull-right">
+                        <button type="button"
+                                id="cluster.editXML"
+                                class="btn btn-default btn-xs"
+                                ng-click="xmlPreview.editXML()"
+                                ng-class="{'btn-warning':xmlPreview.edit}"
+                                ng-disabled="invalidXml">
+                            <div ng-if="!xmlPreview.edit">Edit XML</div>
+                            <div ng-if="xmlPreview.edit">Finish</div>
+                        </button>
+
+                        <button type="button"
+                                id="revertXMLBtn"
+                                class="btn btn-default btn-xs"
+                                ng-if="invalidXml"
+                                ng-click="revertXml()">
+                            <div>Revert</div>
+                        </button>
+                    </div>
+                </div>
+                <div class="col-xs-24 showValidationStyle">
+                    <textarea ng-model="prettyXml"
+                              elastic
+                              class="form-control"
+                              ng-disabled="!xmlPreview.edit"
+                              ng-class="{fakeInvalid:invalidXml}">
+                    </textarea>
+                </div>
+            </div>
+        </div>
     </div>
-  </div>
-</div>
\ No newline at end of file
+</div>
+</div>
diff --git a/falcon-ui/app/html/cluster/clusterSummary.html b/falcon-ui/app/html/cluster/clusterSummary.html
new file mode 100644
index 0000000..abad09a
--- /dev/null
+++ b/falcon-ui/app/html/cluster/clusterSummary.html
@@ -0,0 +1,77 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<div class="row clusterSummaryRow summaryBox" id="clusterSummaryStep">
+  <h5 class="col-sm-24">
+    General
+  </h5>
+  <div class="col-sm-24">
+    <label>Cluster Name</label>:<span> {{cluster.name}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Data Center or Colo Name</label>:<span> {{cluster.colo}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Description</label>:<span> {{cluster.description}}</span>
+  </div>
+
+  <div class="col-sm-24" ng-if="cluster.tags.length != 0">
+    <label>Tags</label>:
+  </div>
+
+  <div class="col-sm-24">
+    <div ng-repeat="tag in cluster.tags | filter:{key: '!!'}">
+      {{tag.key}} = {{tag.value}}
+    </div>
+  </div>
+
+  <h5 class="col-sm-24" ng-if="cluster.ACL">
+    Access Control List
+  </h5>
+  <div class="col-sm-24" ng-if="cluster.ACL" >
+    <label>Owner</label>:<span> {{cluster.ACL.owner}}</span>
+    <label>Group</label>:<span> {{cluster.ACL.group}}</span>
+    <label>Permission</label>:<span> {{cluster.ACL.permission}}</span>
+  </div>
+
+  <h5 class="col-sm-24">
+    Interfaces
+  </h5>
+
+  <div class="col-sm-24" ng-repeat="interface in cluster.interfaces">
+    <label>{{clusterInterfaceLabels(interface.type)}}</label>:<span> {{interface.endpoint}} - {{ interface.version }}<span>
+  </div>
+
+  <h5 class="col-sm-24" ng-if="cluster.properties">
+    Properties
+  </h5>
+
+  <div class="col-sm-24" ng-if="cluster.properties.length > 0"
+    ng-repeat="property in cluster.properties">
+    <label>{{property.key}}</label>:<span> {{property.value}}</span>
+  </div>
+
+  <h5 class="col-sm-24">
+    Locations
+  </h5>
+
+  <div class="col-sm-24" ng-repeat="location in cluster.locations">
+    <label>{{capitalize(location.name)}}</label>:<span> {{location.path}}</span>
+  </div>
+</div>
diff --git a/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html b/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html
index 458a25b..bb0d7a7 100644
--- a/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html
+++ b/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html
@@ -19,700 +19,774 @@
 -->
 <form id="formGeneralBox"
       name="datasetForm"
-      class="col-xs-24"
       novalidate>
 
-  <div class="row">
-    <div class="col-xs-24">
-      <label class="db"> Mirror Name
-        <input type="text"
-               name="nameInput"
-               class="form-control"
-               ng-model="UIModel.name"
-               placeholder=""
-               ng-disabled="!cloningMode"
-               ng-pattern="validations.patterns.name"
-               ng-required="true"
-               check-name="{type:'process', check:clone}"/>
-      </label>
-    </div>
+  <div class="col-xs-8">
+    <label class="light" tooltip="dataset.name">Mirror Name<mandatory-field></mandatory-field></label>
+    <input type="text"
+           name="nameInput"
+           class="form-control"
+           ng-model="UIModel.name"
+           placeholder=""
+           ng-disabled="editingMode"
+           ng-pattern="validations.patterns.name"
+           ng-required="true"
+           check-name="{type:'process', check:!editingMode}"/>
+    </label>
+  </div>
 
-    <div class="col-xs-24 tagsBox mt10">
-      <label class="db">Tags
-
-        <div class="row mb10">
-          <div class="col-xs-10">
-            <input type="text"
-                   name="newTagKeyInput"
-                   class="form-control"
-                   ng-model="UIModel.tags.newTag.key"
-                   placeholder="key"
-                   ng-pattern="validations.patterns.alpha"
-                   ng-required="UIModel.tags.newTag.value"
-                   validation-optional-message="{{validations.messages.key}}"/>
+  <div class="col-xs-24 tagsBox plr0px">
+    <label class="col-xs-24 light">Tags</label>
+    <div class="col-xs-12">
+      <div ng-repeat="tag in UIModel.tags">
+        <div class="row dynamic-table-spacer">
+          <div class="col-xs-8">
+            <input type="text" class="form-control" ng-model="tag.key"
+              validation-optional-message="{{validations.messages.key}}"
+                ng-pattern="validations.patterns.alpha" ng-required="tag.value" placeholder="key"/>
           </div>
-          <div class="col-xs-10">
-            <input type="text"
-                   name="newTagValueInput"
-                   class="form-control"
-                   ng-model="UIModel.tags.newTag.value"
-                   placeholder="value"
-                   ng-pattern="validations.patterns.alpha"
-                   ng-required="UIModel.tags.newTag.key"
-                   validation-optional-message="{{validations.messages.value}}"/>
+          <div class="col-xs-8">
+            <input type="text" class="form-control" validation-optional-message="{{validations.messages.value}}"
+                ng-model="tag.value" ng-pattern="validations.patterns.alpha"
+                ng-required="tag.key" placeholder="value"/>
           </div>
-          <div class="col-xs-4">
-            <button type="button"
-                    class="btn btn-default btn-xs"
-                    ng-click="addTag()"
-                    ng-disabled="!UIModel.tags.newTag.key || !UIModel.tags.newTag.value"
-                    ng-disabled="false">
-              <span class="glyphicon glyphicon-plus"></span> add tag
+          <div class="col-xs-8">
+            <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="!$first || !$last">
+              <span class="entypo minus"></span> delete
+            </button>
+            <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-if="$last">
+              <span class="entypo plus"></span> add tag
             </button>
           </div>
         </div>
-
-        <div ng-repeat="tag in UIModel.tags.tagsArray" class="row">
-          <div class="col-xs-10">
-            <h6>{{tag.key}}</h6>
-          </div>
-          <div class="col-xs-10">
-            <h6>{{tag.value}}</h6>
-          </div>
-          <div class="col-xs-4" ng-if="tag.key !== '_falcon_mirroring_type'">
-            <button type="button"
-                    class="btn btn-default btn-xs"
-                    ng-click="removeTag($index)"
-                    ng-disabled="false">
-              <span class="glyphicon glyphicon-minus"></span> delete
-            </button>
-          </div>
-        </div>
-
-      </label>
-    </div>
-  </div>
-  <div class="row">
-    <div class="col-xs-24 mt10">
-      <label class="db">Mirror type
-        <div class="typeButtonsBox">
-          <button type="button"
-                  ng-class="{active:UIModel.formType === 'HDFS'}"
-                  class="btn btn-default btn-xs"
-                  ng-click="switchModel('HDFS')">
-            File System
-          </button>
-          <button type="button"
-                  ng-class="{active:UIModel.formType === 'HIVE'}"
-                  class="btn btn-default btn-xs"
-                  ng-click="switchModel('HIVE')">
-            HIVE(catalog Storage)
-          </button>
-        </div>
-      </label>
+      </div>
     </div>
   </div>
 
-  <div class="row">
-    <div class="col-xs-24 clusterBox">
-      <h3>Source</h3>
-      <div class="runJobOnBox">
-        <input type="radio"
-               id="runJobOnSourceRadio"
-               ng-model="UIModel.runOn",
-               value="source"
-               ng-required="true"
-               ng-disabled="UIModel.source.location !== 'HDFS'"/>
-        Run job here
-      </div>
-
-      <div class="locationBox" ng-if="UIModel.formType === 'HDFS'">
-        <label class="db">Location:
-          <span>
-            <input type="radio"
-                   ng-change="checkFromSource()"
-                   id="sourceHDFSRadio"
-                   ng-model="UIModel.source.location"
-                   value="HDFS"
-                   ng-required="!UIModel.source.location"/> HDFS
-          </span>
-          <span ng-if="UIModel.target.location === 'HDFS'">
-            <input type="radio"
-                   ng-change="checkFromSource()"
-                   id="sourceAzureRadio"
-                   ng-model="UIModel.source.location"
-                   value="azure"
-                   ng-required="!UIModel.source.location"/> Azure
-          </span>
-          <span ng-if="UIModel.target.location === 'HDFS'">
-            <input type="radio"
-                   ng-change="checkFromSource()"
-                   id="sourceS3Radio"
-                   ng-model="UIModel.source.location"
-                   value="s3"
-                   ng-required="!UIModel.source.location"/> S3
-          </span>
-
-        </label>
-      </div>
-
-      <div>
-        <select ng-if="UIModel.source.location === 'HDFS' || UIModel.formType === 'HIVE'"
-                ng-model="UIModel.source.cluster"
-                name="sourceClusterSelect"
-                ng-change="getSourceDefinition()"
-                ng-required="UIModel.source.location === 'HDFS' || UIModel.formType === 'HIVE'"
-                class="col-xs-24 form-control"
-                id="sourceClusterSelect">
-
-          <option value="" disabled style='display:none;'>-Select cluster-</option>
-          <option ng-selected="UIModel.source.cluster === cluster.name"
-                  ng-repeat="cluster in clustersList"
-                  value="{{cluster.name}}">
-            {{cluster.name}}
-          </option>
-        </select>
-      </div>
-
-      <div ng-if="UIModel.source.location === 'azure' && UIModel.formType === 'HDFS'">
-        <label class="db">Base URL
-          <input type="text"
-                 name="sourceClusterUrlInput"
-                 class="form-control"
-                 ng-model="UIModel.source.url"
-                 placeholder="URL"
-                 ng-pattern="validations.patterns.azure"
-                 ng-required="UIModel.source.location === 'azure'"
-                 validation-message="{{validations.messages.azure}}" />
-        </label>
-      </div>
-      <div ng-if="UIModel.source.location === 's3' && UIModel.formType === 'HDFS'">
-        <label class="db">Base URL
-          <input type="text"
-                 name="sourceClusterUrlInput"
-                 class="form-control"
-                 ng-model="UIModel.source.url"
-                 placeholder="URL"
-                 ng-pattern="validations.patterns.s3"
-                 ng-required="UIModel.source.location === 's3'"
-                 validation-message="{{validations.messages.s3}}" />
-        </label>
-      </div>
-
-      <div ng-if="UIModel.formType === 'HDFS'">
-        <label class="db">Path
-          <input type="text"
-                 name="sourceClusterPathInput"
-                 class="form-control"
-                 ng-model="UIModel.source.path"
-                 placeholder="Path"
-                 ng-pattern="validations.patterns.osPath"
-                 ng-required="UIModel.source.location === 'HDFS' || UIModel.formType === 'HIVE'"
-                 validation-message="{{validations.messages.path}}"/>
-        </label>
-      </div>
-
-      <div ng-if="UIModel.formType === 'HIVE'">
-        <h5 class="hiveDatabasesTitol">I want to copy</h5>
-        <div class="databaseRadioBox">
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-12 plr0px">
+      <div class="col-xs-24 clusterBox plr0px">
+        <h3>Source</h3>
+        <div class="runJobOnBox">
           <input type="radio"
-                 id="targetHIVEDatabaseRadio"
-                 ng-model="UIModel.source.hiveDatabaseType"
-                 value="databases"
-                 ng-required="!UIModel.source.location"/> Entire databases
-          <input type="radio"
-                 id="targetHIVETablesRadio"
-                 ng-model="UIModel.source.hiveDatabaseType"
-                 value="tables"
-                 ng-required="!UIModel.source.hiveDatabaseType"/> Tables in a single database
+                 id="runJobOnSourceRadio"
+                 ng-model="UIModel.runOn"
+                 value="source"
+                 ng-required="true"
+                 ng-disabled="UIModel.source.location !== 'HDFS'"/>
+          Run job here
         </div>
 
-        <div ng-if="UIModel.source.hiveDatabaseType === 'databases'">
-          <label class="db">Databases (comma separated)
-            <textarea name="sourceDatabasesInput"
-                      class="form-control databasesTextArea"
-                      ng-model="UIModel.source.hiveDatabases"
-                      ng-pattern="validations.patterns.textarea"
-                      ng-required="UIModel.target.location === 'HDFS'"
-                      validation-message="{{validations.messages.databases}}"
-                      ng-keydown="validations.acceptNoSpaces($event)">
-            </textarea>
-          </label>
+        <div class="locationBox" ng-if="UIModel.type === 'HDFS'">
+          <div class="col-xs-5"><label class="light">Location</label></div>
+          <div class="col-xs-3"><label class="mt15 radio-inline">
+              <input type="radio"
+                     ng-change="checkFromSource()"
+                     id="sourceHDFSRadio"
+                     ng-model="UIModel.source.location"
+                     value="HDFS"
+                     ng-required="!UIModel.source.location"/> HDFS
+              </label>
+          </div>
+          <div class="col-xs-3"><label class="mt15 radio-inline">
+              <input type="radio"
+                     ng-change="checkFromSource()"
+                     id="sourceAzureRadio"
+                     ng-model="UIModel.source.location"
+                     value="azure"
+                     ng-required="!UIModel.source.location"/> Azure
+              </label>
+          </div>
+          <div class="col-xs-1"><label class="mt15 radio-inline">
+              <input type="radio"
+                     ng-change="checkFromSource()"
+                     id="sourceS3Radio"
+                     ng-model="UIModel.source.location"
+                     value="s3"
+                     ng-required="!UIModel.source.location"/> S3
+              </label>
+          </div>
         </div>
-        <div ng-if="UIModel.source.hiveDatabaseType === 'tables'">
-          <label class="db">Database
+
+        <div class="col-xs-24" ng-if="UIModel.source.location === 'HDFS' || UIModel.type === 'HIVE'">
+          <div class="col-xs-5 p0"><label class="light">Cluster<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
+              <select ng-model="UIModel.source.cluster"
+                  name="sourceClusterSelect"
+                  ng-change="getSourceDefinition()"
+                  ng-required="UIModel.source.location === 'HDFS' || UIModel.type === 'HIVE'"
+                  class="form-control padding0"
+                  id="sourceClusterSelect">
+
+                <option value="" disabled style='display:none;'>-Select cluster-</option>
+                <option ng-selected="UIModel.source.cluster === cluster.name"
+                        ng-repeat="cluster in clustersList"
+                        value="{{cluster.name}}">
+                  {{cluster.name}}
+                </option>
+              </select>
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.source.location === 'azure' && UIModel.type === 'HDFS'">
+          <div class="col-xs-5 p0"><label class="light">Base URL<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
             <input type="text"
-                   name="sourceDatabaseInput"
+                   name="sourceClusterUrlInput"
                    class="form-control"
-                   ng-model="UIModel.source.hiveDatabase"
-                   ng-pattern="validations.patterns.textarea"
+                   ng-model="UIModel.source.url"
+                   placeholder="URL"
+                   ng-pattern="validations.patterns.azure"
+                   ng-required="UIModel.source.location === 'azure'"
+                   validation-message="{{validations.messages.azure}}" />
+          </div>
+        </div>
+        <div class="col-xs-24" ng-if="UIModel.source.location === 's3' && UIModel.type === 'HDFS'">
+          <div class="col-xs-5 p0"><label class="light">Base URL<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="sourceClusterUrlInput"
+                   class="form-control"
+                   ng-model="UIModel.source.url"
+                   placeholder="URL"
+                   ng-pattern="validations.patterns.s3"
+                   ng-required="UIModel.source.location === 's3'"
+                   validation-message="{{validations.messages.s3}}" />
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.type === 'HDFS'">
+          <div class="col-xs-5 p0"><label class="light">Path<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="sourceClusterPathInput"
+                   class="form-control"
+                   ng-model="UIModel.source.path"
+                   placeholder="Path"
+                   ng-pattern="validations.patterns.osPath"
+                   ng-required="UIModel.source.location === 'HDFS' || UIModel.type === 'HIVE'"
+                   validation-message="{{validations.messages.path}}"/>
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE'">
+          <div class="col-xs-5 p0">
+            <label class="light" tooltip="dataset.sourceHiveServer2Uri">HiveServer2 endpoint</label>
+          </div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="sourceHiveServerInput"
+                   ng-model="UIModel.hiveOptions.source.hiveServerToEndpoint"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.path}}" />
+          </div>
+        </div>
+
+        <div class="col-xs-24 mt5" ng-if="UIModel.type === 'HIVE'">
+          <div class="col-xs-5 p0">
+            <label class="light">I want to copy<mandatory-field></mandatory-field></label>
+          </div>
+          <div class="col-xs-4"><label class="mt15 radio-inline">
+              <input type="radio"
+                   id="targetHIVEDatabaseRadio"
+                   ng-model="UIModel.source.hiveDatabaseType"
+                   value="databases"
+                   ng-required="!UIModel.source.location"/>Entire databases
+            </label>
+          </div>
+          <div><label class="mt15 radio-inline">
+              <input type="radio"
+                   id="targetHIVETablesRadio"
+                   ng-model="UIModel.source.hiveDatabaseType"
+                   value="tables"
+                   ng-required="!UIModel.source.hiveDatabaseType"/>
+              Tables in a single database
+            </label>
+          </div>
+
+          <div class="col-xs-24 mt5 plr0px">
+              <div class="col-xs-13 col-xs-offset-5" ng-if="UIModel.source.hiveDatabaseType === 'databases'">
+                <label class="col-xs-24 p0 light" tooltip="dataset.sourceDatabases">Databases (comma separated)<mandatory-field></mandatory-field></label>
+                <textarea name="sourceDatabasesInput"
+                          class="form-control databasesTextArea"
+                          ng-model="UIModel.source.hiveDatabases"
+                          ng-pattern="validations.patterns.hiveDatabases"
+                          ng-required="UIModel.target.location === 'HDFS'"
+                          validation-message="{{validations.messages.databases}}"
+                          ng-keydown="validations.acceptNoSpaces($event)">
+                </textarea>
+              </div>
+              <div class="col-xs-13 col-xs-offset-5" ng-if="UIModel.source.hiveDatabaseType === 'tables'">
+                <label class="col-xs-24 p0 light">Database<mandatory-field></mandatory-field></label>
+                <input type="text"
+                       name="sourceDatabaseInput"
+                       class="form-control"
+                       ng-model="UIModel.source.hiveDatabases"
+                       ng-pattern="validations.patterns.hiveDatabase"
+                       ng-required="UIModel.target.location === 'HDFS'"
+                       validation-message="{{validations.messages.database}}"
+                       ng-keydown="validations.acceptNoSpaces($event)"/>
+                <label class="col-xs-24 p0 light" tooltip="dataset.sourceTables">Tables (comma separated)<mandatory-field></mandatory-field></label>
+                <textarea name="sourceTablesInput"
+                          class="form-control tablesTextArea"
+                          ng-model="UIModel.source.hiveTables"
+                          ng-pattern="validations.patterns.hiveTables"
+                          ng-required="UIModel.target.location === 'HDFS'"
+                          validation-message="{{validations.messages.tables}}"
+                          ng-keydown="validations.acceptNoSpaces($event)">
+                  </textarea>
+              </div>
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE' && secureMode === true">
+          <div class="col-xs-5 p0">
+            <label class="light" tooltip="dataset.sourceHive2KerberosPrincipal">Hive2 Kerberos Principal<mandatory-field></mandatory-field></label>
+          </div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="sourceHive2KerberosPrincipal"
+                   class="form-control"
+                   ng-model="UIModel.source.hive2KerberosPrincipal"
+                   placeholder="Source Metastore URI"
+                   ng-pattern="validations.patterns.kerberosPrincipal"
+                   ng-required="UIModel.type === 'HIVE'"
+                   validation-message="{{validations.messages.kerberosPrincipal}}" />
+          </div>
+        </div>
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE' && secureMode === true">
+          <div class="col-xs-5 p0">
+            <label class="light">Meta Store URI<mandatory-field></mandatory-field></label>
+          </div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="sourceMetastoreUri"
+                   class="form-control"
+                   ng-model="UIModel.source.hiveMetastoreUri"
+                   placeholder="Source Metastore URI"
+                   ng-pattern="validations.patterns.metastoreUri"
+                   ng-required="UIModel.type === 'HIVE'"
+                   validation-message="{{validations.messages.metastoreUri}}" />
+          </div>
+        </div>
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE' && secureMode === true">
+          <div class="col-xs-5 p0">
+            <label class="light">Kerberos Principal<mandatory-field></mandatory-field></label>
+          </div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="sourceMetastoreKerberosPrincipal"
+                   class="form-control"
+                   ng-model="UIModel.source.hiveMetastoreKerberosPrincipal"
+                   placeholder="Kerberos Principal"
+                   ng-pattern="validations.patterns.kerberosPrincipal"
+                   ng-required="UIModel.type === 'HIVE'"
+                   validation-message="{{validations.messages.kerberosPrincipal}}" />
+          </div>
+        </div>
+
+      </div>
+    </div>
+
+    <div class="col-xs-12 plr0px pl5">
+      <div class="col-xs-24 plr0px clusterBox">
+        <h3>Target</h3>
+        <div class="runJobOnBox">
+          <input type="radio"
+                 id="runJobOnTargetRadio"
+                 ng-model="UIModel.runOn"
+                 value="target"
+                 ng-required="true"
+                 ng-disabled="UIModel.target.location !== 'HDFS'"/>
+          Run job here
+        </div>
+        <div class="locationBox" ng-if="UIModel.type === 'HDFS'">
+          <div class="col-xs-5"><label class="light">Location</label></div>
+          <div class="col-xs-3"><label class="mt15 radio-inline">
+              <input type="radio"
+                     ng-change="checkFromTarget()"
+                     id="targetHDFSRadio"
+                     ng-model="UIModel.target.location"
+                     value="HDFS"
+                     ng-required="!UIModel.target.location"/> HDFS
+                </label>
+          </div>
+          <div class="col-xs-3"><label class="mt15 radio-inline">
+              <input type="radio"
+                     ng-change="checkFromTarget()"
+                     id="targetAzureRadio"
+                     ng-model="UIModel.target.location"
+                     value="azure"
+                     ng-required="!UIModel.target.location"/> Azure
+                </label>
+          </div>
+          <div class="col-xs-1"><label class="mt15 radio-inline">
+              <input type="radio"
+                     ng-change="checkFromTarget()"
+                     id="targetS3Radio"
+                     ng-model="UIModel.target.location"
+                     value="S3"
+                     ng-required="!UIModel.target.location"/> S3
+                </label>
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.target.location === 'HDFS' || UIModel.type === 'HIVE'">
+          <div class="col-xs-5 p0">
+            <label class="light">Cluster<mandatory-field></mandatory-field></label>
+          </div>
+          <div class="col-xs-13 mt10">
+              <select ng-model="UIModel.target.cluster"
+                  ng-change="getTargetDefinition()"
+                  name="targetClusterSelect"
+                  ng-required="UIModel.target.location === 'HDFS' || UIModel.type === 'HIVE'"
+                  class="col-xs-24 form-control padding0"
+                  id="targetClusterSelect">
+                <option value="" disabled selected style='display:none;'>-Select cluster-</option>
+                <option ng-selected="UIModel.target.cluster === clusterItem.name"
+                        ng-repeat="clusterItem in clustersList"
+                        value="{{clusterItem.name}}">
+                  {{clusterItem.name}}
+                </option>
+              </select>
+              <div class="custom-danger" ng-show="clusterErrorMessage != ''">
+                {{clusterErrorMessage}}
+              </div>
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE'">
+          <div class="col-xs-5 p0">
+            <label class="light" tooltip="dataset.targetHiveServer2Uri">HiveServer2 endpoint</label>
+          </div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="targetHiveServerInput"
+                   ng-model="UIModel.hiveOptions.target.hiveServerToEndpoint"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.path}}" />
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE'&& secureMode === true">
+          <div class="col-xs-5 p0">
+            <label class="light" tooltip="dataset.targetHive2KerberosPrincipal">Hive2 Kerberos Principal<mandatory-field></mandatory-field></label>
+          </div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="targetHive2KerberosPrincipal"
+                   class="form-control"
+                   ng-model="UIModel.target.hive2KerberosPrincipal"
+                   placeholder="Hive2 Kerberos Principal"
+                   ng-pattern="validations.patterns.kerberosPrincipal"
+                   ng-required="UIModel.type === 'HIVE'"
+                   validation-message="{{validations.messages.kerberosPrincipal}}" />
+          </div>
+        </div>
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE'&& secureMode === true">
+          <div class="col-xs-5 p0"><label class="light">Meta Store URI<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="targetMetastoreUri"
+                   class="form-control"
+                   ng-model="UIModel.target.hiveMetastoreUri"
+                   placeholder="Target Metastore URI"
+                   ng-pattern="validations.patterns.metastoreUri"
+                   ng-required="UIModel.type === 'HIVE'"
+                   validation-message="{{validations.messages.metastoreUri}}" />
+          </div>
+        </div>
+        <div class="col-xs-24" ng-if="UIModel.type === 'HIVE' && secureMode === true">
+          <div class="col-xs-5 p0">
+            <label class="light">Kerberos Principal<mandatory-field></mandatory-field></label>
+          </div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="targetMetastoreKerberosPrincipal"
+                   class="form-control"
+                   ng-model="UIModel.target.hiveMetastoreKerberosPrincipal"
+                   placeholder="Kerberos Principal"
+                   ng-pattern="validations.patterns.kerberosPrincipal"
+                   ng-required="UIModel.type === 'HIVE'"
+                   validation-message="{{validations.messages.kerberosPrincipal}}" />
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.target.location === 'azure' && UIModel.type === 'HDFS'">
+          <div class="col-xs-5 p0"><label class="light">Base URL<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="targetClusterUrlInput"
+                   class="form-control"
+                   ng-model="UIModel.target.url"
+                   placeholder="URL"
+                   ng-pattern="validations.patterns.azure"
+                   ng-required="UIModel.target.location === 'azure'"
+                   validation-message="{{validations.messages.azure}}"/>
+          </div>
+        </div>
+        <div class="col-xs-24" ng-if="UIModel.target.location === 'S3' && UIModel.type === 'HDFS'">
+          <div class="col-xs-5 p0"><label class="light">Base URL<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="targetClusterUrlInput"
+                   class="form-control"
+                   ng-model="UIModel.target.url"
+                   placeholder="URL"
+                   ng-pattern="validations.patterns.s3"
+                   ng-required="UIModel.target.location === 'S3'"
+                   validation-message="{{validations.messages.s3}}"/>
+          </div>
+        </div>
+
+        <div class="col-xs-24" ng-if="UIModel.type === 'HDFS'">
+          <div class="col-xs-5 p0"><label class="light">Path<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-13 mt10">
+            <input type="text"
+                   name="targetClusterPathInput"
+                   class="form-control"
+                   ng-model="UIModel.target.path"
+                   placeholder="Path"
+                   ng-pattern="validations.patterns.osPath"
                    ng-required="UIModel.target.location === 'HDFS'"
-                   validation-message="{{validations.messages.database}}"
-                   ng-keydown="validations.acceptNoSpaces($event)"/>
-          </label>
-          <label class="db">Tables (comma separated)
-            <textarea name="sourceTablesInput"
-                      class="form-control tablesTextArea"
-                      ng-model="UIModel.source.hiveTables"
-                      ng-pattern="validations.patterns.textarea"
-                      ng-required="UIModel.target.location === 'HDFS'"
-                      validation-message="{{validations.messages.tables}}"
-                      ng-keydown="validations.acceptNoSpaces($event)">
-            </textarea>
-          </label>
+                   validation-message="{{validations.messages.path}}"/>
+          </div>
         </div>
       </div>
-
-    </div>
-
-    <div class="col-xs-24 clusterBox">
-      <h3>Target</h3>
-      <div class="runJobOnBox">
-        <input type="radio"
-               id="runJobOnTargetRadio"
-               ng-model="UIModel.runOn"
-               value="target"
-               ng-required="true"
-               ng-disabled="UIModel.target.location !== 'HDFS'"/>
-        Run job here
-      </div>
-
-      <div class="locationBox" ng-if="UIModel.formType === 'HDFS'">
-        <label class="db">Location:
-
-          <input type="radio"
-                 ng-change="checkFromTarget()"
-                 id="targetHDFSRadio"
-                 ng-model="UIModel.target.location"
-                 value="HDFS"
-                 ng-required="!UIModel.target.location"/> HDFS
-          <span ng-if="UIModel.source.location === 'HDFS'">
-            <input type="radio"
-                   ng-change="checkFromTarget()"
-                   id="targetAzureRadio"
-                   ng-model="UIModel.target.location"
-                   value="azure"
-                   ng-required="!UIModel.target.location"/> Azure
-          </span>
-          <span ng-if="UIModel.source.location === 'HDFS'">
-            <input type="radio"
-                   ng-change="checkFromTarget()"
-                   id="targetS3Radio"
-                   ng-model="UIModel.target.location"
-                   value="S3"
-                   ng-required="!UIModel.target.location"/> S3
-          </span>
-        </label>
-      </div>
-
-      <div>
-        <select ng-if="UIModel.target.location === 'HDFS' || UIModel.formType === 'HIVE'"
-                ng-model="UIModel.target.cluster"
-                ng-change="getTargetDefinition()"
-                name="targetClusterSelect"
-                ng-required="UIModel.target.location === 'HDFS' || UIModel.formType === 'HIVE'"
-                class="col-xs-24 form-control"
-                id="targetClusterSelect">
-          <option value="" disabled selected style='display:none;'>-Select cluster-</option>
-          <option ng-selected="UIModel.target.cluster === clusterItem.name"
-                  ng-repeat="clusterItem in clustersList"
-                  value="{{clusterItem.name}}">
-            {{clusterItem.name}}
-          </option>
-        </select>
-      </div>
-
-      <div ng-if="UIModel.target.location === 'azure' && UIModel.formType === 'HDFS'">
-        <label class="db">Base URL
-          <input type="text"
-                 name="targetClusterUrlInput"
-                 class="form-control"
-                 ng-model="UIModel.target.url"
-                 placeholder="URL"
-                 ng-pattern="validations.patterns.azure"
-                 ng-required="UIModel.target.location === 'azure'"
-                 validation-message="{{validations.messages.azure}}"/>
-        </label>
-      </div>
-      <div ng-if="UIModel.target.location === 'S3' && UIModel.formType === 'HDFS'">
-        <label class="db">Base URL
-          <input type="text"
-                 name="targetClusterUrlInput"
-                 class="form-control"
-                 ng-model="UIModel.target.url"
-                 placeholder="URL"
-                 ng-pattern="validations.patterns.s3"
-                 ng-required="UIModel.target.location === 'S3'"
-                 validation-message="{{validations.messages.s3}}"/>
-        </label>
-      </div>
-
-      <div ng-if="UIModel.formType === 'HDFS'">
-        <label class="db">Path
-          <input type="text"
-                 name="targetClusterPathInput"
-                 class="form-control"
-                 ng-model="UIModel.target.path"
-                 placeholder="Path"
-                 ng-pattern="validations.patterns.osPath"
-                 ng-required="UIModel.target.location === 'HDFS'"
-                 validation-message="{{validations.messages.path}}"/>
-        </label>
-      </div>
-
     </div>
   </div>
 
-  <div class="row">
-    <div class="col-xs-24 validityBox">
-      <h4>Validity </h4>
-      <div class="startDateBox">
-        <label>Start
-          <input type="text"
-                 name="startDateInput"
-                 class="form-control dateInput"
-                 placeholder="mm/dd/yyyy"
-                 datepicker-popup="{{dateFormat}}"
-                 ng-model="UIModel.validity.start"
-                 is-open="$parent.startOpened"
-                 ng-click="openStartDatePicker($event)"
-                 ng-change="constructDate()"
-                 ng-required="true"
-                 simple-date>
-        </label>
-      </div>
-      <div class="startTimeBox">
-        <label>Time
-          <timepicker ng-change="constructDate()"
-                      ng-model="UIModel.validity.startTime"
-                      hour-step="1"
-                      minute-step="1"
-                      show-meridian="true">
-          </timepicker>
-        </label>
-      </div>
-      <div class="endDateBox">
-        <label>End
-          <input type="text"
-                 name="startDateInput"
-                 class="form-control dateInput"
-                 placeholder="mm/dd/yyyy"
-                 datepicker-popup="{{dateFormat}}"
-                 ng-model="UIModel.validity.end"
-                 is-open="$parent.endOpened"
-                 ng-click="openEndDatePicker($event)"
-                 ng-change="constructDate()"
-                 min-date="UIModel.validity.start"
-                 ng-required="true"
-                 simple-date>
-        </label>
-      </div>
-      <div class="endTimeBox">
-        <label>Time
-          <timepicker ng-change="constructDate()"
-                      ng-model="UIModel.validity.endTime"
-                      hour-step="1"
-                      minute-step="1"
-                      show-meridian="true">
-          </timepicker>
-        </label>
-      </div>
-      <div class="tzBox">
-        <label> &nbsp;
-          <time-zone-select
-                  ng-model="UIModel.validity.tz"
-                  class="">
-          </time-zone-select>
-          </label>
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-12 plr0px clusterBoxEndLine">
+    </div>
+    <div class="col-xs-12 plr0px pl5">
+      <div class="col-xs-24 plr0px clusterBoxEndLine">
       </div>
     </div>
   </div>
 
-  <div class="row">
-    <div class="col-xs-24 alertsBox">
+    <div class="col-xs-24"><label class="mt15">Validity</label></div>
+    <div class="col-xs-24 validityBox plr0px">
+      <div class="col-xs-24 plr0px">
+        <div class="startDateBox col-xs-4">
+          <label class="light">Start<mandatory-field></mandatory-field></label>
+          <input type="text"
+            name="startDateInput"
+            class="form-control dateInput"
+            placeholder="{{dateFormat | lowercase}}"
+            ng-model="UIModel.validity.start.date"
+            ng-required="true"
+            simple-date-picker />
+        </div>
+        <div class="startTimeBox col-xs-4">
+          <label class="light">Begin Time<mandatory-field></mandatory-field></label>
+          <timepicker ng-change="constructDate()"
+                      ng-model="UIModel.validity.start.time"
+                      ng-required="true"
+                      hour-step="1"
+                      minute-step="1"
+                      show-meridian="true">
+          </timepicker>
+        </div>
+      </div>
+      <div class="col-xs-24 plr0px">
+        <div class="endDateBox col-xs-4">
+          <label class="light">End<mandatory-field></mandatory-field></label>
+          <input type="text"
+            name="startDateInput"
+            class="form-control dateInput"
+            placeholder="{{dateFormat | lowercase}}"
+            ng-model="UIModel.validity.end.date"
+            ng-required="true"
+            simple-date-picker />
+        </div>
+        <div class="endTimeBox col-xs-4">
+          <label class="light">End Time<mandatory-field></mandatory-field></label>
+          <timepicker ng-change="constructDate()"
+                      ng-model="UIModel.validity.end.time"
+                      ng-required="true"
+                      hour-step="1"
+                      minute-step="1"
+                      show-meridian="true">
+          </timepicker>
+        </div>
+      </div>
+    </div>
+
+    <div class="frequencyBox">
+      <div class="col-xs-24">
+        <label>Frequency</label>
+      </div>
+      <div class="col-xs-24 plr0px">
+        <div class="col-xs-24">
+          <label class="light">Repeat Every</label>
+        </div>
+        <div class="col-xs-2">
+          <input type="text"
+                 name="frequencyQuantity"
+                 ng-model="UIModel.frequency.quantity"
+                 ng-pattern="validations.patterns.twoDigits"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 ng-keyup="checkMininumFrequency(UIModel.frequency.quantity, UIModel.frequency.unit, datasetForm.frequencyQuantity)"
+                 class="form-control"
+                 ng-required="true"
+                 validation-optional-message="{{validations.messages.number}}" />
+        </div>
+        <div class="col-xs-6">
+          <select ng-model="UIModel.frequency.unit" class="form-control padding0" ng-required="true"
+            ng-change="checkMininumFrequency(UIModel.frequency.quantity, UIModel.frequency.unit, datasetForm.frequencyQuantity)">
+            <option selected value="minutes">minutes</option>
+            <option value="hours">hours</option>
+            <option value="days">days</option>
+            <option value="months">months</option>
+          </select>
+        </div>
+        <div class="col-xs-24 custom-danger" ng-if="!isFrequencyValid">{{validations.messages.frequency.minimum}}</div>
+      </div>
+    </div>
+
+    <div class="tzBox col-xs-8">
+      <label class="light">Timezone<mandatory-field></mandatory-field></label>
+      <time-zone-select ng-model="UIModel.validity.timezone"></time-zone-select>
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light" tooltip="dataset.jobNotificationReceivers">Send alerts to</label>
+    </div>
+    <div class="col-xs-24 alertsBox plr0px">
       <div class="emailBox">
-        <label>
-          <h4>Send alerts to </h4>
+        <div class="col-xs-8">
           <input class="form-control"
                  name="emailAlertInput"
-                 ng-model="UIModel.alerts.alert.email"
+                 ng-model="UIModel.alert.email"
                  type="text"
                  placeholder="Email"
                  ng-pattern="validations.patterns.email"
-                 validation-optional-message="{{validations.messages.email}}">
-        </label>
+                 validation-message="{{validations.messages.email}}">
+        </div>
       </div>
-      <div class="addAlertBox">
+      <div class="addAlertBox col-xs-3">
         <button class="btn btn-default btn-xs"
-                ng-disabled="!UIModel.alerts.alert.email"
+                ng-disabled="!UIModel.alert.email"
                 type="button"
                 ng-click="addAlert()">
           <span class="glyphicon glyphicon-plus"></span>add alert
         </button>
       </div>
-
-      <div class="emailArrayRow" ng-repeat="email in UIModel.alerts.alertsArray">
-        <span>{{email}}</span>
-        <button class="btn btn-default btn-xs"
-                type="button"
-                ng-click="removeAlert()">
-          <span class="glyphicon glyphicon-minus"></span> delete
-        </button>
-      </div>
-
-    </div>
   </div>
 
-  <div class="row advancedOptionsButton" ng-click="expandOptions = !expandOptions">
-    <h4>Advanced options
-      <span class="entypo chevron-down" ng-if="!expandOptions"></span>
-      <span class="entypo chevron-up" ng-if="expandOptions"></span>
-      <hr />
-    </h4>
+  <div class="col-xs-24 emailArrayRow mt10 plr0px" ng-repeat="email in UIModel.alerts">
+    <span class="col-xs-8">{{email}}</span>
+    <div class="col-xs-3"><button class="btn btn-default btn-xs"
+            type="button"
+            ng-click="removeAlert()">
+      <span class="glyphicon glyphicon-minus"></span> delete
+    </button></div>
   </div>
 
-  <div id="advancedOptionsBox" ng-class="{expanded:expandOptions}">
-    <div class="frequencyBox">
-      <h4>Frequency</h4>
-      <label>Every</label>
-      <input type="text"
-             name="frequencyEveryInput"
-             ng-model="UIModel.frequency.number"
-             ng-pattern="validations.patterns.twoDigits"
-             ng-keydown="validations.acceptOnlyNumber($event)"
-             class="form-control"
-             validation-optional-message="{{validations.messages.number}}" />
+  <div class="col-xs-24 advancedOption" ng-click="expandOptions = !expandOptions">
+    <label class="pointer blink-success">Advanced Options</label>
+    <i class="glyphicon glyphicon-chevron-down mt15" ng-if="!expandOptions"></i>
+    <i class="glyphicon glyphicon-chevron-up mt15" ng-if="expandOptions"></i>
+  </div>
 
-      <select ng-model="UIModel.frequency.unit" class="form-control">
-        <option selected value="minutes">minutes</option>
-        <option value="hours">hours</option>
-        <option value="days">days</option>
-        <option value="months">months</option>
-      </select>
-    </div>
+  <div id="advancedOptionsBox" class="col-xs-24 plr0px" ng-class="{expanded:expandOptions}">
+    <div class="col-xs-24" ng-if="UIModel.type === 'HIVE'">
+		<label tooltip="dataset.tdeEncryptionEnabled">TDE Encryption</label>
+		<input type="checkbox" ng-model="UIModel.tdeEncryptionEnabled" ng-checked="UIModel.tdeEncryptionEnabled"/>
+	</div>
 
     <div class="allocationBox">
-      <h4>Allocation</h4>
-
-      <div ng-if="UIModel.formType === 'HDFS'">
-        <div>
-          <label>Max Maps for Distcp
-            <input type="text"
-                   name="maxMapsInput"
-                   ng-model="UIModel.allocation.hdfs.maxMaps"
-                   ng-pattern="validations.patterns.number"
-                   ng-keydown="validations.acceptOnlyNumber($event)"
-                   class="form-control"
-                   validation-optional-message="{{validations.messages.allocationNumber}}"/>
-          </label>
+      <div class="col-xs-24">
+        <label>Allocation</label>
+      </div>
+      <div class="col-xs-24 plr0px" ng-if="UIModel.type === 'HDFS'">
+        <div class="col-xs-6">
+          <label class="light" tooltip="dataset.distcpMaxMaps">Max Maps for Distcp</label>
+          <input type="text"
+                 name="maxMapsInput"
+                 ng-model="UIModel.allocation.hdfs.distcpMaxMaps"
+                 ng-pattern="validations.patterns.number"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 class="form-control"
+                 validation-optional-message="{{validations.messages.allocationNumber}}"/>
         </div>
-        <div>
-          <label>Max bandwidth (MB)
-            <input type="text"
-                   name="maxBandwidthInput"
-                   ng-model="UIModel.allocation.hdfs.maxBandwidth"
-                   ng-pattern="validations.patterns.number"
-                   ng-keydown="validations.acceptOnlyNumber($event)"
-                   class="form-control"
-                   validation-optional-message="{{validations.messages.allocationNumber}}" />
-          </label>
+        <div class="col-xs-6">
+          <label class="light" tooltip="dataset.distcpMapBandwidth">Max bandwidth (MB)</label>
+          <input type="text"
+                 name="maxBandwidthInput"
+                 ng-model="UIModel.allocation.hdfs.distcpMapBandwidth"
+                 ng-pattern="validations.patterns.number"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 class="form-control"
+                 validation-optional-message="{{validations.messages.allocationNumber}}" />
         </div>
       </div>
 
-      <div ng-if="UIModel.formType === 'HIVE'">
-        <div>
-          <label>Max Maps for Distcp
-            <input type="text"
-                   name="hiveMaxMapsInput"
-                   ng-model="UIModel.allocation.hive.maxMapsDistcp"
-                   ng-pattern="validations.patterns.number"
-                   ng-keydown="validations.acceptOnlyNumber($event)"
-                   class="form-control"
-                   validation-optional-message="{{validations.messages.allocationNumber}}"/>
-          </label>
+      <div class="col-xs-24 plr0px" ng-if="UIModel.type === 'HIVE'">
+        <div class="col-xs-6">
+          <label class="light" tooltip="dataset.distcpMaxMaps">Max Maps for Distcp</label>
+          <input type="text"
+                 name="hiveMaxMapsInput"
+                 ng-model="UIModel.allocation.hive.distcpMaxMaps"
+                 ng-pattern="validations.patterns.number"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 class="form-control"
+                 validation-optional-message="{{validations.messages.allocationNumber}}"/>
         </div>
-        <div>
-          <label>Max Maps for Mirror
-            <input type="text"
-                   name="maxBandwidthInput"
-                   ng-model="UIModel.allocation.hive.maxMapsMirror"
-                   ng-pattern="validations.patterns.number"
-                   ng-keydown="validations.acceptOnlyNumber($event)"
-                   class="form-control"
-                   validation-optional-message="{{validations.messages.allocationNumber}}" />
-          </label>
+        <div class="col-xs-6">
+          <label class="light" tooltip="dataset.replicationMaxMaps">Max Maps for Mirror</label>
+          <input type="text"
+                 name="maxMapsInput"
+                 ng-model="UIModel.allocation.hive.replicationMaxMaps"
+                 ng-pattern="validations.patterns.number"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 class="form-control"
+                 validation-optional-message="{{validations.messages.allocationNumber}}" />
         </div>
-        <div>
-          <label>Max Events
-            <input type="text"
-                   name="maxMapsEventsInput"
-                   ng-model="UIModel.allocation.hive.maxMapsEvents"
-                   ng-pattern="validations.patterns.number"
-                   ng-keydown="validations.acceptOnlyNumber($event)"
-                   class="form-control"
-                   validation-optional-message="{{validations.messages.allocationNumber}}" />
-          </label>
+        <div class="col-xs-6">
+          <label class="light" tooltip="dataset.maxEvents">Max Events</label>
+          <input type="text"
+                 name="maxEventsInput"
+                 ng-model="UIModel.allocation.hive.maxEvents"
+                 ng-pattern="validations.patterns.number"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 class="form-control"
+                 validation-optional-message="{{validations.messages.allocationNumber}}" />
         </div>
-        <div>
-          <label>Max bandwidth (MB)
-            <input type="text"
-                   name="maxBandwidthInput"
-                   ng-model="UIModel.allocation.hive.maxBandwidth"
-                   ng-pattern="validations.patterns.number"
-                   ng-keydown="validations.acceptOnlyNumber($event)"
-                   class="form-control"
-                   validation-optional-message="{{validations.messages.allocationNumber}}" />
-          </label>
+        <div class="col-xs-6">
+          <label class="light" tooltip="dataset.distcpMapBandwidth">Max bandwidth (MB)</label>
+          <input type="text"
+                 name="maxBandwidthInput"
+                 ng-model="UIModel.allocation.hive.distcpMapBandwidth"
+                 ng-pattern="validations.patterns.number"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 class="form-control"
+                 validation-optional-message="{{validations.messages.allocationNumber}}" />
         </div>
       </div>
-
     </div>
 
-    <div class="hiveOptBox" ng-if="UIModel.formType === 'HIVE'">
-      <h4>Source</h4>
+    <div class="hiveOptBox mt10 col-xs-24 plr0px" ng-if="UIModel.type === 'HIVE'">
+      <label class="col-xs-24">Source</label>
 
-      <label>Staging path
+      <label class="col-xs-24 light mt10">Staging path</label>
+      <div class="col-xs-8">
         <input type="text"
                name="sourceStagingPathInput"
                ng-model="UIModel.hiveOptions.source.stagingPath"
                ng-pattern="validations.patterns.path"
                class="form-control"
                validation-optional-message="{{validations.messages.path}}" />
-      </label>
-      <label>HiveServer2 endpoint
-        <input type="text"
-               name="sourceHiveServerInput"
-               ng-model="UIModel.hiveOptions.source.hiveServerToEndpoint"
-               ng-pattern="validations.patterns.path"
-               class="form-control"
-               validation-optional-message="{{validations.messages.path}}" />
-      </label>
+      </div>
 
-      <h4>Target</h4>
-      <label>Staging path
+      <label class="col-xs-24 mt15">Target</label>
+
+      <label class="col-xs-24 light mt10">Staging path</label>
+      <div class="col-xs-8">
         <input type="text"
                name="targetStagingPathInput"
                ng-model="UIModel.hiveOptions.target.stagingPath"
                ng-pattern="validations.patterns.path"
                class="form-control"
                validation-optional-message="{{validations.messages.path}}" />
-      </label>
-      <label>HiveServer2 endpoint
-        <input type="text"
-               name="targetHiveServerInput"
-               ng-model="UIModel.hiveOptions.target.hiveServerToEndpoint"
-               ng-pattern="validations.patterns.path"
-               class="form-control"
-               validation-optional-message="{{validations.messages.path}}" />
-      </label>
-    </div>
-
-    <div class="retryBox">
-      <h4>Retry</h4>
-
-      <div class="policyBox">
-        <label>Policy</label>
-        <select ng-model="UIModel.retry.policy"
-                class="form-control">
-          <option selected value="periodic">PERIODIC</option>
-          <option value="exp-backoff">EXPONENTIAL_BACKOFF</option>
-          <option value="final">FINAL</option>
-        </select>
-      </div>
-
-      <div>
-        <label>Delay</label>
-        <input type="text"
-               name="frequencyEveryInput"
-               ng-model="UIModel.retry.delay.number"
-               ng-pattern="validations.patterns.twoDigits"
-               ng-keydown="validations.acceptOnlyNumber($event)"
-               class="form-control"
-               validation-optional-message="{{validations.messages.number}}" />
-
-        <select ng-model="UIModel.retry.delay.unit"
-                class="form-control">
-          <option selected value="minutes">minutes</option>
-          <option value="hours">hours</option>
-          <option value="days">days</option>
-          <option value="months">months</option>
-        </select>
-      </div>
-
-      <div>
-        <label>Attempts</label>
-        <input type="text"
-               name="frequencyEveryInput"
-               ng-model="UIModel.retry.attempts"
-               ng-pattern="validations.patterns.twoDigits"
-               ng-keydown="validations.acceptOnlyNumber($event)"
-               class="form-control"
-               validation-optional-message="{{validations.messages.number}}" />
       </div>
     </div>
 
-    <div class="aclBox col-xs-24">
-      <h4>Access Control List</h4>
-      <div class="col-xs-8">
-        <label>Owner
+    <div class="col-xs-24 plr0px retryBox">
+      <label class="col-xs-24">Retry</label>
+
+      <div class="col-xs-6 policyBox pt5px mt5">
+        <label class="light">Policy</label>
+        <select ng-model="UIModel.retry.policy" ng-required="true"
+                class="form-control padding0" ng-change="policyChange()">
+              <option selected value="periodic">PERIODIC</option>
+              <option value="exp-backoff">EXPONENTIAL_BACKOFF</option>
+              <option value="final">FINAL</option>
+        </select>
+      </div>
+
+      <div class="col-xs-6 pt5px mt8">
+        <label class="col-xs-6 light plr0px">Delay</label>
+        <div class="col-xs-8 plr0px">
+          <input type="text"
+                 name="frequencyEveryInput"
+                 ng-model="UIModel.retry.delay.quantity"
+                 ng-pattern="validations.patterns.twoDigits"
+                 ng-keydown="validations.acceptOnlyNumber($event)"
+                 class="form-control"
+                 ng-disabled = "UIModel.retry.policy === 'final'"
+                 validation-optional-message="{{validations.messages.number}}" />
+        </div>
+        <div class="col-xs-16">
+          <select ng-model="UIModel.retry.delay.unit"
+                  class="form-control padding0" ng-disabled = "UIModel.retry.policy === 'final'">
+            <option selected value="minutes">minutes</option>
+            <option value="hours">hours</option>
+            <option value="days">days</option>
+            <option value="months">months</option>
+          </select>
+        </div>
+      </div>
+
+      <div class="col-xs-6 pt5px mt5">
+        <label class="light">Attempts</label>
+        <input type="text"
+           name="frequencyEveryInput"
+           ng-model="UIModel.retry.attempts"
+           ng-pattern="validations.patterns.twoDigits"
+           ng-keydown="validations.acceptOnlyNumber($event)"
+           class="form-control"
+           ng-disabled = "UIModel.retry.policy === 'final'"
+           validation-optional-message="{{validations.messages.number}}" />
+      </div>
+    </div>
+
+    <div class="col-xs-24 plr0px">
+      <label class="col-xs-24">Access Control List</label>
+      <div class="col-xs-24 plr0px">
+        <div class="col-xs-8">
+          <label class="light">Owner<mandatory-field></mandatory-field></label>
           <input type="text"
                  name="aclOwnerInput"
-                 ng-model="UIModel.acl.owner"
+                 ng-model="UIModel.ACL.owner"
                  ng-pattern="validations.patterns.unixId"
                  class="form-control"
                  ng-required="true"
                  validation-message="{{validations.messages.acl.owner}}"/>
-        </label>
-      </div>
-      <div class="col-xs-8">
-        <label>Group
+        </div>
+        <div class="col-xs-8 pl0px">
+          <label class="light">Group<mandatory-field></mandatory-field></label>
           <input type="text"
                  name="aclGroupInput"
-                 ng-model="UIModel.acl.group"
+                 ng-model="UIModel.ACL.group"
                  ng-pattern="validations.patterns.unixId"
                  class="form-control"
                  ng-required="true"
                  validation-message="{{validations.messages.acl.group}}" />
-        </label>
+        </div>
       </div>
-      <div class="col-xs-8">
-        <label>Permissions
-          <input type="text"
-                 name="aclPermissionsInput"
-                 ng-model="UIModel.acl.permissions"
-                 ng-pattern="validations.patterns.unixPermissions"
-                 class="form-control"
-                 ng-required="true"
-                 validation-message="{{validations.messages.acl.permission}}" />
-        </label>
+      <div class="col-xs-24">
+        <div class="col-xs-8 plr0px">
+          <label class="light">Permissions<mandatory-field></mandatory-field></label>
+          <acl-permissions acl-model="UIModel.ACL.permission"></acl-permissions>
+        </div>
       </div>
     </div>
 
-
-
-
-
   </div>
 
-
-  <div class="row">
-    <div class="col-xs-24 mt20">
-
-      <button class="btn nextBtn pull-right"
-              ng-disabled="buttonSpinners.show"
-              ng-click="goNext(datasetForm.$invalid, 'forms.dataset.summary')" >
-        Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-      </button>
-      <a class="pull-right" ui-sref="main">
-        Cancel
+  <div class="col-xs-24 pb15px mt35">
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
       </a>
-
+      <button class="btn nextBtn"
+            ng-disabled="buttonSpinners.show"
+            ng-click="goNext(datasetForm.$invalid)" scroll-to-error>
+      NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
     </div>
   </div>
 
-
-
-
-
-
 </form>
diff --git a/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html b/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html
index 6d73af5..2b192cf 100644
--- a/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html
+++ b/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html
@@ -18,128 +18,215 @@
  */
 -->
 <div id="formSummaryBox" class="col-xs-24">
+  <h4>General</h4>
   <div>
-    <h4 class="lightSubtitle">Name</h4>
-    {{UIModel.name}}
+    <label>Name</label>:
+    <span>{{UIModel.name}}</span>
   </div>
   <div>
-    <h4 class="lightSubtitle">Type</h4>
-    {{UIModel.formType}}
-  </div>
-  <div>
-    <h4 class="lightSubtitle">Tags</h4>
-    <div ng-repeat="tag in UIModel.tags.tagsArray"><span>{{tag.key}}</span> - {{tag.value}}</div>
+    <label>Tags</label>:
+    <div ng-repeat="tag in UIModel.tags"><span>{{tag.key}}</span> - <span>{{tag.value}}</span></div>
   </div>
 
   <div>
-    <h4 class="lightSubtitle">Source</h4>
+    <h4>Source</h4>
   </div>
   <div class="box">
-    <h3 ng-if="UIModel.formType === 'HIVE' || UIModel.source.location === 'HDFS'">{{UIModel.source.cluster}}</h3>
+    <h3 ng-if="UIModel.type === 'HIVE' || UIModel.source.location === 'HDFS'">{{UIModel.source.cluster}}</h3>
+    <div ng-if="UIModel.type === 'HDFS'">
+      <label class="locationBox">Location</label>:
+      <span>{{UIModel.source.location}}</span>
+    </div>
+    <div ng-if="UIModel.type === 'HDFS'">
+      <label>Path</label>:
+      <span>{{UIModel.source.path}}</span></div>
+    <div ng-if="UIModel.type === 'HDFS' && UIModel.source.location !== 'HDFS'">
+      <label>URL</label>:
+      <span>{{UIModel.source.url}}</span>
+    </div>
 
-    <h4 ng-if="UIModel.formType === 'HDFS'">Location</h4>
-    <div ng-if="UIModel.formType === 'HDFS'">{{UIModel.source.location}}</div>
-    <div ng-if="UIModel.formType === 'HDFS'"><span>Path:</span> {{UIModel.source.path}}</div>
-    <div ng-if="UIModel.formType === 'HDFS' && UIModel.source.location !== 'HDFS'"><span>URL:</span>{{UIModel.source.url}}</div>
+    <div ng-if="UIModel.type === 'HIVE'">I want to copy <span>{{UIModel.source.hiveDatabaseType}}</span></div>
+    <div ng-if="UIModel.type === 'HIVE' && UIModel.source.hiveDatabaseType === 'databases'">
+      <label>Databases</label>:
+      <span>{{UIModel.source.hiveDatabases}}</span>
+    </div>
+    <div ng-if="UIModel.type === 'HIVE' && UIModel.source.hiveDatabaseType === 'tables'">
+      <label>From Database </label>
+      <span>{{UIModel.source.hiveDatabases}}</span>
+    </div>
+    <div ng-if="UIModel.type === 'HIVE' && UIModel.source.hiveDatabaseType === 'tables'">
+      <label>Tables</label>:
+      <span>{{UIModel.source.hiveTables}}</span>
+    </div>
 
+    <div ng-if="UIModel.type === 'HIVE'">
+      <label>HiveServer2 endpoint</label>:
+      <span>{{UIModel.hiveOptions.source.hiveServerToEndpoint}}</span>
+    </div>
 
+    <div ng-if="UIModel.type === 'HIVE'">
+      <label>Staging path</label>:
+      <span>{{UIModel.hiveOptions.source.stagingPath}}</span>
+    </div>
 
+    <div ng-if="UIModel.type === 'HIVE' && secureMode === true">
+      <label>Hive2 Kerberos Principal</label>:
+      <span>{{UIModel.source.hive2KerberosPrincipal}}</span>
+    </div>
 
+    <div ng-if="UIModel.type === 'HIVE' && secureMode === true">
+      <label>Meta Store URI</label>:
+      <span>{{UIModel.source.hiveMetastoreUri}}</span>
+    </div>
 
-    <div ng-if="UIModel.formType === 'HIVE'">I want to copy <span>{{UIModel.source.hiveDatabaseType}}</span></div>
-    <div ng-if="UIModel.formType === 'HIVE' && UIModel.source.hiveDatabaseType === 'databases'"><span>Databases:</span> {{UIModel.source.hiveDatabases}}</div>
-    <div ng-if="UIModel.formType === 'HIVE' && UIModel.source.hiveDatabaseType === 'tables'"><span>From Database </span>{{UIModel.source.hiveDatabase}}</div>
-    <div ng-if="UIModel.formType === 'HIVE' && UIModel.source.hiveDatabaseType === 'tables'"><span>Tables:</span> {{UIModel.source.hiveTables}}</div>
-
-
-
-
+    <div ng-if="UIModel.type === 'HIVE' && secureMode === true">
+      <label>Kerberos Principal</label>:
+      <span>{{UIModel.source.hiveMetastoreKerberosPrincipal}}</span>
+    </div>
   </div>
+
   <div>
-    <h4 class="lightSubtitle">Target</h4>
+    <h4>Target</h4>
   </div>
   <div class="box">
-    <h3 ng-if="(UIModel.formType === 'HDFS' && UIModel.target.location === 'HDFS') || UIModel.formType === 'HIVE'">{{UIModel.target.cluster}}</h3>
+    <h3 ng-if="(UIModel.type === 'HDFS' && UIModel.target.location === 'HDFS') || UIModel.type === 'HIVE'">
+      {{UIModel.target.cluster}}
+    </h3>
 
-    <h4 ng-if="UIModel.formType === 'HDFS'">Location</h4>
-    <div ng-if="UIModel.formType === 'HDFS'">{{UIModel.target.location}}</div>
-    <div ng-if="UIModel.formType === 'HDFS'"><span>Path:</span> {{UIModel.target.path}}</div>
-    <div ng-if="UIModel.formType === 'HDFS' && UIModel.target.location !== 'HDFS'"><span>URL:</span> {{UIModel.target.url}}</div>
+    <div ng-if="UIModel.type === 'HDFS'">
+      <label class="locationBox">Location</label>:
+      <span>{{UIModel.target.location}}</span>
+    </div>
+    <div ng-if="UIModel.type === 'HDFS'">
+      <label>Path</label>:
+      <span>{{UIModel.target.path}}</span>
+    </div>
+    <div ng-if="UIModel.type === 'HDFS' && UIModel.target.location !== 'HDFS'">
+      <label>URL:</label>:
+      <span>{{UIModel.target.url}}</span>
+    </div>
 
+    <div ng-if="UIModel.type === 'HIVE'">
+      <label>HiveServer2 endpoint</label>:
+      <span>{{UIModel.hiveOptions.target.hiveServerToEndpoint}}</span>
+    </div>
+
+    <div ng-if="UIModel.type === 'HIVE'">
+      <label>Staging path</label>:
+      <span>{{UIModel.hiveOptions.target.stagingPath}}</span>
+    </div>
+
+    <div ng-if="UIModel.type === 'HIVE' && secureMode === true">
+      <label>Hive2 Kerberos Principal</label>:
+      <span>{{UIModel.target.hive2KerberosPrincipal}}</span>
+    </div>
+
+    <div ng-if="UIModel.type === 'HIVE' && secureMode === true">
+      <label>Meta Store URI</label>:
+      <span>{{UIModel.target.hiveMetastoreUri}}</span>
+    </div>
+
+    <div ng-if="UIModel.type === 'HIVE' && secureMode === true">
+      <label>Kerberos Principal</label>:
+      <span>{{UIModel.target.hiveMetastoreKerberosPrincipal}}</span>
+    </div>
   </div>
 
   <div>
     <h4 class="lightSubtitle">Run On</h4>
-    <div ng-if="UIModel.runOn === 'source'">{{UIModel.source.cluster}}</div>
-    <div ng-if="UIModel.runOn === 'target'">{{UIModel.target.cluster}}</div>
+    <div ng-if="UIModel.runOn === 'source'"><span>{{UIModel.source.cluster}}</span></div>
+    <div ng-if="UIModel.runOn === 'target'"><span>{{UIModel.target.cluster}}</span></div>
   </div>
 
   <hr />
 
   <div>
     <h4 class="lightSubtitle">Schedule</h4>
-    <span>Start on: </span>{{UIModel.validity.startISO}} <br />
-    <span>End on: </span>{{UIModel.validity.endISO}}
-  </div>
-
-  <div ng-if="UIModel.formType === 'HDFS'">
-    <h4 class="lightSubtitle">Max Maps</h4>
-    {{UIModel.allocation.hdfs.maxMaps}}
-
-    <h4 class="lightSubtitle">Max Bandwidth</h4>
-    {{UIModel.allocation.hdfs.maxBandwidth}}
-  </div>
-  <div ng-if="UIModel.formType === 'HIVE'">
-
-    <h4 class="lightSubtitle">Max Maps for Distcp</h4>
-    {{UIModel.allocation.hive.maxMapsDistcp}}
-
-    <h4 class="lightSubtitle">Max Bandwidth</h4>
-    {{UIModel.allocation.hive.maxBandwidth}}
-
-    <h4 class="lightSubtitle">Max Events</h4>
-    {{UIModel.allocation.hive.maxMapsEvents}}
-
-    <h4 class="lightSubtitle">Max Maps for mirror</h4>
-    {{UIModel.allocation.hive.maxMapsMirror}}
+    <div><label>Start on</label>: <span>{{UIModel.validity.start.date|date:'yyyy-MM-dd'}} {{UIModel.validity.start.time|date:'HH:mm'|date:'HH:mm'}}</span></div>
+    <div><label>End on</label>: <span>{{UIModel.validity.end.date|date:'yyyy-MM-dd'}} {{UIModel.validity.end.time|date:'HH:mm'}}</span></div>
   </div>
 
   <div>
-    <h4 ng-if="UIModel.alerts.alertsArray.length > 0" class="lightSubtitle">Alerts</h4>
-    {{ UIModel.alerts.alertsArray.join() }}
+    <h4 class="lightSubtitle">Frequency</h4>
+    <span>{{UIModel.frequency.quantity}} {{UIModel.frequency.unit}}</span>
   </div>
 
+  <div>
+    <h4 class="lightSubtitle">Timezone</h4>
+    <span>{{UIModel.validity.timezone}}</span>
+  </div>
+
+  <div>
+    <h4 ng-if="UIModel.alerts.length > 0" class="lightSubtitle">Alerts</h4>
+    <span>{{ UIModel.alerts.join() }}</span>
+  </div>
+
+  <div ng-if="UIModel.type === 'HIVE'">
+    <h4 class="lightSubtitle">TDE Encryption</h4>
+    <span>{{UIModel.tdeEncryptionEnabled}}</span>
+  </div>
   <hr />
-  <h4 class="lightSubtitle">ACL</h4>
-  <div><span>Owner:</span> {{UIModel.acl.owner}}</div>
-  <div><span>Group:</span> {{UIModel.acl.group}}</div>
-  <div><span>Permissions:</span> {{UIModel.acl.permissions}}</div>
+
+  <h4 class="lightSubtitle">Allocation</h4>
+  <div ng-if="UIModel.type === 'HDFS'">
+    <div>
+      <label>Max Maps</label>:
+      <span>{{UIModel.allocation.hdfs.distcpMaxMaps}}</span>
+    </div>
+    <div>
+      <label>Max Bandwidth</label>:
+      <span>{{UIModel.allocation.hdfs.distcpMapBandwidth}}</span>
+    </div>
+  </div>
+  <div ng-if="UIModel.type === 'HIVE'">
+    <div>
+      <label>Max Maps for Distcp</label>:
+      <span>{{UIModel.allocation.hive.distcpMaxMaps}}</span>
+    </div>
+    <div>
+      <label>Max Bandwidth</label>:
+      <span>{{UIModel.allocation.hive.distcpMapBandwidth}}</span>
+    </div>
+    <div>
+      <label>Max Events</label>:
+      <span>{{UIModel.allocation.hive.maxEvents}}</span>
+    </div>
+    <div>
+      <label>Max Maps for mirror</label>:
+      <span>{{UIModel.allocation.hive.replicationMaxMaps}}</span>
+    </div>
+  </div>
+  <hr />
 
   <h4 class="lightSubtitle">Retry</h4>
-  <div><span>Policy: </span> {{UIModel.retry.policy}}</div>
-  <div><span>delay: </span> {{UIModel.retry.delay.number}} {{UIModel.retry.delay.unit}}</div>
-  <div><span>Attempts: </span> {{UIModel.retry.attempts}}</div>
-
-  <h4 class="lightSubtitle">Frequency</h4>
-  <div>{{UIModel.frequency.number}} {{UIModel.frequency.unit}}</div>
-
+  <div><label>Policy</label>: <span>{{UIModel.retry.policy}}</span></div>
+  <div><label>Delay</label>: <span>{{UIModel.retry.delay.quantity}} {{UIModel.retry.delay.unit}}</span></div>
+  <div><label>Attempts</label>: <span>{{UIModel.retry.attempts}}</span></div>
   <hr />
 
-  <div class="row">
-    <div class="col-xs-24 mt20">
-      <button type="button" class="btn prevBtn"
-              ng-click="goBack('forms.dataset.general')"
-              ng-disabled="buttonSpinners.backShow">
-        Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
-      </button>
-      <button class="btn nextBtn pull-right"
+  <h4 class="lightSubtitle">Access Control List</h4>
+  <div>
+    <label>Owner</label>: <span>{{UIModel.ACL.owner}}</span>
+    <label>Group</label>: <span>{{UIModel.ACL.group}}</span>
+    <label>Permissions</label>: <span>{{UIModel.ACL.permission}}</span>
+  </div>
+  <hr />
+
+  <div class="col-xs-24 mt35 pb15px pl0px">
+    <button type="button" class="btn prevBtn"
+            ng-click="goBack()"
+            ng-disabled="buttonSpinners.backShow">
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
+      </a>
+      <button class="btn nextBtn"
               ng-disabled="buttonSpinners.show"
               ng-click="save()">
-        Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+        SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
       </button>
-      <a class="pull-right" ui-sref="main">
-        Cancel
-      </a>
     </div>
   </div>
 
diff --git a/falcon-ui/app/html/dataset/datasetFormTpl.html b/falcon-ui/app/html/dataset/datasetFormTpl.html
index d471d40..3d1d01a 100644
--- a/falcon-ui/app/html/dataset/datasetFormTpl.html
+++ b/falcon-ui/app/html/dataset/datasetFormTpl.html
@@ -17,41 +17,29 @@
  * limitations under the License.
  */
 -->
-<div id="formBox">
-  <div class="formTitol">
-    <a>Falcon Mirrors</a>
-    <h1>New Mirror</h1>
-  </div>
-
+<div id="formBox" class="datasetForm">
   <div class="col-sm-24">
-    <div class="formBoxWrapper">
-
-      <div class="progressBox col-xs-24" ng-class="{ general:isActive('forms.dataset.general'),
+    <div class="formBoxContainer detailsBox">
+      <div class="row datasetProgressBox" ng-class="{ general:isActive('forms.dataset.general'),
                                                  summary:isActive('forms.dataset.summary')}">
-        <div class="progressBar">
-          <div class="bar1"></div>
-          <span>
-            <div class="fir">
-              <b>1</b>
-              <span class="glyphicon glyphicon-ok"></span>
-              <h6>General</h6>
-            </div>
-          </span>
-          <span>
-            <div class="sec">
-              <b>2</b>
-              <span class="glyphicon glyphicon-ok"></span>
-              <h6>Summary</h6>
-            </div>
-          </span>
+        <div class="progressBar col-xs-24">
+          <div class="text-center" ng-class="{
+                active:isActive('forms.dataset.general'),
+                completed:isCompleted('forms.dataset.general')}">General</div>
+          <div class="text-center" ng-class="{
+                active:isActive('forms.dataset.summary'),
+                completed:isCompleted('forms.dataset.summary')}">Summary</div>
         </div>
       </div>
 
-      <div class="row" ui-view></div>
+      <div class="row customContainer">
+        <div class="col-xs-offset-1 col-xs-22">
+          <div class="col-xs-24">
+            <label class="title">NEW {{UIModel.type}} MIRROR</label>
+          </div>
+          <div ui-view></div>
+        </div>
+      </div>
     </div>
   </div>
-
-  <div class="col-sm-24">
-
-  </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/falcon-ui/app/html/dataset/datasetSummary.html b/falcon-ui/app/html/dataset/datasetSummary.html
new file mode 100644
index 0000000..8d855f1
--- /dev/null
+++ b/falcon-ui/app/html/dataset/datasetSummary.html
@@ -0,0 +1,209 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<div id="formSummaryBox" class="summaryBox">
+  <h5>{{entityTypeLabel}}</h5>
+  <div>
+    <label>Name</label>:
+    <span>{{extension.name}}</span>
+  </div>
+  <div>
+    <label>Tags</label>:
+    <div ng-repeat="tag in extension.tags"><span>{{tag.key}}</span> - <span>{{tag.value}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Source</h4>
+  </div>
+  <div class="box">
+    <h3 ng-if="extension.type === 'HIVE' || extension.source.location === 'HDFS'">{{extension.source.cluster}}</h3>
+    <div ng-if="extension.type === 'HDFS'">
+      <label class="locationBox">Location</label>:
+      <span>{{extension.source.location}}</span>
+    </div>
+    <div ng-if="extension.type === 'HDFS'">
+      <label>Path</label>:
+      <span>{{extension.source.path}}</span></div>
+    <div ng-if="extension.type === 'HDFS' && extension.source.location !== 'HDFS'">
+      <label>URL</label>:
+      <span>{{extension.source.url}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE'">I want to copy <span>{{extension.source.hiveDatabaseType}}</span></div>
+    <div ng-if="extension.type === 'HIVE' && extension.source.hiveDatabaseType === 'databases'">
+      <label>Databases</label>:
+      <span>{{extension.source.hiveDatabases}}</span>
+    </div>
+    <div ng-if="extension.type === 'HIVE' && extension.source.hiveDatabaseType === 'tables'">
+      <label>From Database </label>
+      <span>{{extension.source.hiveDatabases}}</span>
+    </div>
+    <div ng-if="extension.type === 'HIVE' && extension.source.hiveDatabaseType === 'tables'">
+      <label>Tables</label>:
+      <span>{{extension.source.hiveTables}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE'">
+      <label>HiveServer2 endpoint</label>:
+      <span>{{extension.hiveOptions.source.hiveServerToEndpoint}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE'">
+      <label>Staging path</label>:
+      <span>{{extension.hiveOptions.source.stagingPath}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE' && secureMode === true">
+      <label>Hive2 Kerberos Principal</label>:
+      <span>{{extension.source.hive2KerberosPrincipal}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE' && secureMode === true">
+      <label>Meta Store URI</label>:
+      <span>{{extension.source.hiveMetastoreUri}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE' && secureMode === true">
+      <label>Kerberos Principal</label>:
+      <span>{{extension.source.hiveMetastoreKerberosPrincipal}}</span>
+    </div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Target</h4>
+  </div>
+  <div class="box">
+    <h3 ng-if="(extension.type === 'HDFS' && extension.target.location === 'HDFS') || extension.type === 'HIVE'">
+      {{extension.target.cluster}}
+    </h3>
+
+    <div ng-if="extension.type === 'HDFS'">
+      <label class="locationBox">Location</label>:
+      <span>{{extension.target.location}}</span>
+    </div>
+    <div ng-if="extension.type === 'HDFS'">
+      <label>Path</label>:
+      <span>{{extension.target.path}}</span>
+    </div>
+    <div ng-if="extension.type === 'HDFS' && extension.target.location !== 'HDFS'">
+      <label>URL</label>:
+      <span>{{extension.target.url}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE'">
+      <label>HiveServer2 endpoint</label>:
+      <span>{{extension.hiveOptions.target.hiveServerToEndpoint}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE'">
+      <label>Staging path</label>:
+      <span>{{extension.hiveOptions.target.stagingPath}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE' && secureMode === true">
+      <label>Hive2 Kerberos Principal</label>:
+      <span>{{extension.target.hive2KerberosPrincipal}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE' && secureMode === true">
+      <label>Meta Store URI</label>:
+      <span>{{extension.target.hiveMetastoreUri}}</span>
+    </div>
+
+    <div ng-if="extension.type === 'HIVE' && secureMode === true">
+      <label>Kerberos Principal</label>:
+      <span>{{extension.target.hiveMetastoreKerberosPrincipal}}</span>
+    </div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Run On</h4>
+    <div ng-if="extension.runOn === 'source'"><span>{{extension.source.cluster}}</span></div>
+    <div ng-if="extension.runOn === 'target'"><span>{{extension.target.cluster}}</span></div>
+  </div>
+
+  <hr />
+
+  <div>
+    <h4 class="lightSubtitle">Schedule</h4>
+    <div><label>Start on</label>: <span>{{extension.validity.start.date|date:'yyyy-MM-dd'}} {{extension.validity.start.time|date:'HH:mm'|date:'HH:mm'}}</span></div>
+    <div><label>End on</label>: <span>{{extension.validity.end.date|date:'yyyy-MM-dd'}} {{extension.validity.end.time|date:'HH:mm'}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Frequency</h4>
+    <span>{{extension.frequency.quantity}} {{extension.frequency.unit}}</span>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Timezone</h4>
+    <span>{{extension.validity.timezone}}</span>
+  </div>
+
+  <div>
+    <h4 ng-if="extension.alerts.length > 0" class="lightSubtitle">Alerts</h4>
+    <span>{{ extension.alerts.join() }}</span>
+  </div>
+  <hr />
+
+  <h4 class="lightSubtitle">Allocation</h4>
+  <div ng-if="extension.type === 'HDFS'">
+    <div>
+      <label>Max Maps</label>:
+      <span>{{extension.allocation.hdfs.distcpMaxMaps}}</span>
+    </div>
+    <div>
+      <label>Max Bandwidth</label>:
+      <span>{{extension.allocation.hdfs.distcpMapBandwidth}}</span>
+    </div>
+  </div>
+  <div ng-if="extension.type === 'HIVE'">
+    <div>
+      <label>Max Maps for Distcp</label>:
+      <span>{{extension.allocation.hive.distcpMaxMaps}}</span>
+    </div>
+    <div>
+      <label>Max Bandwidth</label>:
+      <span>{{extension.allocation.hive.distcpMapBandwidth}}</span>
+    </div>
+    <div>
+      <label>Max Events</label>:
+      <span>{{extension.allocation.hive.maxEvents}}</span>
+    </div>
+    <div>
+      <label>Max Maps for mirror</label>:
+      <span>{{extension.allocation.hive.replicationMaxMaps}}</span>
+    </div>
+  </div>
+  <hr />
+
+  <h4 class="lightSubtitle">Retry</h4>
+  <div><label>Policy</label>: <span>{{extension.retry.policy}}</span></div>
+  <div><label>delay</label>: <span>{{extension.retry.delay.quantity}} {{extension.retry.delay.unit}}</span></div>
+  <div><label>Attempts</label>: <span>{{extension.retry.attempts}}</span></div>
+  <hr />
+
+  <h4 class="lightSubtitle">Access Control List</h4>
+  <div>
+    <label>Owner</label>: <span>{{extension.ACL.owner}}</span>
+    <label>Group</label>: <span>{{extension.ACL.group}}</span>
+    <label>Permissions</label>: <span>{{extension.ACL.permission}}</span>
+  </div>
+  <hr />
+</div>
diff --git a/falcon-ui/app/html/datasource/datasourceFormAdvancedStepTpl.html b/falcon-ui/app/html/datasource/datasourceFormAdvancedStepTpl.html
new file mode 100644
index 0000000..b382040
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceFormAdvancedStepTpl.html
@@ -0,0 +1,72 @@
+<!--
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<form name="datasourceForm" novalidate id="datasourceFormGeneralStep">
+	<div class="col-xs-24"><label>Access Control List</label></div>
+	<div class="col-xs-24 plr0px">
+		<div class="col-xs-8">
+			<label class="light">Owner<mandatory-field></mandatory-field></label>
+			<input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
+						 ng-required="true"
+						 ng-pattern="validations.patterns.unixId"
+						 ng-model="datasource.ACL.owner"/>
+		</div>
+		<div class="col-xs-8">
+			<label class="light">Group<mandatory-field></mandatory-field></label>
+			<input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
+						 ng-required="true"
+						 ng-pattern="validations.patterns.unixId"
+						 ng-model="datasource.ACL.group"/>
+		</div>
+		<div class="col-xs-24">
+			<div class="col-xs-8 plr0px">
+				<label class="light">Permissions<mandatory-field></mandatory-field></label>
+				<acl-permissions acl-model="datasource.ACL.permission"></acl-permissions>
+			</div>
+		</div>
+		</div>
+
+		<div class="col-xs-24">
+			<div class="pull-right">
+				<button id="datasource.step2" class="btn btn-datasource"
+		         ng-disabled="buttonSpinners.validateShow"
+		         ng-click="validate()">
+		      Test <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.validateShow" />
+		    </button>
+			</div>
+	  </div>
+
+  <div class="col-xs-24 pb15px mt35">
+		<button id="datasource.backToStep1" class="btn prevBtn" type="button" ng-click="goBack()" ng-disabled="buttonSpinners.backShow">
+			PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow">
+		</button>
+		<div class="pull-right">
+	    <a class="btn cnclBtn" ui-sref="main">
+	      CANCEL
+	    </a>
+	    <button id="datasource.step1" class="btn nextBtn"
+	         ng-disabled="buttonSpinners.show"
+	         ng-click="goNext(datasourceForm.$invalid)"
+					 scroll-to-error>
+	      NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+	    </button>
+		</div>
+  </div>
+
+</form>
diff --git a/falcon-ui/app/html/datasource/datasourceFormGeneralStepTpl.html b/falcon-ui/app/html/datasource/datasourceFormGeneralStepTpl.html
new file mode 100644
index 0000000..e5ca971
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceFormGeneralStepTpl.html
@@ -0,0 +1,355 @@
+<!--
+/**
+* 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.
+*/
+-->
+<form name="datasourceForm" novalidate id="datasourceFormGeneralStep">
+	<div class="col-xs-24 plr0px">
+		<div class="col-xs-12">
+			<label class="light" tooltip="datasource.name">Connection Name<mandatory-field></mandatory-field></label>
+			<input type="text" class="form-control" ng-disabled="editingMode" ng-keydown="validations.acceptNoSpaces($event)"
+			check-name="{type:'datasource', check:!editingMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
+			ng-model="datasource.name" ng-required="true" ng-pattern="validations.patterns.name"/>
+		</div>
+		<div class="col-xs-12">
+			<label class="light" tooltip="cluster.colo">Data Center or Colo Name<mandatory-field></mandatory-field></label>
+			<input type="text" class="form-control"
+						ng-pattern="validations.patterns.name"
+						ng-required="true" ng-disabled="xmlPreview.edit"
+						ng-model="datasource.colo" validation-message="{{validations.messages.colo}}"/>
+		</div>
+	</div>
+	<div class="col-xs-24">
+		<label class="light">Description</label>
+		<input type="text" class="form-control"
+		ng-disabled="xmlPreview.edit"
+		ng-pattern="validations.patterns.freeText"
+		ng-model="datasource.description" />
+	</div>
+	<div class="col-xs-24">
+		<label class="light">Tags</label>
+	</div>
+
+	<div class="col-xs-12">
+		<div ng-repeat="tag in datasource.tags">
+			<div class="row dynamic-table-spacer">
+				<div class="col-xs-8">
+					<input type="text" class="form-control" ng-model="tag.key"
+						validation-optional-message="{{validations.messages.key}}"
+							ng-pattern="validations.patterns.alpha" ng-required="tag.value" placeholder="key"/>
+				</div>
+				<div class="col-xs-8">
+					<input type="text" class="form-control" validation-optional-message="{{validations.messages.value}}"
+							ng-model="tag.value"
+							ng-pattern="validations.patterns.alpha" ng-required="tag.key" placeholder="value"/>
+				</div>
+				<div class="col-xs-8">
+					<button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-disabled="xmlPreview.edit" ng-if="!$first || !$last">
+						<span class="entypo minus"></span> delete
+					</button>
+					<button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-disabled="xmlPreview.edit" ng-if="$last">
+						<span class="entypo plus"></span> add tag
+					</button>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<div class="col-xs-24 plr0px">
+		<div class="col-xs-12">
+			<label class="light">Database Manager<mandatory-field></mandatory-field></label>
+			<select class="form-control padding0 "ng-required="true" validation-message="{{validations.messages.dbManager}}"
+				ng-model="datasource.type" ng-change="getDatabaseDefaultDetails()">
+				<option value="" disabled selected style='display:none;'>- Select Database Manager -</option>
+				<option value="mysql">MySQL</option>
+				<option value="oracle">Oracle</option>
+				<option value="hsql">HSQL</option>
+				<option value="db2">DB2</option>
+				<option value="postgres">Postgres</option>
+				<option value="netezza">Netezza</option>
+				<option value="teradata">Teradata</option>
+				<option value="generic">Generic</option>
+				<!-- <option ng-repeat="driverItem in driverList">{{driverItem.name}}</option> -->
+			</select>
+		</div>
+		<div class="col-xs-12">
+			<label class="light">Connection String<mandatory-field></mandatory-field></label>
+			<input type="text" title="You need to update the connection string to point to your db"
+			 ng-required="true"
+			 validation-message="{{validations.messages.connectionString}}"
+			 class="form-control endpointDefault" ng-class="{endpointChanged:datasourceForm.endpoint.$dirty}"
+			 ng-model="datasource.interfaces.interfaces[0].endpoint"/>
+			<!-- <span>jdbc:sqlserver//localhost:80</span> -->
+		</div>
+	</div>
+	<div class="col-xs-24 plr0px">
+		<div class="col-xs-12">
+			<label class="light" tooltip="datasource.driver.jar">Driver Jar<mandatory-field></mandatory-field></label>
+			<div ng-repeat="jar in datasource.driver.jar track by $index" class="col-xs-24 plr0px">
+				<div class="col-xs-16 plr0px">
+					<input type="text" class="form-control" ng-model="jar.value"
+					validation-message="{{validations.messages.driver.jar}}"
+					ng-pattern="validations.patterns.driver"
+					ng-required="true"
+					/>
+				</div>
+				<div class="col-xs-4" ng-if="!$first || !$last">
+					<a href="" class="driver-jar-link" ng-click="removeDriverJar($index)" ng-disabled="xmlPreview.edit">- Delete</a>
+				</div>
+				<div class="col-xs-4">
+					<a href="" class="driver-jar-link" ng-click="addDriverJar()" ng-disabled="xmlPreview.edit" ng-if="$last">+ Add</a>
+				</div>
+			</div>
+		</div>
+		<div class="col-xs-12">
+			<label class="light" tooltip="datasource.driver">Driver Class<mandatory-field></mandatory-field></label>
+			<input type="text" name="driverClass" class="form-control" ng-model="datasource.driver.clazz"
+				validation-message="{{validations.messages.driver.clazz}}"
+				ng-required="true"
+				ng-pattern="validations.patterns.driver"
+			/>
+		</div>
+	</div>
+	<div class="col-xs-12 plr0px">
+		<div class="col-xs-24">
+			<label class="light">Type<mandatory-field></mandatory-field></label>
+		</div>
+		<div class="col-xs-24">
+			<input type="radio" ng-model="datasource.interfaces.interfaces[0].type" value="readonly" class="ml0" />
+			<label class="light mt5" tooltip="datasource.readMode">Read only</label>
+			<input type="radio" ng-model="datasource.interfaces.interfaces[0].type" value="write"/>
+			<label class="light mt5" tooltip="datasource.writeMode">Write</label>
+		</div>
+		<div class="col-xs-24 plr0px">
+			<div class="col-xs-24">
+				<label class="light" tooltip="datasource.interfaces.credentialType">Credential Type<mandatory-field></mandatory-field></label>
+			</div>
+			<div class="col-xs-24">
+				<input type="radio" ng-model="datasource.interfaces.interfaces[0].credential.type" ng-required="!datasource.interfaces.credential.type" value="password-text" class="ml0" />
+				<label class="light mt5" tooltip="datasource.interfaces.credentialType">Username / Password</label>
+				<input type="radio" ng-model="datasource.interfaces.interfaces[0].credential.type" ng-required="!datasource.interfaces.credential.type" value="password-file"/>
+				<label class="light mt5" tooltip="datasource.interfaces.credentialType">Password File</label>
+				<input type="radio" ng-model="datasource.interfaces.interfaces[0].credential.type" ng-required="!datasource.interfaces.credential.type" value="password-alias"/>
+				<label class="light mt5" tooltip="datasource.interfaces.credentialType">Password Alias</label>
+				<label class="col-xs-24 custom-danger validationMessageGral" ng-if="!datasource.interfaces.interfaces[0].credential.type">
+          {{validations.messages.credential.empty}}
+        </label>
+			</div>
+
+			<div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type">
+				<label class="light" tooltip="datasource.userName">Username<mandatory-field></mandatory-field></label>
+				<input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.userName"
+				ng-required="true"
+				validation-optional-message="{{validations.messages.userName}}"
+				ng-pattern="validations.patterns.userName"
+				/>
+			</div>
+			<div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-text'">
+				<label class="light" tooltip="datasource.password">Password<mandatory-field></mandatory-field></label>
+				<input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.passwordText"
+				ng-required="true"
+				validation-optional-message="{{validations.messages.dbPassword}}"
+				ng-pattern="validations.patterns.password"
+				/>
+			</div>
+			<div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-file'">
+				<label class="light" tooltip="datasource.credential.passwordFile">Password File<mandatory-field></mandatory-field></label>
+				<input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.passwordFile"
+				ng-required="true"
+				validation-optional-message="{{validations.messages.passwordFile}}"
+				ng-pattern="validations.patterns.password"
+				/>
+			</div>
+			<div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-alias'">
+				<label class="light" tooltip="datasource.password">Password Alias<mandatory-field></mandatory-field></label>
+				<input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.passwordAlias"
+				validation-optional-message="{{validations.messages.passwordAlias}}"
+				ng-required="true"
+				ng-pattern="validations.patterns.password"
+				/>
+			</div>
+
+			<div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-alias'">
+				<label class="light" tooltip="datasource.password">Provider Path<mandatory-field></mandatory-field></label>
+				<input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.providerPath"
+				validation-optional-message="{{validations.messages.providerPath}}"
+				ng-required="true"
+				ng-pattern="validations.patterns.password"
+				/>
+			</div>
+		</div>
+	</div>
+	<div class="col-xs-24 plr0px">
+		<label class="col-xs-24" tooltip="datasource.properties">Sqoop Properties</label>
+		<div class="col-xs-12">
+			<input type="checkbox" class="ml0"
+			ng-model="((datasource.properties | filter:{name:'directMode'})[0]).value"
+			ng-disabled="xmlPreview.edit" />
+			<label class="light" tooltip="datasource.directMode">Direct</label>
+			<input type="checkbox"
+			ng-model="((datasource.properties | filter:{name:'verboseMode'})[0]).value"
+			ng-disabled="xmlPreview.edit" />
+			<label class="light" tooltip="datasource.verboseMode">Verbose</label>
+		</div>
+	</div>
+	<div class="col-xs-24 plr0px">
+		<div class="col-xs-24">
+			<a href="" class="datasource-link" ng-click="addProperty()" ng-disabled="xmlPreview.edit">+ Add Property</a>
+		</div>
+		<div class="row m0" ng-if="datasource.customProperties.length > 0">
+			<label class="col-xs-8">Property Name</label><label class="col-xs-16">Value</label>
+		</div>
+		<div ng-repeat="property in datasource.customProperties" class="row m0"  ng-if="datasource.customProperties.length > 0">
+			<div class="col-xs-8 dynamic-table-spacer">
+				<input type="text" class="form-control" ng-model="property.name"
+				ng-pattern="validations.patterns.propertyName"
+				validation-optional-message="{{validations.messages.name}}"
+				ng-disabled="xmlPreview.edit"
+				ng-required="property.value" placeholder="name" />
+			</div>
+			<div class="col-xs-8 dynamic-table-spacer">
+				<input type="text" class="form-control" ng-model="property.value"
+				validation-optional-message="{{validations.messages.value}}"
+				ng-disabled="xmlPreview.edit"
+				ng-required="property.name" placeholder="value" />
+			</div>
+			<div class="dynamic-table-spacer">
+				<button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)"
+				ng-disabled="xmlPreview.edit">
+				<span class="entypo minus"></span> delete
+			</button>
+		</div>
+	</div>
+</div>
+</div>
+<div class="col-xs-24 plr0px">
+	<div class="col-xs-12">
+		<label class="light" tooltip="datasource.parameterFile">Sqoop Parameter File</label>
+		<div class="form-inline">
+			<input type="text" class="form-control" ng-disabled="xmlPreview.edit"
+			ng-model="((datasource.properties | filter:{name:'parameterFile'})[0]).value"
+			validation-optional-message="{{validations.messages.parameterFile}}"/>
+			<!-- <button type="button" class="btn btn-sharp btn-browse" ng-disabled="xmlPreview.edit" ng-click="">
+			<i>Browse</i>
+		</button> -->
+		<!-- <a href="" class="datasource-link" ng-click="addParameter()" ng-disabled="xmlPreview.edit">+ Add Parameters</a> -->
+		<!-- <div class="pull-right">
+		<label class="light" tooltip="datasource.parameters">Parameters</label>
+		<a href="" class="datasource-link">+ Add Parameters</a>
+	</div>
+</div> -->
+<!-- <div class="form-inline pull-right">
+<label class="light" tooltip="datasource.parameterFile">Parameter File</label>
+<input type="text" class="form-control" ng-disabled="xmlPreview.edit"
+ng-model="datasource.parameterFile"
+validation-optional-message="{{validations.messages.parameterFile}}"/>
+<button type="button" class="btn btn-sharp btn-browse" ng-disabled="xmlPreview.edit" ng-click="">
+<i>Browse</i>
+</button>
+</div> -->
+</div>
+</div>
+</div>
+
+<div class="col-xs-12 plr0px">
+	<div class="row m0" ng-if="datasource.parameters.length > 0">
+		<label class="col-xs-8">Parameter Name</label><label class="col-xs-16">Value</label>
+	</div>
+	<div ng-repeat="parameter in datasource.parameters" class="row m0" ng-if="datasource.parameters.length > 0">
+		<div class="col-xs-8 dynamic-table-spacer">
+			<input type="text" class="form-control" ng-model="parameter.name"
+			ng-pattern="validations.patterns.propertyName"
+			validation-optional-message="{{validations.messages.name}}"
+			ng-disabled="xmlPreview.edit"
+			ng-required="parameter.value" placeholder="name" />
+		</div>
+		<div class="col-xs-8 dynamic-table-spacer">
+			<input type="text" class="form-control" ng-model="parameter.value"
+			validation-optional-message="{{validations.messages.value}}"
+			ng-disabled="xmlPreview.edit"
+			ng-required="parameter.name" placeholder="value" />
+		</div>
+		<div class="dynamic-table-spacer">
+			<button type="button" class="btn btn-default btn-xs" ng-click="removeParameter($index)"
+			ng-disabled="xmlPreview.edit">
+			<span class="entypo minus"></span> delete
+		</button>
+	</div>
+</div>
+</div>
+<!-- <div class="pull-right">
+<label class="light" tooltip="datasource.properties">Properties</label>
+<a href="" class="datasource-link">+ Add Properties</a>
+</div> -->
+
+	<div class="col-xs-24 advancedOption" ng-click="expandOptions = !expandOptions" id="snapshotAdvancedOption">
+		<label class="mt15 pointer blink-success">ADVANCED OPTIONS</label>
+		<i class="glyphicon glyphicon-chevron-down mt15" ng-if="!expandOptions"></i>
+		<i class="glyphicon glyphicon-chevron-up mt15" ng-if="expandOptions"></i>
+	</div>
+
+	<div id="advancedOptionsBox" class="col-xs-24 plr0px" ng-class="{expanded:expandOptions}">
+		<div class="col-xs-24"><label>Access Control List</label></div>
+		<div class="col-xs-24 plr0px">
+			<div class="col-xs-8">
+				<label class="light">Owner<mandatory-field></mandatory-field></label>
+				<input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
+							 ng-required="true"
+							 ng-pattern="validations.patterns.unixId"
+							 ng-model="datasource.ACL.owner"/>
+			</div>
+			<div class="col-xs-8">
+				<label class="light">Group<mandatory-field></mandatory-field></label>
+				<input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
+							 ng-required="true"
+							 ng-pattern="validations.patterns.unixId"
+							 ng-model="datasource.ACL.group"/>
+			</div>
+			<div class="col-xs-24">
+				<div class="col-xs-8 plr0px">
+					<label class="light">Permissions<mandatory-field></mandatory-field></label>
+					<acl-permissions acl-model="datasource.ACL.permission"></acl-permissions>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<div class="col-xs-24">
+		<div class="pull-right">
+			<button id="datasource.step2" class="btn btn-datasource"
+					 ng-disabled="buttonSpinners.validateShow"
+					 ng-click="validate()">
+				TEST <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.validateShow" />
+			</button>
+		</div>
+	</div>
+
+	<div class="col-xs-24 pb15px mt35">
+		<div class="pull-right">
+			<a class="btn cnclBtn" ui-sref="main">
+				CANCEL
+			</a>
+			<button id="datasource.step1" class="btn nextBtn"
+				ng-disabled="buttonSpinners.show"
+				ng-click="goNext(datasourceForm.$invalid)"
+				scroll-to-error>
+				NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+			</button>
+		</div>
+	</div>
+
+</form>
diff --git a/falcon-ui/app/html/datasource/datasourceFormSummaryStepTpl.html b/falcon-ui/app/html/datasource/datasourceFormSummaryStepTpl.html
new file mode 100644
index 0000000..29923f9
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceFormSummaryStepTpl.html
@@ -0,0 +1,113 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<div class="row datasourceSummaryRow" id="datasourceSummaryStep">
+  <h4 class="col-sm-24">
+    General
+  </h4>
+  <div class="col-sm-24">
+    <label>Connection Name</label>: <span>{{datasource.name}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Data Center or Colo Name</label>: <span>{{datasource.colo}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Description</label>: <span>{{datasource.description}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Type</label>: <span>{{datasource.type}}</span>
+  </div>
+
+  <h4 class="col-sm-24">
+    Interfaces
+  </h4>
+  <div class="col-sm-24 plr0px" ng-repeat="interface in datasource.interfaces.interfaces">
+    <div class="col-sm-24">
+      <label>Interface Type</label>: <span>{{interface.type}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Interface Endpoint</label>: <span>{{interface.endpoint}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type != ''">
+      <label>Interface Credentials</label>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type != ''">
+      <label>Credential Type</label>: <span>{{interface.credential.type}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+      <label>User Name</label>: <span>{{interface.credential.userName}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+      <label>Password Text</label>: <span>{{interface.credential.passwordText}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-file'">
+      <label>Password File</label>: <span>{{interface.credential.passwordFile}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-alias'">
+      <label>Password Alias</label>: <span>{{interface.credential.passwordAlias}}</span>
+    </div>
+  </div>
+
+  <h4 class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+    Default Credentials
+  </h4>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+    <label>Credential Type</label>: <span>{{datasource.interfaces.credential.type}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+    <label>User Name</label>: <span>{{datasource.interfaces.credential.userName}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+    <label>Password Text</label>: <span>{{datasource.interfaces.credential.passwordText}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-file'">
+    <label>Password File</label>: <span>{{datasource.interfaces.credential.passwordFile}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-alias'">
+    <label>Password Alias</label>: <span>{{datasource.interfaces.credential.passwordAlias}}</span>
+  </div>
+
+  <h4 class="col-sm-24">
+    Properties
+  </h4>
+  <div class="col-sm-24" ng-repeat="property in datasource.customProperties | filter: {name: '!!'}">
+    <label>{{property.name}}</label>: <span>{{property.value}}</span>
+  </div>
+  <div ng-repeat="property in datasource.properties">
+    <div class="col-sm-24" ng-if="property.value && property.value !== ''">
+      <label>{{property.name}}</label>: <span>{{property.value}}</span>
+    </div>
+  </div>
+</div>
+
+<div class="col-xs-24 mt35 pb15px pl0px">
+  <button id="datasource.backToStep1" class="btn prevBtn" type="button"
+       ng-click="goBack()"
+       ng-disabled="buttonSpinners.backShow">
+    PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+  </button>
+  <div class="pull-right">
+    <a class="btn cnclBtn" ui-sref="main">
+      CANCEL
+    </a>
+    <button id="datasource.step2" class="btn nextBtn" ng-click="saveEntity()" focus-if>
+      SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+  </div>
+</div>
diff --git a/falcon-ui/app/html/datasource/datasourceFormTpl.html b/falcon-ui/app/html/datasource/datasourceFormTpl.html
new file mode 100644
index 0000000..7a0b7ec
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceFormTpl.html
@@ -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.
+ */
+-->
+<div class="datasourceForm">
+  <div class="col-xs-24">
+    <div class="preview pullOver">
+      <button  type="button" class="btn btn-default btn-md pull-right nextBtn" ng-click="toggleclick()" >Preview XML</button>
+    </div>
+    <br/>
+    <div>
+      <div class=" formBoxContainer detailsBox">
+        <div class="datasourceProgressBox" ng-class="{
+          general:isActive('forms.datasource.general'),
+          summary:isActive('forms.datasource.summary')
+          }">
+          <div class="progressBar col-xs-24">
+              <div class="text-center fir" ng-class="{
+                active:isActive('forms.datasource.general'),
+                completed:isCompleted('forms.datasource.general')}">General</div>
+              <div class="text-center fif" ng-class="{
+                active:isActive('forms.datasource.summary'),
+                completed:isCompleted('forms.datasource.summary')}">Summary</div>
+          </div>
+        </div>
+        <div class="row customContainer">
+          <div class="col-xs-offset-1 col-xs-22">
+            <fieldset ng-disabled="!editXmlDisabled">
+              <div class="formViewContainer">
+                <div class="col-xs-24">
+                  <label class="title"><span class="entypo download icon-lg entypo-align-sub"></span> NEW DATA SOURCE</label>
+                </div>
+                <div ui-view></div>
+              </div>
+            </fieldset>
+          </div>
+        </div>
+      </div>
+
+      <div class="hide xmlPreviewContainer detailsBox">
+        <div class="row dt">
+          <div class="col-xs-24 pt15px">
+            <div class="col-xs-13 noSpecial">
+                <h5>XML Preview</h5>
+                <label style="margin-top: -10px;margin-bottom: -2px;" ng-if="invalidXml" class="custom-danger">Invalid Xml</label>
+            </div>
+
+            <div class="pull-right">
+              <button type="button"
+                      id="datasource.editXML"
+                      class="btn btn-default btn-xs"
+                      ng-click="toggleEditXml()"
+                      ng-class="{'btn-warning':!editXmlDisabled}"
+                      ng-disabled="invalidXml">
+                <div ng-if="editXmlDisabled">Edit XML</div>
+                <div ng-if="!editXmlDisabled">Finish</div>
+              </button>
+
+              <button type="button"
+                      class="btn btn-default btn-xs"
+                      ng-if="invalidXml"
+                      ng-click="revertXml()">
+                  <div>Revert</div>
+              </button>
+            </div>
+		  </div>
+          <div class="col-sm-24 showValidationStyle">
+            <textarea ng-model="prettyXml"
+                      elastic
+                      class="form-control"
+                      ng-disabled="editXmlDisabled"
+                      ng-class="{fakeInvalid:invalidXml}">
+            </textarea>
+            <!--{{xmlEditValidationError}}-->
+          </div>
+
+          </div>
+        </div>
+    </div>
+  </div>
+</div>
diff --git a/falcon-ui/app/html/datasource/datasourceSummary.html b/falcon-ui/app/html/datasource/datasourceSummary.html
new file mode 100644
index 0000000..69e68f8
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceSummary.html
@@ -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.
+ */
+-->
+<div class="summaryBox" id="datasourceFormSummary">
+  <h4 class="col-sm-24">
+    General
+  </h4>
+  <div class="col-sm-24">
+    <label>Connection Name</label>: <span>{{datasource.name}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Data Center or Colo Name</label>: <span>{{datasource.colo}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Description</label>: <span>{{datasource.description}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Type</label>: <span>{{datasource.type}}</span>
+  </div>
+
+  <h4 class="col-sm-24">
+    Interfaces
+  </h4>
+  <div class="col-sm-24 plr0px" ng-repeat="interface in datasource.interfaces.interfaces">
+    <div class="col-sm-24">
+      <label>Interface Type</label>: <span>{{interface.type}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Interface Endpoint</label>: <span>{{interface.endpoint}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type != ''">
+      <label>Interface Credentials</label>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type != ''">
+      <label>Credential Type</label>: <span>{{interface.credential.type}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+      <label>User Name</label>: <span>{{interface.credential.userName}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+      <label>Password Text</label>: <span>{{interface.credential.passwordText}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-file'">
+      <label>Password File</label>: <span>{{interface.credential.passwordFile}}</span>
+    </div>
+    <div class="col-sm-24" ng-if="interface.credential.type == 'password-alias'">
+      <label>Password Alias</label>: <span>{{interface.credential.passwordAlias}}</span>
+    </div>
+  </div>
+
+  <h4 class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+    Default Credentials
+  </h4>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+    <label>Credential Type</label>: <span>{{datasource.interfaces.credential.type}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+    <label>User Name</label>: <span>{{datasource.interfaces.credential.userName}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+    <label>Password Text</label>: <span>{{datasource.interfaces.credential.passwordText}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-file'">
+    <label>Password File</label>: <span>{{datasource.interfaces.credential.passwordFile}}</span>
+  </div>
+  <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-alias'">
+    <label>Password Alias</label>: <span>{{datasource.interfaces.credential.passwordAlias}}</span>
+  </div>
+
+  <h4 class="col-sm-24">
+    Properties
+  </h4>
+  <div class="col-sm-24" ng-repeat="property in datasource.customProperties">
+    <label>{{property.name}}</label>: <span>{{property.value}}</span>
+  </div>
+  <div class="col-sm-24" ng-repeat="property in datasource.properties">
+    <label>{{property.name}}</label>: <span>{{property.value}}</span>
+  </div>
+</div>
diff --git a/falcon-ui/app/html/directives/aclPermissions.html b/falcon-ui/app/html/directives/aclPermissions.html
new file mode 100644
index 0000000..13e4b50
--- /dev/null
+++ b/falcon-ui/app/html/directives/aclPermissions.html
@@ -0,0 +1,45 @@
+<!--
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<div class="col-xs-24 plr0px panel panel-default aclPermission">
+  <div class="col-xs-24 plr0px">
+    <span class="col-xs-4"></span>
+    <span class="col-xs-4 font11px pt5px">Read</span>
+    <span class="col-xs-4 font11px pt5px">Write</span>
+    <span class="col-xs-4 font11px pt5px">Execute</span>
+  </div>
+      <div class="col-xs-24 plr0px">
+      <span class="col-xs-4 font11px pt5px">Owner</span>
+      <span class="col-xs-4"><input type="checkbox" name="owner" value="4" ng-click="calculatePermission('owner')" ng-disabled="xmlPreview.edit"></span>
+      <span class="col-xs-4"><input type="checkbox" name="owner" value="2" ng-click="calculatePermission('owner')" ng-disabled="xmlPreview.edit"></span>
+      <span class="col-xs-4"><input type="checkbox" name="owner" value="1" ng-click="calculatePermission('owner')" ng-disabled="xmlPreview.edit"></span>
+    </div>
+    <div class="col-xs-24 plr0px">
+      <span class="col-xs-4 font11px pt5px">Group</span>
+      <span class="col-xs-4"><input type="checkbox" name="groups" value="4" ng-click="calculatePermission('groups')" ng-disabled="xmlPreview.edit"></span>
+      <span class="col-xs-4"><input type="checkbox" name="groups" value="2" ng-click="calculatePermission('groups')" ng-disabled="xmlPreview.edit"></span>
+      <span class="col-xs-4"><input type="checkbox" name="groups" value="1" ng-click="calculatePermission('groups')" ng-disabled="xmlPreview.edit"></span>
+    </div>
+    <div class="col-xs-24 plr0px">
+      <span class="col-xs-4 font11px pt5px">Others</span>
+      <span class="col-xs-4"><input type="checkbox" name="others" value="4" ng-click="calculatePermission('others')" ng-disabled="xmlPreview.edit"></span>
+      <span class="col-xs-4"><input type="checkbox" name="others" value="2" ng-click="calculatePermission('others')" ng-disabled="xmlPreview.edit"></span>
+      <span class="col-xs-4"><input type="checkbox" name="others" value="1" ng-click="calculatePermission('others')" ng-disabled="xmlPreview.edit"></span>
+    </div>
+</div>
diff --git a/falcon-ui/app/html/directives/dependenciesGraphDv.html b/falcon-ui/app/html/directives/dependenciesGraphDv.html
index 7fbba06..9b263fd 100644
--- a/falcon-ui/app/html/directives/dependenciesGraphDv.html
+++ b/falcon-ui/app/html/directives/dependenciesGraphDv.html
@@ -16,4 +16,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
\ No newline at end of file
+-->
+<svg >
+    <g/>
+</svg>
diff --git a/falcon-ui/app/html/directives/entitiesListDv.html b/falcon-ui/app/html/directives/entitiesListDv.html
index 7016de1..f791e50 100644
--- a/falcon-ui/app/html/directives/entitiesListDv.html
+++ b/falcon-ui/app/html/directives/entitiesListDv.html
@@ -52,9 +52,9 @@
             <span class="entypo play"></span> <div>Resume</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-hide="selectedDisabledButtons.suspend" ng-if="type !== 'cluster'">
-            <span class="entypo paus"></span> <div>Suspend</div>
+            <span class="entypo paus"></span> <div>Pause</div>
         </div>
-        <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeEdit()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1" ng-if="type !== 'cluster'">
+        <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeEdit()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1">
             <span class="entypo cog"></span> <div>Edit</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeClone()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1">
@@ -68,6 +68,8 @@
         </div>
       </td>
     </tr>
+  </tbody>
+  <tbody>
     <tr ng-if="input.length === 0 && !server.responses.listLoaded[type]">
       <td> loading {{ type }}s </td>
     </tr>
@@ -104,4 +106,4 @@
     </tr>
   </tbody>
 
-</table>
\ No newline at end of file
+</table>
diff --git a/falcon-ui/app/html/directives/entitiesSearchListDv.html b/falcon-ui/app/html/directives/entitiesSearchListDv.html
index 3e356fc..30dee7c 100644
--- a/falcon-ui/app/html/directives/entitiesSearchListDv.html
+++ b/falcon-ui/app/html/directives/entitiesSearchListDv.html
@@ -22,31 +22,39 @@
 <table class="listTable table" id="entitiesSearchList">
   <thead>
     <tr>
-      <th><div class="filtersSearchBox"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
+      <th><div class="filtersSearchBox pointer"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
       <th><div class="filtersSearchBox pointer" ng-click="toggleSortOrder()">Name <span class="glyphicon glyphicon-sort"></span></div> </th>
       <th><div class="filtersSearchBox">Tags</div></th>
-      <th><div class="filtersSearchBox">Cluster</div></th>
-      <th><div class="filtersSearchBox">Type</div></th>
-      <th><div class="filtersSearchBox">Status</div></th>
+      <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Cluster</div></th>
+      <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Type</div></th>
+      <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Status</div></th>
     </tr>
+
   </thead>
 
   <tbody>
     <tr ng-if="input.length > 0" class="buttonsRow">
       <td class="buttonCell" colspan="9">
-        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-disabled="selectedDisabledButtons.schedule">
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-disabled="selectedDisabledButtons.schedule"
+           ng-if="$parent.$parent.$parent.entityType != 'cluster'">
           <span class="entypo play"></span> <div>Schedule</div>
         </div>
-        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume">
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume"
+           ng-if="$parent.$parent.$parent.entityType != 'cluster'">
           <span class="entypo play"></span> <div>Resume</div>
         </div>
-        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend">
-          <span class="entypo paus"></span> <div>Suspend</div>
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend"
+           ng-if="$parent.$parent.$parent.entityType != 'cluster'">
+          <span class="entypo paus"></span> <div>Pause</div>
         </div>
-        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeEdit()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeEdit()"
+          ng-disabled="selectedRows.length === 0 || selectedRows.length > 1 || ($parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode() || !isSuperUser()))"
+          ng-class="{disabledEditBtn: $parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode()  || !isSuperUser())}"
+          title="{{($parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode() || !isSuperUser())) ? 'Cluster entity update can only be performed by superuser during safemode' : ''}}">
           <span class="entypo cog"></span> <div>Edit</div>
         </div>
-        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeClone()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeClone()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1"
+          ng-if="$parent.$parent.$parent.entityType != 'cluster'">
           <span class="entypo docs"></span> <div>Copy</div>
         </div>
         <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeRemove()" ng-disabled="selectedRows.length === 0">
@@ -57,7 +65,8 @@
         </div>
       </td>
     </tr>
-
+  </tbody>
+  <tbody>
     <tr ng-if="input.length === 0 && !server.responses.listLoaded">
       <td> loading... </td>
     </tr>
@@ -72,14 +81,15 @@
         ng-class="{
               firstEntityRow:$first, lastEntityRow:$last,
               rowSelected:checkedRow(item.name)
-            }">
+            }"
+        ng-class-odd="'oddRow'" ng-class-even="'evenRow'">
       <td class="checkboxCell">
         <input type="checkbox" checklist-model="selectedRows" ng-model="$index"
                checklist-value="{name:item.name, type:item.type, status:item.status}"
                ng-change="checkButtonsToShow()"/>
       </td>
       <td class="nameCell" ng-init="entityType = item.type | uppercase">
-        <button type="button" class="btn btn-default" ng-click="goEntityDetails(item.name, item.type)">
+        <button type="button" class="btn btn-link" ng-click="goEntityDetails(item.name, item.type)">
           <span ng-class="displayIcon((item.type | uppercase), item.tags.tag)"></span> {{ item.name }}
         </button>
       </td>
@@ -88,17 +98,17 @@
           {{ tag }}{{$last ? '' : ', '}}
         </span>
       </td>
-      <td>
+      <td ng-if="$parent.$parent.$parent.entityType != 'cluster'">
         <span ng-repeat="cluster in item.clusters.cluster">
           {{ cluster }}{{$last ? '' : ', '}}
         </span>
       </td>
-      <td>
+      <td ng-if="$parent.$parent.$parent.entityType != 'cluster'">
         <span ng-repeat="tag in item.tags.tag" ng-init="type = displayType(tag)">
           {{ type | uppercase}}
         </span>
       </td>
-      <td class="stateCell">
+      <td class="stateCell" ng-if="$parent.$parent.$parent.entityType != 'cluster'">
         <span ng-class="{'blink-success': item.status == 'RUNNING',
                          'text-success': item.status == 'SUCCEEDED',
                          'blink-warning': item.status == 'SUSPENDED',
@@ -114,7 +124,7 @@
       </td>
     </tr>
 
-    <tr>
+    <tr class="paginationRow">
       <td colspan="9">
         <nav class="pull-right">
           <ul class="pagination">
diff --git a/falcon-ui/app/html/directives/feedFormHdfsStorage.html b/falcon-ui/app/html/directives/feedFormHdfsStorage.html
new file mode 100644
index 0000000..143d155
--- /dev/null
+++ b/falcon-ui/app/html/directives/feedFormHdfsStorage.html
@@ -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.
+*/
+-->
+<div class="col-xs-24 plr0px">
+  <div class="col-xs-10 plr0px">
+    <div class="col-xs-24">
+      <label class="light">Cluster<mandatory-field></mandatory-field></label>
+    </div>
+    <div class="col-xs-24">
+      <select ng-model="cluster.name" name="clusterName"
+        class="form-control padding0" ng-required="required"
+        ng-change="findClusterExists(cluster.name, cluster.type, storageInfo.feedClusters)"
+        validation-message="{{validations.messages.cluster}}">
+        <option value="" disabled style='display:none;'>-Select {{cluster.type}} cluster-</option>
+        <option ng-repeat="clusterItem in storageInfo.clustersList"
+          value="{{clusterItem.name}}" ng-selected="cluster.name === clusterItem.name">
+          {{clusterItem.name}}
+        </option>
+      </select>
+    </div>
+    <div class="col-xs-24 custom-danger" ng-show="checkDuplicateClusterOnTarget()">
+      Target cannot be the same as the Source
+    </div>
+    <div class="col-xs-24 custom-danger" ng-show="clusterExists">
+      Cluster is already added
+    </div>
+    <div class="col-xs-24">
+      <label class="light">Data Path<mandatory-field></mandatory-field></label>
+    </div>
+    <div ng-repeat="location in cluster.storage.fileSystem.locations">
+      <div class="col-xs-24" ng-if="location.type==='data'">
+        <input type="text" name="dataPath"
+          placeholder="Enter Data Path"
+          ng-required="cluster.name"
+          validation-optional-message="{{validations.messages.path}}"
+          class="form-control"
+          ng-model="location.path" />
+      </div>
+    </div>
+    <div class="col-xs-24">
+      <a href="" ng-click="toggleAdvancedOptions()">MORE OPTIONS ></a>
+    </div>
+  </div>
+  <div class="col-xs-12 plr0px">
+    <div class="datasourceBox" ng-show="showingAdvancedOptions">
+      <div class="col-xs-24">
+        <label class="light">Statistics Path</label>
+      </div>
+      <div ng-repeat="location in cluster.storage.fileSystem.locations">
+        <div class="col-xs-24" ng-if="location.type==='stats'">
+          <input type="text" class="form-control" ng-model="location.path"/>
+        </div>
+      </div>
+      <div class="col-xs-24 validityBox plr0px">
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-12 startDateBox">
+            <label class="light">Start<mandatory-field></mandatory-field></label>
+              <input type="text"
+                name="startDateInput"
+                class="form-control dateInput"
+                placeholder="{{dateFormat | lowercase}}"
+                ng-model="cluster.validity.start.date"
+                simple-date-picker />
+          </div>
+          <div class="col-xs-12 startTimeBox">
+            <label class="light">Time<mandatory-field></mandatory-field></label>
+            <timepicker ng-change="constructDate()"
+              ng-model="cluster.validity.start.time"
+              hour-step="1"
+              minute-step="1"
+              show-meridian="true">
+            </timepicker>
+          </div>
+        </div>
+        <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.start.date">
+          {{validations.messages.date.empty}}
+        </label>
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-12 endDateBox">
+            <label class="light">End<mandatory-field></mandatory-field></label>
+                          <input type="text"
+                name="startDateInput"
+                class="form-control dateInput"
+                placeholder="{{dateFormat | lowercase}}"
+                ng-model="cluster.validity.end.date"
+                simple-date-picker />
+          </div>
+          <div class="col-xs-12 endTimeBox">
+            <label class="light">Time<mandatory-field></mandatory-field></label>
+            <timepicker ng-change="constructDate()"
+              ng-model="cluster.validity.end.time"
+              hour-step="1"
+              minute-step="1"
+              show-meridian="true">
+            </timepicker>
+          </div>
+        </div>
+        <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.end.date">
+          {{validations.messages.date.empty}}
+        </label>
+      </div>
+      <label class="light col-xs-24">Retention<mandatory-field></mandatory-field></label>
+      <div class="col-xs-24 inlineInputsGroup">
+        <input type="text" class="form-control" ng-model="cluster.retention.quantity"
+          ng-keydown="validations.acceptOnlyNumber($event)" ng-pattern="validations.patterns.twoDigits" />
+        <select ng-model="cluster.retention.unit">
+          <option selected value="minutes">minutes</option>
+          <option value="hours">hours</option>
+          <option value="days">days</option>
+          <option value="months">months</option>
+        </select>
+      </div>
+    </div>
+  </div>
+</div>
+<div class="col-xs-24 mt10">
+  <a ng-click="reset()" ng-if="!storageInfo.readOnly">Reset</a>
+  <button class="btn datasourceBtn" ng-if="!storageInfo.readOnly"
+    ng-disabled="cluster.name==='' || !cluster.storage.fileSystem.locations[0].path || cluster.storage.fileSystem.locations[0].path ==='' || clusterExists"
+    ng-click="addCluster({type : storageInfo.type, dataTransferType : 'hdfs'})">Add {{buttonText}}</button>
+  <button class="btn datasourceBtn" ng-click="deleteCluster()"
+    ng-if="(storageInfo.feedClusters | filter:{type: cluster.type}).length > 1">Delete</button>
+</div>
diff --git a/falcon-ui/app/html/directives/feedFormHiveStorage.html b/falcon-ui/app/html/directives/feedFormHiveStorage.html
new file mode 100644
index 0000000..655a973
--- /dev/null
+++ b/falcon-ui/app/html/directives/feedFormHiveStorage.html
@@ -0,0 +1,132 @@
+<!--
+/**
+* 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.
+*/
+-->
+<div class="col-xs-24 plr0px">
+  <div class="col-xs-10 plr0px">
+    <div class="datasourceBox">
+      <div class="col-xs-24">
+        <label class="light">Cluster<mandatory-field></mandatory-field></label>
+      </div>
+      <div class="col-xs-24">
+        <select ng-model="cluster.name" class="form-control padding0" ng-required="required"
+          ng-change="findClusterExists(cluster.name, cluster.type, storageInfo.feedClusters)"
+          validation-message="{{validations.messages.cluster}}">
+          <option value="" disabled style='display:none;'>-Select {{cluster.type}} cluster-</option>
+          <option ng-repeat="clusterItem in storageInfo.clustersList"
+            value="{{clusterItem.name}}" ng-selected="cluster.name === clusterItem.name">
+          {{clusterItem.name}}
+          </option>
+        </select>
+      </div>
+      <div class="col-xs-24 custom-danger" ng-show="checkDuplicateClusterOnTarget()">
+        Target cannot be the same as the Source
+      </div>
+      <div class="col-xs-24 custom-danger" ng-show="clusterExists">
+        Cluster is already added
+      </div>
+      <div class="col-xs-24">
+        <label class="light" tooltip="feed.storage.tableUri">
+          Table URI<mandatory-field></mandatory-field>
+        </label>
+      </div>
+      <div class="col-xs-24">
+        <input type="text"
+          placeholder="Enter table uri"
+          class="form-control"
+          ng-required="cluster.name"
+          validation-optional-message="{{validations.messages.tableUri}}"
+          ng-model="cluster.storage.catalog.catalogTable.uri" />
+      </div>
+      <div class="col-xs-24">
+        <a href="" ng-click="toggleAdvancedOptions()">MORE OPTIONS ></a>
+      </div>
+    </div>
+  </div>
+  <div class="col-xs-12 plr0px">
+    <div class="datasourceBox" ng-show="showingAdvancedOptions">
+      <div class="col-xs-24 validityBox plr0px">
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-12 startDateBox">
+            <label class="light">Start<mandatory-field></mandatory-field></label>
+            <input type="text"
+              name="startDateInput"
+              class="form-control dateInput"
+              placeholder="{{dateFormat | lowercase}}"
+              ng-model="cluster.validity.start.date"
+              simple-date-picker />
+          </div>
+          <div class="col-xs-12 startTimeBox">
+            <label class="light">Time<mandatory-field></mandatory-field></label>
+            <timepicker ng-change="constructDate()"
+              ng-model="cluster.validity.start.time"
+              hour-step="1"
+              minute-step="1"
+              show-meridian="true">
+            </timepicker>
+          </div>
+        </div>
+        <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.start.date">
+          {{validations.messages.date.empty}}
+        </label>
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-12 endDateBox">
+            <label class="light">End<mandatory-field></mandatory-field></label>
+            <input type="text"
+              name="startDateInput"
+              class="form-control dateInput"
+              placeholder="{{dateFormat | lowercase}}"
+              ng-model="cluster.validity.end.date"
+              simple-date-picker />
+          </div>
+          <div class="col-xs-12 endTimeBox">
+            <label class="light">Time<mandatory-field></mandatory-field></label>
+            <timepicker ng-change="constructDate()"
+              ng-model="cluster.validity.end.time"
+              hour-step="1"
+              minute-step="1"
+              show-meridian="true">
+            </timepicker>
+          </div>
+        </div>
+        <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.end.date">
+          {{validations.messages.date.empty}}
+        </label>
+      </div>
+      <label class="light col-xs-24">Retention<mandatory-field></mandatory-field></label>
+      <div class="col-xs-24 inlineInputsGroup">
+        <input type="text" class="form-control" ng-required="required" ng-model="cluster.retention.quantity" ng-keydown="validations.acceptOnlyNumber($event)" ng-pattern="validations.patterns.twoDigits">
+        <select ng-model="cluster.retention.unit" ng-keydown="validations.acceptOnlyNumber({$event:$event})" ng-required="required">
+          <option selected value="minutes">minutes</option>
+          <option value="hours">hours</option>
+          <option value="days">days</option>
+          <option value="months">months</option>
+        </select>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="col-xs-24 mt10">
+  <a ng-click="reset()" ng-if="!storageInfo.readOnly">Reset</a>
+  <button class="btn datasourceBtn" ng-if="!storageInfo.readOnly"
+    ng-disabled="cluster.name === '' || !cluster.storage.catalog.catalogTable.uri || $scope.cluster.name === '' || $scope.cluster.storage.catalog.catalogTable.uri==='' || clusterExists"
+    ng-click="addCluster({type : storageInfo.type, dataTransferType : 'hive'})">Add {{buttonText}}</button>
+  <button class="btn datasourceBtn" ng-click="deleteCluster()"
+    ng-if="(storageInfo.feedClusters | filter:{type: cluster.type}).length > 1">Delete</button>
+</div>
diff --git a/falcon-ui/app/html/directives/instancesListDv.html b/falcon-ui/app/html/directives/instancesListDv.html
index 5abc9d3..a3cc193 100644
--- a/falcon-ui/app/html/directives/instancesListDv.html
+++ b/falcon-ui/app/html/directives/instancesListDv.html
@@ -17,34 +17,28 @@
  * limitations under the License.
  */
 -->
-<table class="listTable table" id="instancesList">
+<table class="listTable table">
   <thead>
   <tr>
-    <th><div class="filtersSearchBox vertical-align"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
-    <th><div class="filtersSearchBox vertical-align">Instance</div></th>
-    <th><div class="filtersSearchBox">Started&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('startTime')"></span>
-      <input type="text" class="form-control dateInput" ng-model="startFilter" ng-keypress="validateDate($event, 'start');"
-             ng-enter="filterInstances('startTime')" placeholder="mm/dd/yyyy hh:mm">
-      <label class="error" ng-if="startFilterError">Incorrect Date Format</label>
-      <label class="error" ng-if="startAfterEndError">Start date should be before end date</label>
-      <label class="error" ng-if="startAfterNominalError">Start date should be after nominal start date {{ start }}</label>
-      <label class="error" ng-if="startBeforeNominalError">Start date should be before nominal end date {{ end }}</label>
+    <th class="align-top"><div class="filtersSearchBox vertical-align pt35px"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
+    <th class="align-top"><div class="filtersSearchBox vertical-align">Instance</div>
+		 <input type="text" class="form-control" placeholder="instance" restrict="reject">
+	</th>
+    <th class="align-top"><div class="filtersSearchBox" ng-class="{showMessage:!startDateValid, showValidationStyle :!startDateValid, validationMessageParent:!startDateValid}">Started&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('startTime')"></span>
+      <input type="text" title="Date should be entered in {{dateFormat | lowercase}} format." class="form-control dateInput" ng-model="startFilter" ng-enter="filterInstances('startTime')" placeholder="{{dateFormat | lowercase}}" ng-keypress="validateDate($event,'start')">
+      <label class="custom-danger validationMessageGral" ng-if="!startDateValid">You need to provide a valid date</label>
     </div></th>
-    <th><div class="filtersSearchBox">Ended&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('endTime')"></span>
-      <input type="text" class="form-control dateInput" ng-model="endFilter" ng-keypress="validateDate($event, 'end');"
-             ng-enter="filterInstances('endTime')" placeholder="mm/dd/yyyy hh:mm">
-      <label class="error" ng-if="endFilterError">Incorrect Date Format</label>
-      <label class="error" ng-if="endAfterNominalError">End date should be after nominal start date {{ start }}</label>
-      <label class="error" ng-if="endBeforeNominalError">End date should be before nominal end date {{ end }}</label>
+    <th class="align-top"><div class="filtersSearchBox" ng-class="{showMessage:!endDateValid, showValidationStyle :!endDateValid, validationMessageParent:!endDateValid}">Ended&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('endTime')"></span>
+      <input type="text" title="Date should be entered in {{dateFormat | lowercase}} format." class="form-control dateInput" ng-model="endFilter" ng-enter="filterInstances('startTime')" placeholder="{{dateFormat | lowercase}}" ng-keypress="validateDate($event,'end')">
+      <label class="custom-danger validationMessageGral" ng-if="!endDateValid">You need to provide a valid date</label>
     </div></th>
-    <th>
+    <th class="align-top">
       <div class="filtersSearchBox">Status&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('status')"></span>
         <select class="form-control padding0" ng-model="statusFilter" ng-change="filterInstances('startTime')">
           <option value="">ALL</option>
           <option value="RUNNING">RUNNING</option>
           <option value="SUCCEEDED">SUCCEEDED</option>
           <option value="SUSPENDED">SUSPENDED</option>
-          <option value="WAITING">WAITING</option>
           <option value="KILLED">KILLED</option>
         </select>
       </div>
@@ -54,18 +48,18 @@
 
   <tbody>
   <tr ng-if="input.length > 0" class="buttonsRow">
-    <td class="buttonCell" colspan="9">
+    <td class="buttonCell border0px" colspan="9">
       <div class="btn btn-gray btn-xs buttons-to-show" ng-click="download()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
         <span class="entypo down"></span> <div>Log</div>
       </div>
-      <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume">
+      <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selecteisabledButtons.resume">
         <span class="entypo play"></span> <div>Resume</div>
       </div>
       <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeRerun()" ng-disabled="selectedDisabledButtons.rerun">
         <span class="entypo play"></span> <div>Rerun</div>
       </div>
       <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend">
-        <span class="entypo paus"></span> <div>Suspend</div>
+        <span class="entypo paus"></span> <div>Pause</div>
       </div>
       <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeKill()" ng-disabled="selectedDisabledButtons.stop">
         <span class="entypo stop"></span> <div>Kill</div>
@@ -107,18 +101,18 @@
     <td>
       <!--{{ item.startTime }}<br/>-->
       <!--{{ item.startTime | date :'yyyy-MM-ddTHH:mm:ssZ' }}<br/>-->
-      {{ item.startTime | date :'MM/dd/yyyy HH:mm'}}
+      {{ item.startTime | date : dateFormat}}
     </td>
     <td>
-      {{ item.endTime | date :'MM/dd/yyyy HH:mm'}}
+      {{ item.endTime | date : dateFormat}}
     </td>
     <td class="stateCell">
       <span ng-class="{
-      'blink-success': item.status == 'RUNNING',
-      'text-success': item.status == 'SUCCEEDED',
-      'blink-warning': item.status == 'WAITING' || item.status == 'UNKNOWN',
-      'blink-danger': item.status == 'SUSPENDED',
-      'text-danger': item.status == 'FAILED' || item.status == 'KILLED',
+        'blink-success': item.status == 'RUNNING',
+        'text-success': item.status == 'SUCCEEDED',
+        'blink-warning': item.status == 'WAITING' || item.status == 'UNKNOWN',
+        'blink-danger': item.status == 'SUSPENDED',
+        'text-danger': item.status == 'FAILED' || item.status == 'KILLED',
       }">{{ item.status }}</span>
     </td>
 
@@ -131,7 +125,7 @@
     </td>
   </tr>
 
-  <tr>
+  <tr class="paginationRow">
     <td colspan="5">
       <nav class="pull-right">
         <ul class="pagination">
diff --git a/falcon-ui/app/html/directives/lineageGraphDv.html b/falcon-ui/app/html/directives/lineageGraphDv.html
index 93a2896..7e01d78 100644
--- a/falcon-ui/app/html/directives/lineageGraphDv.html
+++ b/falcon-ui/app/html/directives/lineageGraphDv.html
@@ -20,10 +20,10 @@
 <div id="lineageGraph">
   <h4><small>Legends</small></h4>
   <ul class="lineage-legend">
-    <li class="lineage-legend-feed-inst">Feed instance</li>
-    <li class="lineage-legend-feed-inst lineage-legend-terminal">Feed instance (terminal)</li>
-    <li class="lineage-legend-process-inst">Process instance</li>
-    <li class="lineage-legend-process-inst lineage-legend-terminal">Process instance (terminal)</li>
+    <li class="lineage-legend-feed-inst"><span>Feed instance</span></li>
+    <li class="lineage-legend-feed-inst lineage-legend-terminal"><span>Feed instance (terminal)</span></li>
+    <li class="lineage-legend-process-inst"><span>Process instance</span></li>
+    <li class="lineage-legend-process-inst lineage-legend-terminal"><span>Process instance (terminal)</span></li>
   </ul>
 </div>
 <div>
diff --git a/falcon-ui/app/html/directives/navDv.html b/falcon-ui/app/html/directives/navDv.html
index 63046f6..cffc170 100644
--- a/falcon-ui/app/html/directives/navDv.html
+++ b/falcon-ui/app/html/directives/navDv.html
@@ -17,84 +17,216 @@
  * limitations under the License.
  */
 -->
-<nav class="col-sm-24 navbar navbar-default" role="navigation">
-  <div class="col-sm-offset-1 col-sm-22">
-    <button class="logoTitle" ui-sref="main">
+<nav class="col-sm-24 navbar navbar-default header1" role="navigation">
+  <div class="col-sm-offset-2 col-sm-20">
+    <a class="btn-link logoTitle" ui-sref="main">
       <h1 class="navbar-header">
-        <span class="falconLogo"></span> <span>Falcon</span>
+        <span class="falconLogo"></span>
       </h1>
-    </button>
-
-      <div class="createNavWrapper" ng-show="userLogged()">
-        <h4>Create an entity</h4>
-        <button type="button"
-                id="cluster.create"
-                ng-click="resetCluster()"
-                ng-disabled="isInForm('cluster')"
-                ng-class="{disabled:isInForm('cluster')}">
-          <span class="entypo archive"></span> <span>Cluster</span>
-        </button>
-        <button type="button"
-                id="feed.create"
-                ng-click="resetFeed()"
-                ng-disabled="isInForm('feed')"
-                ng-class="{disabled:isInForm('feed')}">
-          <span class="entypo download"></span> <span>Feed</span>
-        </button>
-        <button type="button"
-                id="process.create"
-                ng-click="resetProcess()"
-                ng-disabled="isInForm('process')"
-                ng-class="{disabled:isInForm('process')}">
-          <span class="entypo cycle"></span> <span>Process</span>
-        </button>
-        <button type="button"
-                id="dataset.create"
-                ng-click="resetDataset()"
-                ng-disabled="isInForm('dataset')"
-                ng-class="{disabled:isInForm('dataset')}">
-          <span class="glyphicon glyphicon-duplicate"></span> <span>Mirror</span>
-        </button>
-      </div>
-
-    <div class="uploadNavWrapper" ng-show="userLogged()">
-      <h4>Upload an entity</h4>
-      <div class="btn-file" ng-class="{fakeFocus: fake.focus}">
-        <span class="entypo up"></span>
-        <input type="file"
-               id="files"
-               ng-focus="fake.focus = true"
-               ng-blur="fake.focus = false"
-               name="files[]"
-               multiple
-               fileinput-change="handleFile"
-               ng-model="fileJson">
-        <span>Browse for the XML file</span>
-      </div>
-    </div>
-
-    <div class="loginHeaderBox">
-      <div ng-show="userLogged()">
-        <span class="user"></span> <div><strong>{{userToken}}</strong></div>
-      </div>
-
-      <button ng-show="userLogged() && !ambariView() && !isSecureMode()" ng-click="logOut()" ng-class="responses.unreaded > 0 ? 'logoutBT' : ''">
-        <span class="glyphicon glyphicon-log-out header-icon"></span> <div><strong class="pointer">Logout</strong></div>
-      </button>
-
-      <button ng-click="notify()" ng-blur="hideNotifs()" class="no-outline">
-        <span class="badge badge-notify" ng-show="responses.unreaded > 0">{{ responses.unreaded }}</span>
-        <span class="glyphicon glyphicon-bell bell-notif header-icon"></span>
-        <strong class="pointer">Notifications</strong>
-        <div class="notifications">
+    </a>
+    <div class="loginHeaderBox" ng-show="userLogged()">
+        <!--<button type="button" class="btn btn-lg btn-link" data-ng-click="showMenu=!showMenu">
+            <span class="glyphicon glyphicon-th" aria-hidden="true"></span>
+        </button>-->
+        <!-- <div class="dropdown visible-lg-inline-block">
+            <a class="btn btn-link dropdown-toggle" data-ng-click="" id="settingMenu"
+              data-toggle="dropdown" aria-expanded="true" role="button">
+                <span class="glyphicon glyphicon-th"></span>
+            </a>
+            <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="settingMenu">
+              <li role="presentation" role="menuitem" tabindex="-1">
+                  <button type="button" class="btn btn-link" data-ng-click="displayEntities('cluster')">
+                      Clusters
+                  </button>
+              </li>
+            </ul>
+        </div> -->
+        <span class="entypo archive icon-lg entypo-align-sub" title="Clusters" data-ng-click="displayEntities('cluster')">&nbsp;</span>
+        <span class="separator"> | </span>
+        <span class="notifications">
+          <button class="btn btn-link" ng-click="notify()">
+            <span class="glyphicon glyphicon-bell" title="Notifications"></span>
+          </button>
           <server-messages></server-messages>
+        </span>
+        <span class="separator"> | </span>
+        <div class="dropdown visible-lg-inline-block">
+            <div class="dropdown-toggle pointer" id="userMenu" data-toggle="dropdown" aria-expanded="true" role="button">
+              <span class="user hide"></span>{{userToken}} <span class="caret"></span>
+            </div>
+            <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="userMenu">
+                <li role="presentation">
+                  <a class="btn btn-link" ng-show="userLogged() && !ambariView()" ng-click="logOut()">
+                      <span class="glyphicon glyphicon-log-out" title="Logout"></span>
+                      Logout
+                  </a>
+                </li>
+                <li>
+                  <a class="btn btn-link"
+                        href="https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/bk_data_governance/content/ch_hdp_data_governance_overview.html"
+                        target="_blank">
+                    <span class="glyphicon glyphicon-question-sign" title="Help"></span>
+                    Help
+                  </a>
+                </li>
+                <li><a class="btn btn-link" href="http://hortonworks.com/hadoop/falcon/" target="_blank">
+                    <span class="glyphicon glyphicon-info-sign" title="About"></span>
+                    About
+                </a></li>
+            </ul>
         </div>
-      </button>
-
-      <a href="http://hortonworks.com/hadoop/falcon/">
-        <span class="glyphicon glyphicon-question-sign header-icon"></span> <div>Help</div>
-      </a>
     </div>
+  </div>
+</nav>
+<nav class="col-sm-24 navbar navbar-default header2" role="navigation" ng-show="userLogged()">
+
+  <div class="col-sm-16" ng-show="userLogged()">
+      <div class="row searchBoxContainer">
+          <div class=" col-sm-offset-4 col-sm-16">
+              <!--<i class="glyphicon glyphicon-refresh search-loading-icon" ng-show="loading"></i>-->
+              <img src="css/img/ajax-loader.gif" class="glyphicon search-loading-icon" ng-show="loading"/>
+              <!--<tags-input ng-model="tags" min-length="1" add-on-space="true" on-tag-added="displayResults()"-->
+              <!--on-tag-removed="displayResults()"></tags-input>-->
+
+              <tags-input ng-model="tags" min-length="1" add-on-space="true" add-from-autocomplete-only="true"
+                          on-tag-added="displayResults()" on-tag-removed="displayResults(true)" placeholder="Search">
+                  <auto-complete source="loadTags($query)" min-length="0"></auto-complete>
+              </tags-input>
+              <!--ng-class="tags.length > 0 ? 'question-icon' : 'remove-icon'"-->
+              <i id="nsPopover" class="glyphicon glyphicon-question-sign question-icon"
+                 ns-popover
+                 ns-popover-template="menu"
+                 ns-popover-trigger="click"
+                 ns-popover-theme="ns-popover-tooltip-theme"
+                 ns-popover-timeout="5"
+                 ns-popover-placement="bottom|right"></i>
+              <i class="glyphicon glyphicon-search search-icon" ng-hide="loading" ng-click="displayResults()"></i>
+              <script type="text/ng-template" id="menu">
+                  <div class="triangle"></div>
+                  <div class="ns-popover-tooltip">
+                      <h5>Hey there! Want some search tips?</h5>
+                      The <strong>first word</strong> you type will be taken as the <strong>Name</strong> of the entity.
+                      <br/>
+                      You can search <strong>*</strong> for getting all the entities.
+                      <br/>
+                      The <strong>second and following</strong> words will be taken as <strong> Tags</strong>.
+                      <br/>
+                      For filtering by type, write <strong>type=feed|process|mirror</strong>
+                  </div>
+              </script>
+              <i class="glyphicon glyphicon-remove remove-icon" ng-if="tags.length > 0" ng-click="clearTags()"></i>
+          </div>
+      </div>
+  </div>
+
+  <div class="col-sm-8 uploadNavWrapper">
+    <div class="dropdown">
+          <!--<img src="css/img/32x32_create-entity.png" data-ng-click="showMenu=false" class="dropdown-toggle btn-create"
+            title="Create entity" id="entityMenu" data-toggle="dropdown" aria-expanded="true" role="button" />-->
+          <button class="dropdown-toggle btn-create" title="Create entity" id="entityMenu"
+            data-toggle="dropdown" aria-expanded="true" role="button">
+            Create <span class="caret"></span>
+          </button>
+          <ul class="dropdown-menu" role="menu" aria-labelledby="entityMenu">
+              <li role="presentation">
+                  <button class="cluster btn btn-link" role="menuitem" tabindex="-1" type="button" id="cluster.create"
+                    ng-click="resetCluster()" ng-disabled="isInForm('cluster')">
+                    <span title="Cluster">Cluster</span>
+                  </button>
+              </li>
+              <li role="presentation">
+                  <button class="feed btn btn-link" role="menuitem" tabindex="-1" type="button" id="feed.create"
+                    ng-click="resetFeed()" ng-disabled="isInForm('feed')">
+                    <span title="Feed">Feed</span>
+                  </button>
+              </li>
+              <li role="presentation">
+                  <button class="process btn btn-link" role="menuitem" tabindex="-1" type="button" id="process.create"
+                    ng-click="resetProcess()" ng-disabled="isInForm('process')">
+                    <span title="Process">Process</span>
+                  </button>
+              </li>
+              <li role="presentation">
+                <div class="dropdown open">
+                  <button class="dataset btn btn-link" role="menuitem" tabindex="-1" type="button" id="dataset.create"
+                    ng-click="resetDataset('HDFS')" ng-disabled="isInForm('dataset')  && isMirror('HDFS')">
+                    <span title="Mirror">Mirror</span>
+                  </button>
+                  <ul class="dropdown-submenu" role="menu" aria-labelledby="dataset.create">
+                    <li role="presentation">
+                      <button class="hdfsMirror btn btn-link" role="menuitem" tabindex="-2" type="button"
+                        id="hdfsMirror.create" ng-click="resetDataset('HDFS')" ng-disabled="isInForm('dataset') && isMirror('HDFS')">
+                        <span title="File System">File System</span>
+                      </button>
+                    </li>
+                    <li role="presentation">
+                      <button class="hiveMirror btn btn-link" role="menuitem" tabindex="-2" type="button"
+                        id="hiveMirror.create" ng-click="resetDataset('HIVE')" ng-disabled="isInForm('dataset') && isMirror('HIVE')">
+                        <span title="Hive">Hive</span>
+                      </button>
+                    </li>
+                    <li role="presentation">
+                      <button class="snapshot btn btn-link" role="menuitem" tabindex="-2" type="button"
+                        id="snapshot.create" ng-click="resetSnapshot()" ng-disabled="isInForm('snapshot')">
+                        <span title="Snapshot">Snapshot</span>
+                      </button>
+                    </li>
+                  </ul>
+              </li>
+              <li role="presentation">
+                  <button class="dataset btn btn-link" role="menuitem" tabindex="-1" type="button" id="datasource.create" ng-click="resetDatasource()" ng-disabled="isInForm('datasource')" ng-class="{disabled:isInForm('datasource')}">
+                    <span title="Data Source">Data Source</span>
+                  </button>
+              </li>
+          </ul>
+      </div>
+      <div class="dropdown">
+          <!--<img src="css/img/32x32_upload.png" data-ng-click="showMenu=false" class="dropdown-toggle btn-upload"
+          title="Upload an entity definition" id="uploadMenu" data-toggle="dropdown"
+          aria-expanded="true" role="button" />-->
+          <button class="dropdown-toggle btn-upload" title="Upload an entity definition" id="uploadMenu"
+            data-toggle="dropdown" aria-expanded="true" role="button">Import<span class="caret"></span></button>
+          <ul class="dropdown-menu" role="menu" aria-labelledby="uploadMenu">
+              <li role="presentation" class="btn-file">
+                  <button class="btn btn-link" role="menuitem" tabindex="-1" type="button">
+                      <span title="Xml file">Xml file</span>
+                  </button>
+                  <input type="file"
+                         id="files"
+                         ng-focus="fake.focus = true"
+                         ng-blur="fake.focus = false"
+                         name="files[]"
+                         multiple
+                         fileinput-change="handleFile"
+                         ng-model="fileJson" />
+              </li>
+          </ul>
+      </div>
 
   </div>
 </nav>
+
+<!--
+<nav class="col-sm-24 navbar navbar-default header3" role="navigation" ng-show="userLogged() && showMenu">
+    <div class="col-sm-offset-4 col-sm-18">
+        <div class="loginHeaderBox">
+            <a class="btn btn-link" ng-click="notify()">
+                <span class="glyphicon glyphicon-bell" title="Notifications"></span>
+                <div class="notifications">
+                    <server-messages></server-messages>
+                </div>
+            </a>
+            <a class="btn btn-link" ng-show="userLogged() && !ambariView()" ng-click="logOut()">
+                <span class="glyphicon glyphicon-log-out" title="Logout"></span>
+            </a>
+            <a class="btn btn-link"
+              href="http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_falcon/bk_falcon-20140422.pdf"
+              target="_blank">
+                <span class="glyphicon glyphicon-question-sign" title="Help"></span>
+            </a>
+            <a class="btn btn-link" href="http://hortonworks.com/hadoop/falcon/" target="_blank">
+                <span class="glyphicon glyphicon-info-sign" title="About"></span>
+            </a>
+        </div>
+    </div>
+</nav>-->
diff --git a/falcon-ui/app/html/directives/serverMessagesDv.html b/falcon-ui/app/html/directives/serverMessagesDv.html
index dd5a2a2..3910831 100644
--- a/falcon-ui/app/html/directives/serverMessagesDv.html
+++ b/falcon-ui/app/html/directives/serverMessagesDv.html
@@ -20,7 +20,7 @@
 
 <div class="messagesArrow notifs" ng-show="server.responses.queue.length > 0"></div>
 <div class="messages notifs">
-
+  <div ng-if="showClose" class='notif-close'><button type='button' class='close' ng-click="close()">&times;</button></div>
   <div ng-show="server.responses.showAll" ng-repeat="message in server.responses.queue | reverse" class="message"
       ng-class="{ 'color-warning' : message.type === 'warning' || message.type === 'cancel',
                     'color-success' : message.type === 'success',
diff --git a/falcon-ui/app/html/directives/timeZoneSelectDv.html b/falcon-ui/app/html/directives/timeZoneSelectDv.html
index f15bed7..f1ba102 100644
--- a/falcon-ui/app/html/directives/timeZoneSelectDv.html
+++ b/falcon-ui/app/html/directives/timeZoneSelectDv.html
@@ -17,7 +17,8 @@
  * limitations under the License.
  */
 -->
-<select class="padding0 TZSelect form-control" ng-model="ngModel">
+<select class="padding0 TZSelect form-control" ng-model="ngModel"
+  ng-required="required">
   <option value="" disabled style='display:none;'>-Select timezone-</option>
   <option value="UTC">UTC</option>
   <option value="GMT-12:00">(GMT -12:00) Eniwetok, Kwajalein</option>
@@ -29,7 +30,7 @@
   <option value="GMT-06:00">(GMT -6:00) Central Time (US &amp; Canada), Mexico City</option>
   <option value="GMT-05:00">(GMT -5:00) Eastern Time (US &amp; Canada), Bogota, Lima</option>
   <option value="GMT-04:00">(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz</option>
-  <option value="GMT-03:50">(GMT -3:30) Newfoundland</option>
+  <option value="GMT-03:30">(GMT -3:30) Newfoundland</option>
   <option value="GMT-03:00">(GMT -3:00) Brazil, Buenos Aires, Georgetown</option>
   <option value="GMT-02:00">(GMT -2:00) Mid-Atlantic</option>
   <option value="GMT-01:00">(GMT -1:00 hour) Azores, Cape Verde Islands</option>
@@ -37,17 +38,17 @@
   <option value="GMT+01:00">(GMT +1:00 hour) Brussels, Copenhagen, Madrid, Paris</option>
   <option value="GMT+02:00">(GMT +2:00) Kaliningrad, South Africa</option>
   <option value="GMT+03:00">(GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg</option>
-  <option value="GMT+03:50">(GMT +3:30) Tehran</option>
+  <option value="GMT+03:30">(GMT +3:30) Tehran</option>
   <option value="GMT+04:00">(GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi</option>
-  <option value="GMT+04:50">(GMT +4:30) Kabul</option>
+  <option value="GMT+04:30">(GMT +4:30) Kabul</option>
   <option value="GMT+05:00">(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent</option>
-  <option value="GMT+05:50">(GMT +5:30) Bombay, Calcutta, Madras, New Delhi</option>
-  <option value="GMT+05:75">(GMT +5:45) Kathmandu</option>
+  <option value="GMT+05:30">(GMT +5:30) Bombay, Calcutta, Madras, New Delhi</option>
+  <option value="GMT+05:45">(GMT +5:45) Kathmandu</option>
   <option value="GMT+06:00">(GMT +6:00) Almaty, Dhaka, Colombo</option>
   <option value="GMT+07:00">(GMT +7:00) Bangkok, Hanoi, Jakarta</option>
   <option value="GMT+08:00">(GMT +8:00) Beijing, Perth, Singapore, Hong Kong</option>
   <option value="GMT+09:00">(GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk</option>
-  <option value="GMT+09:50">(GMT +9:30) Adelaide, Darwin</option>
+  <option value="GMT+09:30">(GMT +9:30) Adelaide, Darwin</option>
   <option value="GMT+10:00">(GMT +10:00) Eastern Australia, Guam, Vladivostok</option>
   <option value="GMT+11:00">(GMT +11:00) Magadan, Solomon Islands, New Caledonia</option>
   <option value="GMT+12:00">(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka</option>
diff --git a/falcon-ui/app/html/entityDetailsTpl.html b/falcon-ui/app/html/entityDetailsTpl.html
index 6f1a4bc..2afefac 100644
--- a/falcon-ui/app/html/entityDetailsTpl.html
+++ b/falcon-ui/app/html/entityDetailsTpl.html
@@ -19,58 +19,101 @@
 -->
 <div class="container" id="entityDetails">
 
-  <div class="row">
-    <div class="col-sm-24">
-      <button class="btn " ui-sref="main">< Back to Search</button>
+  <div class="row pt15px">
+    <div class="col-sm-24 detailsHeaders pl0px">
+	<button class="btn" title="Back to search" ui-sref="main">< </button>
+		<span class="entityName">{{entity.name}}</span>
+        <span ng-class="{'blink-success': entity.status == 'RUNNING',
+                     'text-success': entity.status == 'SUCCEEDED',
+                     'blink-warning': entity.status == 'SUSPENDED',
+                     'blink-danger': entity.status == 'UNKNOWN'}"  ng-if="entity.type != 'cluster'">
+                     {{entity.status}}</span>
+    <br><br>
+    <div class="pull-left">
+      <table>
+        <tbody>
+          <tr>
+            <td class="buttonCell" colspan="9">
+          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scheduleEntity()" ng-if="entity.type != 'cluster' && entity.status == 'SUBMITTED'">
+            <span class="entypo play"></span> <div>Schedule</div>
+          </div>
+          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="resumeEntity()" ng-if="entity.type != 'cluster' && entity.status == 'SUSPENDED'">
+            <span class="entypo play"></span> <div>Resume</div>
+          </div>
+          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="suspendEntity()" ng-if="entity.type != 'cluster' && entity.status == 'RUNNING'">
+            <span class="entypo paus"></span> <div>Pause</div>
+          </div>
+          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="editEntity()"
+            ng-disabled="entity.type === 'cluster' && (!isSafeMode() || !isSuperUser())"
+            ng-class="{disabledEditBtn: entity.type === 'cluster' && (!isSafeMode() || !isSuperUser())}"
+            title="{{(entity.type === 'cluster' && !isSafeMode() || (!isSuperUser())) ? 'Cluster entity update can only be performed by superuser during safemode' : ''}}">
+            <span class="entypo cog"></span> <div>Edit</div>
+          </div>
+          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="cloneEntity()"  ng-if="entity.type != 'cluster'">
+            <span class="entypo docs"></span> <div>Copy</div>
+          </div>
+          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="deleteEntity()">
+            <span class="entypo trash"></span> <div>Delete</div>
+          </div>
+          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="downloadEntity()">
+            <span class="entypo down"></span> <div>XML</div>
+          </div>
+        </td>
+      </tr>
+      </tbody>
+      </table>
+
+    </div>
     </div>
   </div>
-
+<!--*
 	<h3 class="link-icons entity-title entity-link-null" id="entity-title">
 		{{entity.name}} <button type="button" class="detailsBT">
 		<span ng-class="displayIcon((entity.type | uppercase), entity.model)"></span> {{entityTypeLabel}}
 	</button>
-	</h3>
+	</h3>-->
 
-	<div class="row">
-		<div class="col-sm-24">
-			<div class="detailsBox">
-				<h4>
-					Dependencies
-				</h4>
-        <div class="dependencies-graph"><dependencies-graph name="entity.name" type="entity.type"/></div>
+	<div class="row pt15px" ng-if="entity.type != 'cluster'">
+		<div class="col-sm-24 pl0px">
+			<div class="entityDetailsBox">
+			<div class="dependencies-graph"><dependencies-graph name="entity.name" type="entity.type"/></div>
 			</div>
 		</div>
 	</div>
 
-	<div class="row">
-		<div class="col-sm-16">
-			<div class="detailsBox">
+	<div class="row pt15px">
+		<div class="col-sm-16 entityDetailsBox p10px" ng-if="entity.type != 'cluster'">
+			<div>
 				<h4>
-					Instances
+					INSTANCES
 				</h4>
 				<instances-list input="instancesList" type="entity.type" name="entity.name" instance-details="instanceDetails"
 												pages="pages" go-page="goPage" next-pages="nextPages" prev-pages="prevPages" change-pages-set="changePagesSet"
 												start="entity.start" end="entity.end"/>
 			</div>
 		</div>
-		<div class="col-sm-8">
-			<div class="summaryBox" ng-init="propsOpen = false">
+		<div ng-class="{'col-sm-8': entity.type !== 'cluster', 'col-sm-24': entity.type === 'cluster'}">
+			<div class="summaryBox" ng-init="propsOpen = entity.type === 'cluster'">
 				<div class="row">
 					<div class="col-sm-21">
 						<h4>
-							Properties
+							PROPERTIES
 						</h4>
 					</div>
 					<div class="col-sm-3">
-						<h4 class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-chevron-up':'glyphicon-chevron-down'"></h4>
+						<h4 ng-hide="entity.type === 'cluster'" class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-chevron-up':'glyphicon-chevron-down'"></h4>
 					</div>
 				</div>
         <div ng-show="propsOpen" class="animate-show">
 					<div ng-if="entity.type == 'feed'" ui-view="feedSummary"></div>
-					<div ng-if="entity.type == 'process'" ui-view="processSummary"></div>
+          <div ng-if="entity.type == 'cluster'" ui-view="clusterSummary"></div>
+          <div ng-if="entity.type == 'process' && entityTypeLabel == 'Process'" ui-view="processSummary"></div>
+          <div ng-if="entity.type == 'process' && entityTypeLabel == 'Snapshot'" ui-view="snapshotSummary"></div>
+          <div ng-if="entity.type == 'process' && (entityTypeLabel == 'HDFS Mirror' || entityTypeLabel == 'Hive Mirror')"
+            ui-view="datasetSummary"></div>
 				</div>
 			</div>
 		</div>
 	</div>
 
-</div>
\ No newline at end of file
+</div>
diff --git a/falcon-ui/app/html/entitySummary.html b/falcon-ui/app/html/entitySummary.html
index 83e8a85..f3d7c2a 100644
--- a/falcon-ui/app/html/entitySummary.html
+++ b/falcon-ui/app/html/entitySummary.html
@@ -85,13 +85,13 @@
   </div>
 
   <div class="col-sm-8" ng-repeat="property in feed.properties">
-    <label>{{property.key}}</label>:
+    <label>{{feedPropertiesLabels[property.key]}}</label>:
     <span ng-if="property.key !== 'timeout'">{{optional(property.value)}}</span>
     <frequency ng-if="property.key === 'timeout'" value="property.value" prefix="at"/>
   </div>
 
   <div class="col-sm-8" ng-repeat="property in feed.customProperties | filter: {key: '!!'}">
-    <label>{{property.key}}</label>: {{property.value}}
+    <label>{{feedPropertiesLabels[property.key]}}</label>: {{property.value}}
   </div>
 
   <h4 class="col-sm-8" >
@@ -131,7 +131,7 @@
       <label>Timezone</label>: {{feed.timezone}}
     </div>
     <div class="col-sm-24">
-      <label>Retention</label>: <frequency value="cluster.retention" prefix="Archive in"/>
+      <label>Retention</label>: <frequency value="cluster.retention" prefix=""/>
     </div>
   </div>
   <div class="clearfix hidden-md"></div>
@@ -144,4 +144,4 @@
     <label class="col-sm-24" >Table uri</label>
     <div class="col-sm-24">{{optional(cluster.storage.catalog.catalogTable.uri)}}</div>
   </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/falcon-ui/app/html/error.html b/falcon-ui/app/html/error.html
new file mode 100644
index 0000000..683510e
--- /dev/null
+++ b/falcon-ui/app/html/error.html
@@ -0,0 +1,37 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<div class="col-sm-24 dashboardBox login" ng-class="{showValidationStyle:showLoginVal.show}">
+  <div class="row">
+    <div class="col-sm-6"></div>
+    <div class="col-sm-12">
+
+      <div class="detailsBox centered">
+        <h3 class="auth" ng-if="httpError.code === 401 || httpError.code === 403">
+          Verify user name and password. If problem continues, contact your administrator.
+        </h3>
+        <h3 class="auth" ng-if="httpError.code !== 401 && httpError.code !== 403">
+          ERROR {{ httpError.code }} {{ httpError.error }}, try later.
+        </h3>
+      </div>
+
+    </div>
+    <div class="col-sm-6"></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/falcon-ui/app/html/feed/feedFormAdvancedStepTpl.html b/falcon-ui/app/html/feed/feedFormAdvancedStepTpl.html
new file mode 100644
index 0000000..e50fc29
--- /dev/null
+++ b/falcon-ui/app/html/feed/feedFormAdvancedStepTpl.html
@@ -0,0 +1,166 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<form name="feedForm" novalidate id="feedFormAdvancedStep">
+		<div class="col-xs-24"><label>Job Details</label></div>
+		<div class="col-xs-24 plr0px">
+			<div ng-repeat="property in feed.properties track by $index">
+				<div ng-if="property.key === 'queueName'">
+					<div class="col-xs-4">
+						<label class="light">Queue Name</label>
+						<input type="text" class="form-control"
+							ng-model="property.value" />
+					</div>
+				</div>
+				<div ng-if="property.key === 'jobPriority'">
+					<div class="col-xs-4">
+						<label class="light">Job Priority</label>
+						<select ng-model="property.value" class="form-control padding0">
+              <option value="" disabled selected style='display:none;'>-Select job-</option>
+              <option value="VERY_HIGH">Very high</option>
+              <option value="HIGH">High</option>
+              <option value="NORMAL">Normal</option>
+              <option value="LOW">Low</option>
+              <option value="VERY_LOW">Very Low</option>
+            </select>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div class="col-xs-24 plr0px">
+			<div class="col-xs-4">
+				<label class="col-xs-24 light plr0px">Late Arrival Cutoff</label>
+				<input type="text" class="col-xs-4" ng-keydown="validations.acceptOnlyNumber($event)"
+                 ng-model="feed.lateArrival.cutOff.quantity"
+                 ng-pattern="validations.patterns.twoDigits"/>
+        <select
+          ng-model="feed.lateArrival.cutOff.unit" class="col-xs-offset-1 col-xs-19">
+          <option value="" disabled selected style='display:none;'>-Select unit-</option>
+          <option value="minutes">minutes</option>
+          <option value="hours">hours</option>
+          <option value="days">days</option>
+          <option value="months">months</option>
+        </select>
+			</div>
+			<div class="col-xs-4">
+				<label class="light">Availability Flag</label>
+				<input type="text" class="form-control"
+					ng-model="feed.availabilityFlag"
+					validation-optional-message="{{validations.messages.value}}"
+					ng-pattern="validations.patterns.alpha">
+			</div>
+		</div>
+
+		<label class="col-xs-24">Performance & Throttling - Distributed Copy</label>
+
+		<div class="col-xs-24 plr0px">
+			<div ng-repeat="property in feed.properties track by $index">
+				<div ng-if="property.key === 'mapBandwidthKB'">
+					<div class="col-xs-4">
+						<label class="light">Max Bandwidth</label>
+						<input type="text" class="form-control"
+							ng-model="property.value">
+					</div>
+				</div>
+				<div ng-if="property.key === 'maxMaps'">
+					<div class="col-xs-4">
+						<label class="light">Max map jobs</label>
+						<input type="text" class="form-control"
+							ng-model="property.value">
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div class="col-xs-24 plr0px">
+			<div ng-repeat="property in feed.properties track by $index">
+				<div ng-if="property.key === 'parallel'">
+					<div class="col-xs-4">
+						<label class="col-xs-24 light plr0px">Parallel</label>
+						<input type="text" class="form-control"
+							ng-model="property.value">
+					</div>
+				</div>
+			</div>
+		</div>
+
+    <div class="col-xs-24"><label>Access Control List</label></div>
+    <div class="col-xs-24 plr0px">
+        <div class="col-xs-8">
+          <label class="light">Owner<mandatory-field></mandatory-field></label>
+          <input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
+                 ng-required="true"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-model="feed.ACL.owner"/>
+        </div>
+        <div class="col-xs-8">
+          <label class="light">Group<mandatory-field></mandatory-field></label>
+          <input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
+                 ng-required="true"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-model="feed.ACL.group"/>
+        </div>
+				<div class="col-xs-24">
+		<div class="col-xs-8 plr0px">
+		<label class="light">Permissions<mandatory-field></mandatory-field></label>
+					  <acl-permissions acl-model="feed.ACL.permission"></acl-permissions>
+		</div>
+				</div>
+	</div>
+    <div class="col-xs-24"><label>Feed Schema</label></div>
+    <div class="col-xs-8">
+      <label class="light" tooltip="feed.schema.location">Location<mandatory-field></mandatory-field></label>
+      <input type="text" class="form-control" validation-message="{{validations.messages.location}}"
+        ng-maxlength="200"
+        ng-pattern="validations.patterns.osPath"
+        ng-model="feed.schema.location"/>
+    </div>
+    <div class="col-xs-8">
+      <label class="light" tooltip="feed.schema.provider">Provider<mandatory-field></mandatory-field></label>
+      <input type="text" class="form-control" validation-message="{{validations.messages.provider}}"
+        ng-pattern="validations.patterns.osPath"
+        ng-model="feed.schema.provider"/>
+    </div>
+	<div class="col-xs-8"></div>
+
+
+  <div class="col-xs-24 pb15px mt35">
+		<button id="feed.backToStep1" class="btn prevBtn" type="button" ng-click="goBack()" ng-disabled="buttonSpinners.backShow">
+		  PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow">
+		</button>
+		<div class="pull-right">
+	    <a class="btn cnclBtn" ui-sref="main">
+	      CANCEL
+	    </a>
+	    <button id="feed.step1" class="btn nextBtn"
+	         ng-disabled="buttonSpinners.show"
+	         ng-click="goNext(feedForm.$invalid)"
+					 scroll-to-error>
+	      NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+	    </button>
+			<button class="btn advancedSaveBtn"
+           ng-disabled="feedForm.$invalid || buttonSpinners.saveShow"
+           ng-click="saveEntity(feedForm.$invalid)" scroll-to-error>
+        SAVE ADVANCED OPTIONS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
+      </button>
+		</div>
+  </div>
+
+</form>
diff --git a/falcon-ui/app/html/feed/feedFormClusterDetailsTpl.html b/falcon-ui/app/html/feed/feedFormClusterDetailsTpl.html
new file mode 100644
index 0000000..7192fd7
--- /dev/null
+++ b/falcon-ui/app/html/feed/feedFormClusterDetailsTpl.html
@@ -0,0 +1,151 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<feed-form-cluster-partitions></feed-form-cluster-partitions>
+
+<div class="row detailsBox">
+  <div class="col-xs-24 feedLocationNavBox nopointer plr0px">
+    <span class="col-xs-7" ng-show="!feed.storage.fileSystem.active">Default Storage Type</span>
+    <span class="col-xs-7" ng-show="feed.storage.fileSystem.active">Storage Type</span>
+
+    <div class="col-xs-17 feedLocationNav disabled">
+      <button class="btn btn-default pull-right"
+              ng-class="{active: feed.storage.catalog.active}"
+              ng-disabled="true">
+        Catalog Storage
+      </button>
+      <button class="btn btn-default pull-right"
+              ng-class="{active: feed.storage.fileSystem.active}"
+              ng-disabled="true">
+        File System
+      </button>
+    </div>
+  </div>
+
+  <div class="col-xs-24">
+    <label pl0px>LOCATION</label>
+    <label class="light">(if not defined, will use default location)</label>
+  </div>
+
+  <div class="col-xs-24"
+     ng-show="feed.storage.fileSystem.active"
+     ng-repeat="location in cluster.storage.fileSystem.locations">
+  <label class="light">{{capitalize(location.type)}} Path<mandatory-field></mandatory-field></label>
+  <input type="text"
+         placeholder="{{clusterLocationsPlaceHolders[location.type]}}"
+         class="form-control"
+         ng-model="location.path"
+         validation-optional-message="{{validations.messages.path}}"
+         ng-pattern="validations.patterns.osPath" />
+  </div>
+
+  <div class="col-xs-24" ng-show="feed.storage.catalog.active">
+    <label class="light">Table uri<mandatory-field></mandatory-field></label>
+    <input type="text" class="form-control"
+           ng-model="cluster.storage.catalog.catalogTable.uri"
+           validation-optional-message="{{validations.messages.path}}"
+           ng-pattern="validations.patterns.osPath"/>
+  </div>
+
+  <div class="col-xs-24">
+    <label class="mt15">VALIDITY</label>
+  </label></div>
+  <div class="col-xs-24">
+    <label class="mt15 light">Time Zone : <span>{{feed.timezone}}</span>
+  </label></div>
+  <div class="col-xs-24 validityBox plr0px">
+    <div class="col-xs-24 plr0px">
+      <div class="col-xs-6 startDateBox">
+        <label class="light">Start<mandatory-field></mandatory-field>
+        <input type="text"
+          name="startDateInput"
+          class="form-control dateInput"
+          placeholder="{{dateFormat | lowercase}}"
+          ng-model="cluster.validity.start.date"
+          simple-date-picker />
+        </label>
+      </div>
+      <div class="col-xs-6 startTimeBox">
+        <label class="light">Time<mandatory-field></mandatory-field>
+          <timepicker ng-change="constructDate()"
+                      ng-model="cluster.validity.start.time"
+                      hour-step="1"
+                      minute-step="1"
+                      show-meridian="true">
+          </timepicker>
+        </label>
+      </div>
+    </div>
+
+    <label class="col-xs-24 custom-danger validationMessageGral"
+           ng-if="!cluster.validity.start.date">
+      {{validations.messages.date.empty}}
+    </label>
+
+    <div class="col-xs-24 plr0px">
+      <div class="col-xs-6 endDateBox">
+        <label class="light">End<mandatory-field></mandatory-field>
+          <input type="text"
+            name="startDateInput"
+            class="form-control dateInput"
+            placeholder="{{dateFormat | lowercase}}"
+            ng-model="cluster.validity.end.date"
+            simple-date-picker />
+        </label>
+      </div>
+      <div class="col-xs-6 endTimeBox">
+        <label class="light">Time<mandatory-field></mandatory-field>
+          <timepicker ng-change="constructDate()"
+                      ng-model="cluster.validity.end.time"
+                      hour-step="1"
+                      minute-step="1"
+                      show-meridian="true">
+          </timepicker>
+        </label>
+      </div>
+    </div>
+
+    <label class="col-xs-24 custom-danger validationMessageGral"
+           ng-if="!cluster.validity.end.date">
+      {{validations.messages.date.empty}}
+    </label>
+  </div>
+
+  <label class="light col-xs-24">Retention<mandatory-field></mandatory-field></label>
+
+  <div class="col-xs-24 inlineInputsGroup">
+    <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
+           ng-required="true" ng-model="cluster.retention.quantity" ng-keydown="validations.acceptOnlyNumber($event)"
+           ng-pattern="validations.patterns.twoDigits">
+
+    <select ng-model="cluster.retention.unit"
+            ng-required="true">
+      <option selected value="minutes">minutes</option>
+      <option value="hours">hours</option>
+      <option value="days">days</option>
+      <option value="months">months</option>
+    </select>
+  </div>
+
+  <div class="row">
+    <button type="button" class="btn btn-default pull-right btn-xs mt5" ng-click="removeCluster($index, cluster.type)">
+      <span class="entypo minus"></span> delete
+    </button>
+  </div>
+</div>
diff --git a/falcon-ui/app/html/feed/feedFormClusterPartitionsTpl.html b/falcon-ui/app/html/feed/feedFormClusterPartitionsTpl.html
new file mode 100644
index 0000000..a09c74e
--- /dev/null
+++ b/falcon-ui/app/html/feed/feedFormClusterPartitionsTpl.html
@@ -0,0 +1,44 @@
+<!--
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<div class="col-xs-24" ng-show="partitionList.length > 0">
+  <input type="checkbox" ng-model="selectPartition" />
+  <label class="light">Partition</label>
+  <div class="typeButtonsBox mt5" ng-show="selectPartition">
+    <div ng-repeat="partition in partitionList">
+      <div class="col-xs-16 panel panel-default mb5">
+        <div class="partition-panel-body">
+          <div class="col-xs-4 mt5">
+            {{partition.partitionName}}
+          </div>
+          <div class="col-xs-12 form-inline">
+            <input type="radio" ng-model="partition.mapping" value="mappedPartition"
+              ng-change="preparePartitionExpression(partitionList)" />
+            <input type="text" class="form-control" ng-model="partition.partitionText"
+              ng-change="preparePartitionExpression(partitionList)"
+              ng-disabled="partition.mapping!='mappedPartition'" />
+            <input type="radio" ng-model="partition.mapping" value="any"
+              ng-change="preparePartitionExpression(partitionList)" />
+            Any
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/falcon-ui/app/html/feed/feedFormClustersStepTpl.html b/falcon-ui/app/html/feed/feedFormClustersStepTpl.html
index b33b7f3..91f7d31 100644
--- a/falcon-ui/app/html/feed/feedFormClustersStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormClustersStepTpl.html
@@ -18,179 +18,107 @@
  */
 -->
 <form name="feedForm" novalidate id="feedFormClusterStep">
-  <button class="hidden" ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" ></button>
-  <div ng-repeat="cluster in feed.clusters">
-    <div class="row">
-      <h4 class="col-xs-24">{{capitalize(cluster.type)}} Cluster </h4>
+  <div class="feedFormClusters">
+    <div class="col-xs-24 pt5px">
+      <label class="light">Partitions (comma separated)</label>
+      <input type="text" class="form-control" validation-optional-message="{{validations.messages.partitions}}"
+        ng-pattern="validations.patterns.commaSeparated"
+        ng-blur="createFeedClusterPartitions()"
+        ng-model="feedPartitions" />
     </div>
 
-    <div class="row detailsBox">
-      <div class="col-xs-offset-1 col-xs-22">
+    <div class="col-xs-24">
+      <label>Source Cluster<mandatory-field></mandatory-field></label>
+    </div>
 
-        <div class="row">
-          <div class="col-xs-24">
-            <select ng-model="cluster.name" validation-message="{{validations.messages.cluster}}"
-                    ng-required="true" class="col-xs-24 form-control padding0" id="clusterNameSelect">
-              <option value="" disabled selected style='display:none;'>-Select cluster-</option>
-              <option id="cluster_" ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
-            </select>
-          </div>
+    <div class="col-xs-24">
+      <select ng-model="sourceClusterName"
+            ng-change="clearSourceClusterFlags()"
+            class="form-control padding0 clusterSelect">
+          <option value="" disabled selected style='display:none;'>-Select source cluster-</option>
+          <option id="cluster_" ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
+      </select>
 
+      <button type="button" class="btn btn-default btn-xs clusterAddBtn" ng-click="addSourceCluster()">
+        Add
+      </button>
+    </div>
+    <div class="col-xs-24">
+      <label class="custom-danger" ng-show="sourceClusterNotSelected">
+        You need to select the source cluster
+      </label>
+      <label class="custom-danger" ng-show="sourceClusterExists">
+        Source cluster is already added
+      </label>
+    </div>
 
-          <div class="col-xs-24 feedLocationNavBox nopointer">
-            <h4 class="col-xs-7" ng-show="!feed.storage.fileSystem.active">Default Storage type</h4>
-            <h4 class="col-xs-7" ng-show="feed.storage.fileSystem.active">Storage type</h4>
-
-            <div class="col-xs-17 feedLocationNav disabled">
-              <button class="btn btn-default pull-right"
-                      ng-class="{active: feed.storage.catalog.active}"
-                      ng-disabled="true">
-                Catalog Storage
-              </button>
-              <button class="btn btn-default pull-right"
-                      ng-class="{active: feed.storage.fileSystem.active}"
-                      ng-disabled="true">
-                File System
-              </button>
-            </div>
-          </div>
-
-          <div class="col-xs-19">
-            <label>Location</label>
-            <label class="light">(if not defined, will use default location)</label>
-          </div>
-
-          <div class="col-xs-24"
-               ng-show="feed.storage.fileSystem.active"
-               ng-repeat="location in cluster.storage.fileSystem.locations">
-            <label class="light">{{location.type}} path</label>
-            <input type="text"
-                   placeholder="{{clusterLocationsPlaceHolders[location.type]}}"
-                   class="form-control"
-                   ng-model="location.path"
-                   validation-optional-message="{{validations.messages.path}}"
-                   ng-pattern="validations.patterns.osPath" />
-          </div>
-
-          <div class="col-xs-24 mb10" ng-show="feed.storage.catalog.active">
-            <label class="light">Table uri</label>
-            <input type="text" class="form-control"
-                   ng-model="cluster.storage.catalog.catalogTable.uri"
-                   validation-optional-message="{{validations.messages.path}}"
-                   ng-pattern="validations.patterns.osPath"/>
-          </div>
-          <div class="clearfix mb20"></div>
-          <label class="col-xs-24"> Validity </label>
-          <div class="col-xs-24 validityBox">
-            <div class="startDateBox">
-              <label>Start
-                <input type="text"
-                       name="startDateInput"
-                       class="form-control dateInput"
-                       placeholder="mm/dd/yyyy"
-                       datepicker-popup="{{dateFormat}}"
-                       ng-model="cluster.validity.start.date"
-                       is-open="cluster.validity.start.opened"
-                       ng-click="openDatePicker($event, cluster.validity.start)"
-                       ng-change="constructDate()"
-                       ng-required="true"
-                       simple-date>
-              </label>
-              <label class="col-xs-24 custom-danger validationMessageGral"
-                     ng-if="!cluster.validity.start.date">
-                {{validations.messages.date.empty}}
-              </label>
-            </div>
-            <div class="startTimeBox">
-              <label>Time
-                <timepicker ng-change="constructDate()"
-                            ng-model="cluster.validity.start.time"
-                            hour-step="1"
-                            minute-step="1"
-                            show-meridian="true">
-                </timepicker>
-              </label>
-            </div>
-            <div class="endDateBox">
-              <label>End
-                <input type="text"
-                       name="startDateInput"
-                       class="form-control dateInput"
-                       placeholder="mm/dd/yyyy"
-                       datepicker-popup="{{dateFormat}}"
-                       ng-model="cluster.validity.end.date"
-                       is-open="cluster.validity.end.opened"
-                       ng-click="openDatePicker($event, cluster.validity.end)"
-                       ng-change="constructDate()"
-                       ng-required="true"
-                       min-date="cluster.validity.start.date"
-                       simple-date>
-              </label>
-              <label class="col-xs-24 custom-danger validationMessageGral"
-                     ng-if="!cluster.validity.end.date">
-                {{validations.messages.date.empty}}
-              </label>
-            </div>
-            <div class="endTimeBox">
-              <label>Time
-                <timepicker ng-change="constructDate()"
-                            ng-model="cluster.validity.end.time"
-                            hour-step="1"
-                            minute-step="1"
-                            show-meridian="true">
-                </timepicker>
-              </label>
-            </div>
-          </div>
-
-          <label class="light col-xs-24"> Retention </label>
-
-          <div class="col-xs-24 inlineInputsGroup">
-            <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
-                   ng-required="true" ng-model="cluster.retention.quantity" ng-keydown="validations.acceptOnlyNumber($event)"
-                   ng-pattern="validations.patterns.twoDigits">
-
-            <select ng-model="cluster.retention.unit"
-                    ng-required="true">
-              <option selected value="minutes">minutes</option>
-              <option value="hours">hours</option>
-              <option value="days">days</option>
-              <option value="months">months</option>
-            </select>
-          </div>
-
-          <div class="row"  ng-if="cluster.type !== 'source'">
-            <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)">
-              <span class="entypo minus"></span> delete
-            </button>
-          </div>
-
-
-        </div>
-
-      </div>
+    <div class="col-xs-24 sourceClusterList" ng-show="(feed.clusters | filter:{type:'source'}).length > 0">
+      <label class="clusterListLabel mb7">Source Clusters</label>
+      <accordion close-others="false">
+        <accordion-group ng-repeat="cluster in feed.clusters | filter:{type:'source'}" is-open="cluster.isAccordionOpened">
+          <accordion-heading>{{ cluster.name }}</accordion-heading>
+          <feed-form-cluster-details></feed-form-cluster-details>
+        </accordion-group>
+      </accordion>
     </div>
   </div>
-  <div class="col-xs-24 mt10">
-    <button type="button" class="btn btn-default btn-xs" ng-click="addCluster()">
-      <span class="entypo plus"></span> add cluster
+  <div class="col-xs-24" ng-show="(feed.clusters | filter:{type:'source'}).length < 1">
+    <label class="custom-danger">
+      You need to provide at least one source cluster
+    </label>
+  </div>
+
+  <div class="col-xs-24">
+    <label>Target Cluster</label>
+  </div>
+  <div class="col-xs-24">
+    <select ng-model="targetClusterName"
+          ng-change="clearTargetClusterFlags()"
+          class="form-control padding0 clusterSelect">
+        <option value="" disabled selected style='display:none;'>-Select target cluster-</option>
+        <option id="cluster_" ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
+    </select>
+
+    <button type="button" class="btn btn-default btn-xs clusterAddBtn" ng-click="addTargetCluster()">
+      Add
     </button>
   </div>
 
-  <div class="col-xs-24 mt20">
+  <div class="col-xs-24">
+    <label class="custom-danger" ng-show="targetClusterNotSelected">
+      You need to select the target cluster
+    </label>
+    <label class="custom-danger" ng-show="targetClusterExists">
+      Target cluster is already added
+    </label>
+  </div>
+
+  <div class="col-xs-24 targetClusterList" ng-show="(feed.clusters | filter:{type:'target'}).length > 0">
+    <label class="clusterListLabel mb7">Target Clusters</label>
+    <accordion close-others="false">
+      <accordion-group ng-repeat="cluster in feed.clusters | filter:{type:'target'}" is-open="cluster.isAccordionOpened">
+        <accordion-heading>{{ cluster.name }}</accordion-heading>
+        <feed-form-cluster-details></feed-form-cluster-details>
+      </accordion-group>
+    </accordion>
+  </div>
+
+  <div class="col-xs-24 mt35 pb15px">
     <button id="feed.backToStep3"
-            class="btn prevBtn"
-            type="button"
-            ng-click="goBack('forms.feed.location')"
-            ng-disabled="buttonSpinners.backShow" >
-      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+        class="btn prevBtn"
+        type="button"
+        ng-click="goBack()"
+        ng-disabled="buttonSpinners.backShow" >
+      PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
     </button>
-    <button id="feed.step4" class="btn nextBtn pull-right"
-            ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" >
-      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
-    </a>
+    <div class="pull-right">
+        <a class="btn cnclBtn" ui-sref="main">
+          CANCEL
+        </a>
+         <button id="feed.step4" class="btn nextBtn"
+            ng-click="goNext(feedForm.$invalid)" scroll-to-error>
+            NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+        </button>
+     </div>
   </div>
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/feed/feedFormDataSourceTpl.html b/falcon-ui/app/html/feed/feedFormDataSourceTpl.html
new file mode 100644
index 0000000..04ea3a2
--- /dev/null
+++ b/falcon-ui/app/html/feed/feedFormDataSourceTpl.html
@@ -0,0 +1,148 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<div class="datasourceBox">
+  <div class="col-xs-24">
+    <label class="light">Datasource<mandatory-field></mandatory-field></label>
+  </div>
+  <div class="col-xs-10">
+    <select ng-model="feed[feed.dataTransferType][dataSourceType].name"
+        ng-required="true"
+        class="form-control padding0"
+        validation-message="{{validations.messages.datasource}}">
+      <option value="" disabled style='display:none;'>Select transfer datasource</option>
+      <option ng-repeat="datasourceItem in datasourceList"
+              value="{{datasourceItem.name}}">
+        {{datasourceItem.name}}
+      </option>
+    </select>
+  </div>
+
+  <div class="col-xs-24">
+    <label class="light">Table<mandatory-field></mandatory-field></label>
+  </div>
+  <div class="col-xs-10">
+    <input type="text"
+        ng-required="true"
+        placeholder="Enter table name"
+        class="form-control"
+        ng-model="feed[feed.dataTransferType][dataSourceType].tableName"
+        validation-optional-message="{{validations.messages.table}}" />
+  </div>
+  <div class="col-xs-24 plr0px" ng-if="feed.dataTransferType === 'export'">
+    <div class="col-xs-24">
+      <label class="light">Load Method<mandatory-field></mandatory-field></label>
+    </div>
+
+    <div class="col-xs-12 plr0px mt5">
+      <div class="typeButtonsBox">
+        <div class="col-xs-12">
+          <span class="radio-inline">
+            <input type="radio" name="type" value="updateonly" ng-model="feed[feed.dataTransferType][dataSourceType][dataTransferAction].type"/>
+            Update Only
+        </div>
+        <div class="col-xs-12">
+          <span class="radio-inline">
+            <input type="radio" name="type" value="allowinsert" ng-model="feed[feed.dataTransferType][dataSourceType][dataTransferAction].type"/>
+            Allow Insert
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="col-xs-24 plr0px" ng-if="feed.dataTransferType === 'import'">
+    <div class="col-xs-24">
+      <label class="light">Extract Type<mandatory-field></mandatory-field></label>
+    </div>
+
+    <div class="col-xs-12 plr0px mt5">
+      <div class="typeButtonsBox">
+        <div class="col-xs-8">
+          <span class="radio-inline">
+            <input type="radio" name="type" value="full"
+              ng-model="feed[feed.dataTransferType][dataSourceType][dataTransferAction].type"/>
+            Full
+        </div>
+        <div class="col-xs-8">
+          <span class="radio-inline">
+            <input type="radio" name="type" value="incremental" disabled="disabled"
+              ng-model="feed[feed.dataTransferType][dataSourceType][dataTransferAction].type"/>
+            Incremental
+        </div>
+      </div>
+    </div>
+    <div class="col-xs-24">
+      <label class="light">Merge Type<mandatory-field></mandatory-field></label>
+    </div>
+
+    <div class="col-xs-12 plr0px mt5">
+      <div class="typeButtonsBox">
+        <div class="col-xs-8">
+          <span class="radio-inline">
+            <input type="radio" name="mergepolicy" value="snapshot"
+              ng-model="feed[feed.dataTransferType][dataSourceType][dataTransferAction].mergepolicy"/>
+            Snapshot
+        </div>
+        <div class="col-xs-8">
+          <span class="radio-inline">
+            <input type="radio" name="mergepolicy" value="append"
+              ng-model="feed[feed.dataTransferType][dataSourceType][dataTransferAction].mergepolicy"/>
+            Append
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="col-xs-24">
+    <label class="light">Columns<mandatory-field></mandatory-field></label>
+  </div>
+
+  <div class="col-xs-12 mt5 plr0px">
+    <div class="typeButtonsBox">
+      <div class="col-xs-8">
+        <span class="radio-inline">
+          <input type="radio" name="fieldsType" value="all"
+            ng-model="feed[feed.dataTransferType][dataSourceType].columnsType"/>
+          All
+      </div>
+      <div class="col-xs-8">
+        <span class="radio-inline">
+          <input type="radio" name="fieldsType" value="include"
+            ng-model="feed[feed.dataTransferType][dataSourceType].columnsType"/>
+          Include
+      </div>
+      <div class="col-xs-8">
+        <span class="radio-inline">
+          <input type="radio" name="fieldsType" value="exclude"
+            ng-model="feed[feed.dataTransferType][dataSourceType].columnsType"/>
+          Exclude
+      </div>
+    </div>
+  </div>
+  <div class="col-xs-16 mt5" ng-if="feed[feed.dataTransferType][dataSourceType].columnsType === 'include'">
+    <input type="text"
+        ng-required="true"
+        class="form-control"
+        ng-model="feed[feed.dataTransferType][dataSourceType].includesCSV" />
+  </div>
+  <div class="col-xs-16 mt5" ng-if="feed[feed.dataTransferType][dataSourceType].columnsType === 'exclude'">
+    <input type="text"
+        ng-required="true"
+        class="form-control"
+        ng-model="feed[feed.dataTransferType][dataSourceType].excludesCSV" />
+  </div>
+</div>
diff --git a/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html b/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html
index 2a4f5c4..6af357c 100644
--- a/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html
@@ -19,106 +19,463 @@
 -->
 <form name="feedForm" novalidate id="feedFormGeneralStep">
 
-    <div class="col-xs-24">
-      <label class="light">Name</label>
-      <input type="text" class="form-control" ng-disabled="!cloningMode" ng-keydown="validations.acceptNoSpaces($event)"
-             check-name="{type:'feed', check:cloningMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
-             ng-model="feed.name" ng-required="true" ng-pattern="validations.patterns.name"/>
-    </div>
-    <div class="col-xs-24">
-      <label class="light">Description</label>
-      <input type="text" class="form-control" validation-optional-message="{{validations.messages.description}}"
-        ng-model="feed.description"
-        ng-pattern="validations.patterns.freeText"/>
-    </div>
+	<div class="col-xs-4">
+    <label class="light" tooltip="feed.name">Feed Name<mandatory-field></mandatory-field></label>
+    <input type="text" class="form-control" ng-disabled="editingMode" ng-keydown="validations.acceptNoSpaces($event)"
+           check-name="{type:'feed', check:!editingMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
+           ng-model="feed.name" ng-required="true" ng-pattern="validations.patterns.name"/>
+  </div>
 
-    <div class="col-xs-24">
-      <label class="light">Tags</label>
-    </div>
+	<div class="col-xs-24">
+		<label class="light">Description</label>
+	</div>
 
-    <div class="col-xs-24">
-      <div ng-repeat="tag in feed.tags">
-        <div class="row dynamic-table-spacer">
-          <div class="col-xs-10">
-            <input type="text" class="form-control" ng-model="tag.key"
-                   validation-optional-message="{{validations.messages.key}}"
-              ng-pattern="validations.patterns.alpha" ng-required="tag.value" placeholder="key"/>
-          </div>
-          <div class="col-xs-11">
-            <input type="text" class="form-control" validation-optional-message="{{validations.messages.value}}"
-              ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key" placeholder="value"/>
-          </div>
-          <div class="col-xs-3">
-            <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0">
-              <span class="entypo minus"></span> delete
-            </button>
-          </div>
+	<div class="col-xs-8">
+		<input type="text" class="form-control"
+				ng-model="feed.description"
+				ng-pattern="validations.patterns.freeText"/>
+	</div>
+
+  <div class="col-xs-24">
+    <label class="light">Tags</label>
+  </div>
+
+  <div class="col-xs-12">
+    <div ng-repeat="tag in feed.tags">
+      <div class="row dynamic-table-spacer">
+        <div class="col-xs-8">
+          <input type="text" class="form-control" ng-model="tag.key"
+		validation-optional-message="{{validations.messages.key}}"
+		ng-pattern="validations.patterns.alpha" ng-required="tag.value" placeholder="key"/>
         </div>
+        <div class="col-xs-8">
+          <input type="text" class="form-control" validation-optional-message="{{validations.messages.value}}"
+		ng-model="tag.value"
+			ng-pattern="validations.patterns.alpha" ng-required="tag.key" placeholder="value"/>
+        </div>
+				<div class="col-xs-8">
+	        <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-disabled="xmlPreview.edit" ng-if="!$first || !$last">
+	          <span class="entypo minus"></span> delete
+	        </button>
+	        <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-disabled="xmlPreview.edit" ng-if="$last">
+	          <span class="entypo plus"></span> add tag
+	        </button>
+	      </div>
       </div>
     </div>
-    <div class="col-xs-24 dynamic-table-spacer">
-      <button type="button" class="btn btn-default btn-xs" ng-click="addTag()">
-        <span class="entypo plus"></span> add tag
-      </button>
-    </div>
+  </div>
+  <div class="col-xs-24">
+    <label class="light" tooltip="feed.groups">
+			Feed Groups (comma separated)
+		</label>
+  </div>
 
-    <div class="col-xs-24">
-      <label class="light">Groups (comma separated)</label>
-      <input type="text" class="form-control" validation-optional-message="{{validations.messages.acl.group}}"
-        ng-pattern="validations.patterns.commaSeparated"
-        ng-model="feed.groups"/>
-    </div>
+	<div class="col-xs-8">
+    <input type="text" class="form-control" validation-optional-message="{{validations.messages.acl.group}}"
+      ng-pattern="validations.patterns.commaSeparated"
+      ng-model="feed.groups"/>
+  </div>
 
-    <div class="col-xs-24"><h4 class="tittle-in-row">Access Control List</h4></div>
-    <div class="col-xs-8">
-      <label class="light">Owner</label>
-      <input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
-             ng-required="true"
-             ng-pattern="validations.patterns.unixId"
-             ng-model="feed.ACL.owner"/>
-    </div>
-    <div class="col-xs-8">
-      <label class="light">Group</label>
-      <input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
-             ng-required="true"
-             ng-pattern="validations.patterns.unixId"
-             ng-model="feed.ACL.group"/>
-    </div>
-    <div class="col-xs-8">
-      <label class="light">Permissions</label>
-      <input type="text" class="form-control" validation-message="{{validations.messages.acl.permission}}"
-             ng-required="true"
-             ng-pattern="validations.patterns.unixPermissions"
-             ng-model="feed.ACL.permission"/>
-    </div>
+	<div class="col-xs-24">
+    <label class="light">Type<mandatory-field></mandatory-field></label>
+  </div>
 
-    <div class="col-xs-24"><h4 class="tittle-in-row">Schema</h4></div>
-    <div class="col-xs-12">
-      <label class="light">Location</label>
+	<div class="col-xs-4">
+		<select ng-model="feed.dataTransferType" ng-required="true"
+			class="form-control padding0" ng-change="onTypeChange(feed.dataTransferType)">
+			<option value="" disabled selected style='display:none;'>-Select feed type-</option>
+			<option value="hive">Hive</option>
+			<option value="hdfs">HDFS</option>
+			<option value="import">RDBMS Import</option>
+			<option value="export">RDBMS Export</option>
+		</select>
+	</div>
+
+	<div class="col-xs-24" ng-if="feed.dataTransferType !== ''">
+		<input type="checkbox" ng-checked="feed.enableFeedReplication"
+			ng-model="feed.enableFeedReplication" ng-disabled="xmlPreview.edit"/>
+		<label class="light">Enable Replication</label>
+	</div>
+	<div class="col-xs-24 plr0px" ng-if="feed.dataTransferType !== ''">
+		<div class="col-xs-12 plr0px">
+			<div class="col-xs-24 plr0px clusterBox">
+				<h3>Source(s)</h3>
+				<div ng-if="feed.dataTransferType === 'import'">
+					<feed-form-data-source></feed-form-data-source>
+				</div>
+				<div ng-if="feed.dataTransferType === 'hdfs' || feed.dataTransferType === 'hive' || feed.dataTransferType === 'export'">
+					<div class="col-xs-24 plr0px" ng-if="feed.dataTransferType === 'export'">
+						<div class="col-xs-24">
+					    <label class="light">Location</label>
+					  </div>
+						<label class="custom-danger" ng-show="feedForm.$submitted && !feed.sourceClusterLocationType">
+							You need to select a source location type.
+						</label>
+					  <div class="col-xs-24 mt5 plr0px">
+					    <div class="typeButtonsBox">
+					      <div class="col-xs-6">
+					        <span class="radio-inline">
+					          <input type="radio" name="sourceClusterLocationType" ng-required="!feed.sourceClusterLocationType"
+											value="hdfs" ng-model="feed.sourceClusterLocationType"
+											ng-checked="feed.dataTransferType === 'hdfs' || feed.sourceClusterLocationType === 'hdfs'"/>
+					          HDFS
+					      </div>
+					      <div class="col-xs-6">
+					        <span class="radio-inline">
+					          <input type="radio" name="sourceClusterLocationType" ng-required="!feed.sourceClusterLocationType"
+											value="hive" ng-model="feed.sourceClusterLocationType"
+											ng-checked="feed.dataTransferType === 'hive' || feed.sourceClusterLocationType ==='hive'"/>
+					          Hive
+					      </div>
+					    </div>
+						</div>
+					</div>
+					<div id="sourceClusters">
+						<div class="col-xs-24 plr0px" ng-repeat="sourceCluster in feed.clusters | filter:{type:'source'}" ng-if="$index > 0">
+							<div ng-if="feed.sourceClusterLocationType === 'hive'">
+								<feed-form-hive-storage
+									storage-info="{'clusterStorage':sourceCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters, readOnly:true}"
+									required="(feed.clusters | filter:{type:'source'}).length > 1" validations="validations">
+								</feed-form-hive-storage>
+							</div>
+							<div ng-if="feed.sourceClusterLocationType === 'hdfs'">
+								<feed-form-hdfs-storage
+									storage-info="{'clusterStorage':sourceCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters, readOnly:true}"
+									required="(feed.clusters | filter:{type:'source'}).length > 1" validations="validations">
+								</feed-form-hdfs-storage>
+							</div>
+						</div>
+					</div>
+
+					<div class="col-xs-24 plr0px" ng-repeat="sourceCluster in feed.clusters | filter:{type:'source'}" ng-if='$index === 0'>
+						<div ng-if="feed.sourceClusterLocationType === 'hive'">
+							<feed-form-hive-storage storage-info="{'clusterStorage':sourceCluster,'clustersList':clustersList, 'feedClusters':feed.clusters,type:'source',validationMessage:validations.messages.number}"
+								required="(feed.clusters | filter:{type:'source'}).length === 1" validations="validations"
+								add="addClusterStorage(value)" show="toggleClusterStorage(value)"
+								open-date-picker="openDatePicker(event,container)" construct-date="constructDate()">
+							</feed-form-hive-storage>
+						</div>
+						<div ng-if="feed.sourceClusterLocationType === 'hdfs'">
+							<feed-form-hdfs-storage storage-info="{'clusterStorage':sourceCluster,'clustersList':clustersList, 'feedClusters':feed.clusters,type:'source',validationMessage:validations.messages.number}"
+								required="(feed.clusters | filter:{type:'source'}).length === 1" validations="validations"
+								add="addClusterStorage(value)" show="toggleClusterStorage(value)"
+								open-date-picker="openDatePicker(event,container)" construct-date="constructDate()">
+							</feed-form-hdfs-storage>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div class="col-xs-12 plr0px pl5">
+			<div class="col-xs-24 plr0px clusterBox"
+				ng-if="feed.dataTransferType === 'export' || feed.dataTransferType === 'import' || feed.enableFeedReplication">
+				<h3>Target(s)</h3>
+				<div ng-if="feed.dataTransferType === 'export'">
+					<feed-form-data-source></feed-form-data-source>
+				</div>
+				<div ng-if="feed.dataTransferType === 'import'">
+					<div class="col-xs-24 plr0px">
+						<div class="col-xs-24">
+							<label class="light">Location</label>
+						</div>
+						<label class="custom-danger" ng-show="feedForm.$submitted && !feed.targetClusterLocationType">
+							You need to select a target location type.
+						</label>
+						<div class="col-xs-24 mt5 plr0px">
+							<div class="typeButtonsBox">
+								<div class="col-xs-6">
+									<span class="radio-inline">
+										<input type="radio" name="targetClusterLocationType" ng-required="!feed.targetClusterLocationType"
+											value="hdfs" ng-model="feed.targetClusterLocationType"
+											ng-checked="feed.dataTransferType === 'hdfs' || feed.targetClusterLocationType === 'hdfs'"/>
+										HDFS
+								</div>
+								<div class="col-xs-6">
+									<span class="radio-inline">
+										<input type="radio" name="targetClusterLocationType" ng-required="!feed.targetClusterLocationType"
+											value="hive" ng-model="feed.targetClusterLocationType"
+											ng-checked="feed.dataTransferType === 'hive' || feed.targetClusterLocationType ==='hive'"/>
+										Hive
+								</div>
+							</div>
+						</div>
+					</div>
+					<div id="sourceClusters">
+						<div class="col-xs-24 plr0px" ng-repeat="sourceCluster in feed.clusters | filter:{type:'source'}" ng-if="$index > 0">
+							<div ng-if="feed.targetClusterLocationType === 'hive'">
+								<feed-form-hive-storage
+									storage-info="{'clusterStorage':sourceCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters, readOnly:true}"
+									required="(feed.clusters | filter:{type:'source'}).length > 1" validations="validations">
+								</feed-form-hive-storage>
+							</div>
+							<div ng-if="feed.targetClusterLocationType === 'hdfs'">
+								<feed-form-hdfs-storage
+									storage-info="{'clusterStorage':sourceCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters, readOnly:true}"
+									required="(feed.clusters | filter:{type:'source'}).length > 1" validations="validations">
+								</feed-form-hdfs-storage>
+							</div>
+						</div>
+					</div>
+
+					<div class="col-xs-24 plr0px" ng-repeat="sourceCluster in feed.clusters | filter:{type:'source'}" ng-if='$index === 0'>
+						<div ng-if="feed.targetClusterLocationType === 'hive'">
+							<feed-form-hive-storage storage-info="{'clusterStorage':sourceCluster,'clustersList':clustersList, 'feedClusters':feed.clusters,type:'source',validationMessage:validations.messages.number}"
+								required="(feed.clusters | filter:{type:'source'}).length === 1" validations="validations"
+								add="addClusterStorage(value)" show="toggleClusterStorage(value)"
+								open-date-picker="openDatePicker(event,container)" construct-date="constructDate()">
+							</feed-form-hive-storage>
+						</div>
+						<div ng-if="feed.targetClusterLocationType === 'hdfs'">
+							<feed-form-hdfs-storage storage-info="{'clusterStorage':sourceCluster,'clustersList':clustersList, 'feedClusters':feed.clusters,type:'source',validationMessage:validations.messages.number}"
+								required="(feed.clusters | filter:{type:'source'}).length === 1" validations="validations"
+								add="addClusterStorage(value)" show="toggleClusterStorage(value)"
+								open-date-picker="openDatePicker(event,container)" construct-date="constructDate()">
+							</feed-form-hdfs-storage>
+						</div>
+					</div>
+				</div>
+
+				<div ng-if="feed.enableFeedReplication && (feed.dataTransferType === 'hdfs' || feed.dataTransferType === 'hive')">
+					<div id="targetClusters">
+						<div class="col-xs-24 plr0px" ng-repeat="targetCluster in feed.clusters | filter:{type:'target'}" ng-if='$index > 0'>
+							<div ng-if="feed.targetClusterLocationType === 'hive'">
+								<feed-form-hive-storage
+									storage-info="{'clusterStorage':targetCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters, readOnly:true}"
+									required="feed.enableFeedReplication && (feed.clusters | filter:{type:'target'}).length > 1"
+									validations="validations">
+								</feed-form-hive-storage>
+							</div>
+							<div ng-if="feed.targetClusterLocationType === 'hdfs'">
+								<feed-form-hdfs-storage
+									storage-info="{'clusterStorage':targetCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters, readOnly:true}"
+									required="feed.enableFeedReplication && (feed.clusters | filter:{type:'target'}).length > 1"
+									validations="validations">
+								</feed-form-hdfs-storage>
+							</div>
+						</div>
+					</div>
+
+					<div class="col-xs-24 plr0px" ng-repeat="targetCluster in feed.clusters | filter:{type:'target'}" ng-if='$index === 0'>
+						<div ng-if="feed.targetClusterLocationType === 'hive'">
+							<feed-form-hive-storage
+								storage-info="{'clusterStorage':targetCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters, type:'target'}"
+								validations="validations" add="addClusterStorage(value)"
+								required="feed.enableFeedReplication && (feed.clusters | filter:{type:'target'}).length === 1"
+								show="toggleClusterStorage(value)" open-date-picker="openDatePicker(event,container)"
+								construct-date="constructDate()">
+							</feed-form-hive-storage>
+						</div>
+						<div ng-if="feed.targetClusterLocationType === 'hdfs'">
+							<feed-form-hdfs-storage
+								storage-info="{'clusterStorage':targetCluster, 'clustersList':clustersList, 'feedClusters':feed.clusters,type:'target'}"
+								validations="validations" add="addClusterStorage(value)"
+								required="feed.enableFeedReplication && (feed.clusters | filter:{type:'target'}).length === 1"
+								show="toggleClusterStorage(value)" open-date-picker="openDatePicker(event,container)"
+								construct-date="constructDate()">
+							</feed-form-hdfs-storage>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<div class="col-xs-24 plr0px" ng-if="feed.dataTransferType !== ''">
+    <div class="col-xs-12 plr0px clusterBoxEndLine">
+    </div>
+    <div class="col-xs-12 plr0px pl5"
+			ng-if="feed.dataTransferType === 'export' || feed.dataTransferType === 'import' || feed.enableFeedReplication">
+      <div class="col-xs-24 plr0px clusterBoxEndLine">
+      </div>
+    </div>
+  </div>
+
+	<div class="col-xs-24 frequencyBox plr0px">
+		<div class="col-xs-24">
+			<label>Frequency</label>
+		</div>
+		<div class="col-xs-24">
+			<label class="light">Repeat Every<mandatory-field></mandatory-field></label>
+		</div>
+		<div class="col-xs-24 plr0px">
+			<div class="col-xs-2">
+				<input type="text"
+							 name="frequencyQuantity"
+							 ng-model="feed.frequency.quantity"
+							 ng-pattern="validations.patterns.twoDigits"
+							 ng-keydown="validations.acceptOnlyNumber($event)"
+							 ng-keyup="checkMininumFrequency(feed.frequency.quantity, feed.frequency.unit, feedForm.frequencyQuantity)"
+							 class="form-control"
+							 ng-required="true"
+							 validation-message="{{validations.messages.number}}" />
+			</div>
+			<div class="col-xs-6">
+				<select ng-model="feed.frequency.unit" class="form-control padding0" ng-required="true"
+					ng-change="checkMininumFrequency(feed.frequency.quantity, feed.frequency.unit, feedForm.frequencyQuantity)">
+					<option selected value="minutes">minutes</option>
+					<option value="hours">hours</option>
+					<option value="days">days</option>
+					<option value="months">months</option>
+				</select>
+			</div>
+		</div>
+		<div class="col-xs-24 custom-danger" ng-if="!isFrequencyValid">{{validations.messages.frequency.minimum}}</div>
+
+		<div class="col-xs-24">
+			<label class="light">Timezone<mandatory-field></mandatory-field></label>
+		</div>
+		<div class="col-xs-8">
+			<time-zone-select ng-model="feed.timezone"></time-zone-select>
+		</div>
+	</div>
+
+	<div class="col-xs-24 advancedOption" ng-click="expandOptions = !expandOptions" id="feedAdvancedOption">
+    <label class="mt15 pointer blink-success">ADVANCED OPTIONS</label>
+    <i class="glyphicon glyphicon-chevron-down mt15" ng-if="!expandOptions"></i>
+    <i class="glyphicon glyphicon-chevron-up mt15" ng-if="expandOptions"></i>
+  </div>
+
+	<div id="advancedOptionsBox" class="col-xs-24 plr0px" ng-class="{expanded:expandOptions}">
+		<div class="col-xs-24"><label>Job Details</label></div>
+		<div class="col-xs-24 plr0px">
+			<div ng-repeat="property in feed.properties track by $index">
+				<div ng-if="property.key === 'queueName'">
+					<div class="col-xs-4">
+						<label class="light">Queue Name</label>
+						<input type="text" class="form-control"
+							ng-model="property.value" />
+					</div>
+				</div>
+				<div ng-if="property.key === 'jobPriority'">
+					<div class="col-xs-4">
+						<label class="light">Job Priority</label>
+						<select ng-model="property.value" class="form-control padding0">
+              <option value="" disabled selected style='display:none;'>-Select job-</option>
+              <option value="VERY_HIGH">Very high</option>
+              <option value="HIGH">High</option>
+              <option value="NORMAL">Normal</option>
+              <option value="LOW">Low</option>
+              <option value="VERY_LOW">Very Low</option>
+            </select>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div class="col-xs-24 plr0px">
+			<div class="col-xs-4">
+				<label class="col-xs-24 light plr0px">Late Arrival Cutoff</label>
+				<input type="text" class="col-xs-4" ng-keydown="validations.acceptOnlyNumber($event)"
+                 ng-model="feed.lateArrival.cutOff.quantity"
+                 ng-pattern="validations.patterns.twoDigits"/>
+        <select
+          ng-model="feed.lateArrival.cutOff.unit" class="col-xs-offset-1 col-xs-19">
+          <option value="" disabled selected style='display:none;'>-Select unit-</option>
+          <option value="minutes">minutes</option>
+          <option value="hours">hours</option>
+          <option value="days">days</option>
+          <option value="months">months</option>
+        </select>
+			</div>
+			<div class="col-xs-4">
+				<label class="light">Availability Flag</label>
+				<input type="text" class="form-control"
+					ng-model="feed.availabilityFlag"
+					validation-optional-message="{{validations.messages.value}}"
+					ng-pattern="validations.patterns.alpha">
+			</div>
+		</div>
+
+		<label class="col-xs-24">Performance & Throttling - Distributed Copy</label>
+
+		<div class="col-xs-24 plr0px">
+			<div ng-repeat="property in feed.properties track by $index">
+				<div ng-if="property.key === 'mapBandwidthKB'">
+					<div class="col-xs-4">
+						<label class="light">Max Bandwidth</label>
+						<input type="text" class="form-control"
+							ng-model="property.value">
+					</div>
+				</div>
+				<div ng-if="property.key === 'maxMaps'">
+					<div class="col-xs-4">
+						<label class="light">Max map jobs</label>
+						<input type="text" class="form-control"
+							ng-model="property.value">
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div class="col-xs-24 plr0px">
+			<div ng-repeat="property in feed.properties track by $index">
+				<div ng-if="property.key === 'parallel'">
+					<div class="col-xs-4">
+						<label class="col-xs-24 light plr0px">Parallel</label>
+						<input type="text" class="form-control"
+							ng-model="property.value">
+					</div>
+				</div>
+			</div>
+		</div>
+
+    <div class="col-xs-24"><label>Access Control List</label></div>
+    <div class="col-xs-24 plr0px">
+        <div class="col-xs-8">
+          <label class="light">Owner<mandatory-field></mandatory-field></label>
+          <input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
+                 ng-required="true"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-model="feed.ACL.owner"/>
+        </div>
+        <div class="col-xs-8">
+          <label class="light">Group<mandatory-field></mandatory-field></label>
+          <input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
+                 ng-required="true"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-model="feed.ACL.group"/>
+        </div>
+				<div class="col-xs-24">
+		<div class="col-xs-8 plr0px">
+		<label class="light">Permissions<mandatory-field></mandatory-field></label>
+					  <acl-permissions acl-model="feed.ACL.permission"></acl-permissions>
+		</div>
+				</div>
+		</div>
+    <div class="col-xs-24"><label>Feed Schema</label></div>
+    <div class="col-xs-8">
+      <label class="light" tooltip="feed.schema.location">Location<mandatory-field></mandatory-field></label>
       <input type="text" class="form-control" validation-message="{{validations.messages.location}}"
         ng-maxlength="200"
         ng-pattern="validations.patterns.osPath"
-        ng-model="feed.schema.location"
-        ng-required="true"/>
+        ng-model="feed.schema.location"/>
     </div>
-    <div class="col-xs-12">
-      <label class="light">Provider</label>
+    <div class="col-xs-8">
+      <label class="light" tooltip="feed.schema.provider">Provider<mandatory-field></mandatory-field></label>
       <input type="text" class="form-control" validation-message="{{validations.messages.provider}}"
         ng-pattern="validations.patterns.osPath"
-        ng-model="feed.schema.provider"
-        ng-required="true"/>
+        ng-model="feed.schema.provider"/>
     </div>
+		<div class="col-xs-8"></div>
+	</div>
 
-
-  <div class="col-xs-24 mt20">
-    <button id="feed.step1" class="btn nextBtn col-xs-6 pull-right"
-         ng-disabled="buttonSpinners.show"
-         ng-click="goNext(feedForm.$invalid, 'forms.feed.properties')">
-      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
-    </a>
+  <div class="col-xs-24 pb15px mt35">
+		<div class="pull-right">
+	    <a class="btn cnclBtn" ui-sref="main">
+	      CANCEL
+	    </a>
+	    <button id="feed.step1" class="btn nextBtn"
+	         ng-disabled="buttonSpinners.show"
+	         ng-click="goNext(feedForm.$invalid)"
+					 scroll-to-error>
+	      NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+	    </button>
+			<button id="feed.step5" class="btn nextBtn" ng-click="saveEntity(feedForm.$invalid)"
+				ng-disabled="feedForm.$invalid || buttonSpinners.saveShow">
+	      SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
+	    </button>
+		</div>
   </div>
 
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/feed/feedFormLocationStepTpl.html b/falcon-ui/app/html/feed/feedFormLocationStepTpl.html
index 7c7355e..aefe7c0 100644
--- a/falcon-ui/app/html/feed/feedFormLocationStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormLocationStepTpl.html
@@ -20,9 +20,11 @@
 <form name="feedForm" novalidate id="feedFormLocationStep">
   <div class="col-xs-24 locationStep">
     <div class="row">
-      <div class="col-xs-24 feedLocationNavBox">
-        <h4 class="col-xs-10" ng-show="feed.storage.fileSystem.active">Default Storage type </h4>
-        <h4 class="col-xs-10" ng-show="feed.storage.catalog.active"> Storage type </h4>
+      <div class="col-xs-24 feedLocationNavBox plr0px mt15">
+        <span class="col-xs-10" ng-show="feed.storage.fileSystem.active"
+          tooltip="feed.location.storageType">Default Storage Type</span>
+        <span class="col-xs-10" ng-show="feed.storage.catalog.active"
+          tooltip="feed.location.storageType">Storage Type</span>
 
         <div class="col-xs-14 feedLocationNav">
           <button type="button"
@@ -41,13 +43,13 @@
         </div>
         <div class="clearfix"></div>
       </div>
-      <h4 class="col-xs-12">Default Location</h4>
+      <div class="col-xs-24"><label class="mt15">DEFAULT LOCATION</label></div>
       <div class="col-xs-24">
         <div ng-show="feed.storage.fileSystem.active"
           ng-repeat="location in feed.storage.fileSystem.locations" class="row">
 
           <div class="col-xs-8">
-            <label class="light">{{capitalize(location.type)}} path</label>
+            <label class="light">{{capitalize(location.type)}} Path<mandatory-field></mandatory-field></label>
           </div>
           <div class="pull-right" ng-show="location.focused">
             <label class="light">add</label>
@@ -59,10 +61,10 @@
           <div class="clearfix hidden-md"></div>
           <div class="col-xs-24">
             <input type="text" class="form-control" validation-message="{{validations.messages.path}}"
-              ng-required="true"
+              ng-required="feed.storage.fileSystem.active"
               ng-model="location.path"
               ng-pattern="validations.patterns.osPath"
-              ng-class="{firstInput: $index === 0}"
+              focus-if="feed.storage.fileSystem.active && $index === 0"
               ng-focus="location.focused = true"/>
           </div>
         </div>
@@ -71,12 +73,12 @@
 
       <div ng-show="feed.storage.catalog.active">
         <div class="col-xs-8">
-          <label class="light">Table uri</label>
+          <label class="light">Table uri<mandatory-field></mandatory-field></label>
         </div>
 
         <div class="pull-right" ng-show="feed.storage.catalog.catalogTable.focused">
           <label class="light">add</label>
-          <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']"
+          <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY}', '${HOUR}']"
                  ng-click="appendVariable(timeVariable, feed.storage.catalog.catalogTable, 'uri')">
             {{timeVariable}}
           </label>
@@ -87,27 +89,27 @@
             ng-model="feed.storage.catalog.catalogTable.uri"
             ng-pattern="validations.patterns.tableUri"
             ng-required="feed.storage.catalog.active" validation-message="{{validations.messages.path}}"
+            focus-if="feed.storage.catalog.active"
             ng-focus="feed.storage.catalog.catalogTable.focused = true"/>
         </div>
 
       </div>
     </div>
-
-    <div class="row">
-      <div class="col-xs-24 mt20">
-        <button type="button"
-                id="feed.backToStep2" class="btn prevBtn"
-                ng-click="goBack('forms.feed.properties')"
-                ng-disabled="buttonSpinners.backShow">
-          Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
-        </button>
-        <button id="feed.step3" class="btn nextBtn pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.clusters')" >
-          Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-        </button>
-        <a class="pull-right" ui-sref="main">
-          Cancel
+    <div class="col-xs-24 mt35 pb15px pl0px">
+      <button type="button"
+              id="feed.backToStep2" class="btn prevBtn"
+              ng-click="goBack()"
+              ng-disabled="buttonSpinners.backShow">
+        PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+      </button>
+      <div class="pull-right">
+        <a class="btn cnclBtn" ui-sref="main">
+          CANCEL
         </a>
+        <button id="feed.step3" class="btn nextBtn" ng-click="goNext(feedForm.$invalid)" scroll-to-error>
+          NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+        </button>
       </div>
     </div>
   </div>
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html b/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html
index 2e4cfd1..e2a4a44 100644
--- a/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html
@@ -19,143 +19,132 @@
 -->
 <form name="feedForm" novalidate id="feedFormPropertiesStep">
 
-    <h5 class="col-xs-24 mb10">Timing</h5>
-
-    <div class="col-xs-9 inlineInputsGroup">
-      <div class="light">Frequency</div>
-      <span>Every</span>
-      <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
+	<div class="col-xs-24">
+      <label class="light" tooltip="feed.properties.frequency">
+				Frequency Every<mandatory-field></mandatory-field>
+			</label>
+		<div class="row dynamic-table-spacer">
+          <div class="col-xs-10">
+            <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
              ng-model="feed.frequency.quantity" autofocus
              ng-required="true"
              ng-keydown="validations.acceptOnlyNumber($event)"
              ng-pattern="validations.patterns.twoDigits"/>
-
-      <select
-        ng-model="feed.frequency.unit"
-        ng-required="true">
-        <option selected value="minutes">minutes</option>
-        <option value="hours">hours</option>
-        <option value="days">days</option>
-        <option value="months">months</option>
-      </select>
-    </div>
-
-    <div class="col-xs-9 inlineInputsGroup">
-      <div class="light"><input type="checkbox" ng-model="feed.lateArrival.active" />Late Arrival</div>
-      <span>Up to</span>
-
-      <input type="text" class="form-control" ng-keydown="validations.acceptOnlyNumber($event)"
-        ng-model="feed.lateArrival.cutOff.quantity"
-        ng-disabled="!feed.lateArrival.active"
-        ng-pattern="validations.patterns.twoDigits"
-        ng-required="feed.lateArrival.active"/>
-
-      <select
-        ng-model="feed.lateArrival.cutOff.unit" ng-disabled="!feed.lateArrival.active"
-        ng-required="feed.lateArrival.active">
-        <option selected value="minutes">minutes</option>
-        <option value="hours">hours</option>
-        <option value="days">days</option>
-        <option value="months">months</option>
-      </select>
-    </div>
-    <div class="col-xs-6 inlineInputsGroup">
-      <div class="light">Availability Flag</div>
-      <input type="text" id="availInput" class="form-control"
-        ng-model="feed.availabilityFlag"
-        ng-pattern="validations.patterns.alpha">
-    </div>
-  </div>
-
-  <div class="col-xs-24">
-    <div class="row mt20">
-      <label class="col-xs-5 light">Timezone</label>
-      <time-zone-select ng-model="feed.timezone" class="col-xs-19"></time-zone-select>
-
-      <h5 class="col-xs-24">Properties</h5>
-
-      <div class="col-xs-5">
-        <label class="light">Name</label>
-      </div>
-      <div class="col-xs-19">
-        <label class="light">Value</label>
-      </div>
-      <div class="col-xs-24" id="feedPropertiesBox">
-        <div ng-repeat="property in feed.properties" class="row">
-
-          <label class="col-xs-5">{{property.key}}</label>
-
-          <div class="col-xs-19" ng-if="property.key !== 'timeout' && property.key !== 'jobPriority'">
-            <input type="text" class="form-control" placeholder="{{propPlaceholders[property.key]}}"
-              ng-model="property.value" validation-optional-message="{{validations.messages.value}}"
-              ng-pattern="validations.patterns.alpha"/>
           </div>
-          <div class="col-xs-19 inlineInputsGroup" ng-if="property.key === 'timeout'">
-            At
-            <input type="text" class="form-control" ng-keydown="validations.acceptOnlyNumber($event)"
-                   ng-model="property.value.quantity"
-                   ng-pattern="validations.patterns.twoDigits"/>
+          <div class="col-xs-11">
             <select
-              ng-model="property.value.unit">
-              <option value="" disabled selected style='display:none;'>-Select timeout-</option>
-              <option value="minutes">minutes</option>
-              <option value="hours">hours</option>
-              <option value="days">days</option>
-              <option value="months">months</option>
-            </select>
+				ng-model="feed.frequency.unit"
+				ng-required="true">
+				<option selected value="minutes">minutes</option>
+				<option value="hours">hours</option>
+				<option value="days">days</option>
+				<option value="months">months</option>
+			 </select>
           </div>
-          <div class="col-xs-19" ng-if="property.key === 'jobPriority'">
-            <select ng-model="property.value" class="form-control padding0">
-              <option value="" disabled selected style='display:none;'>-Select job-</option>
-              <option value="VERY_HIGH">Very high</option>
-              <option value="HIGH">High</option>
-              <option value="NORMAL">Normal</option>
-              <option value="LOW">Low</option>
-              <option value="VERY_LOW">Very Low</option>
-            </select>
+          <div class="col-xs-3">
           </div>
         </div>
-      </div>
-      <div class="col-xs-24">
-        <div ng-repeat="property in feed.customProperties" class="row">
-          <div class="col-xs-5 mt10">
-            <input type="text" class="form-control" placeholder="key"
-              ng-model="property.key" validation-optional-message="{{validations.messages.key}}"
-              ng-pattern="validations.patterns.alpha"
-              ng-required="property.value"/>
-          </div>
-
-          <div class="col-xs-15 mt10">
-            <input type="text" class="form-control" placeholder="value"
-              ng-model="property.value" validation-optional-message="{{validations.messages.value}}"
-              ng-pattern="validations.patterns.alpha"
-              ng-required="property.key"/>
-          </div>
-          <div class="col-xs-4 mt10">
-            <button type="button" class="btn btn-default btn-xs mt1" ng-click="removeCustomProperty($index)" ng-if="$index>0">
-              <span class="entypo minus"></span> delete
-            </button>
-          </div>
-        </div>
-      </div>
-      <div class="col-xs-24 mt10">
-        <button type="button" class="btn btn-default btn-xs" ng-click="addCustomProperty()">
-          <span class="entypo plus"></span> add property
-        </button>
-      </div>
     </div>
-  </div>
-  <div class="col-xs-24 mt20">
-    <button id="feed.backToStep1" class="btn prevBtn" type="button"
-         ng-click="goBack('forms.feed.general')"
-         ng-disabled="buttonSpinners.backShow">
-      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
-    </button>
-    <button id="feed.step2" class="btn nextBtn pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.location')">
-      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
-    </a>
-  </div>
-</form>
\ No newline at end of file
+    <div class="col-xs-24">
+			<input type="checkbox" ng-model="feed.lateArrival.active" class="labelCheckBox" />
+      <label class="light" tooltip="feed.properties.lateArrival">
+				Late Arrival Upto<mandatory-field></mandatory-field>
+			</label>
+		<div class="row dynamic-table-spacer">
+		  <div class="col-xs-10">
+           <input type="text" class="form-control" ng-keydown="validations.acceptOnlyNumber($event)"
+			ng-model="feed.lateArrival.cutOff.quantity"
+			ng-disabled="!feed.lateArrival.active"
+			ng-pattern="validations.patterns.twoDigits"
+			ng-required="feed.lateArrival.active"/>
+          </div>
+          <div class="col-xs-11">
+            <select
+				ng-model="feed.lateArrival.cutOff.unit" ng-disabled="!feed.lateArrival.active"
+				ng-required="feed.lateArrival.active">
+				<option selected value="minutes">minutes</option>
+				<option value="hours">hours</option>
+				<option value="days">days</option>
+				<option value="months">months</option>
+			</select>
+          </div>
+		</div>
+    </div>
+    <div class="col-xs-24">
+      <label class="light" tooltip="feed.properties.availabilityIndicator">
+				Availability Indicator<mandatory-field></mandatory-field>
+			</label>
+		<div class="row dynamic-table-spacer">
+		  <div class="col-xs-10">
+           <input type="text" id="availInput" class="form-control" ng-model="feed.availabilityFlag"
+				ng-pattern="validations.patterns.alpha"
+				validation-message="{{validations.messages.availabilityFlag}}"
+				ng-required="true">
+		   </div>
+        </div>
+    </div>
+	<div class="col-xs-24">
+      <label class="light" tooltip="feed.properties.timezone">Timezone<mandatory-field></mandatory-field></label>
+	  <div class="row dynamic-table-spacer">
+		  <div class="col-xs-24">
+           <time-zone-select ng-model="feed.timezone" required="true"></time-zone-select>
+          </div>
+	  </div>
+	</div>
+	<div class="col-xs-24"><label class="mt15">PROPERTIES</label></div>
+	</div>
+	<div class="col-xs-24 plr0px mt10">
+		<table class="table properties">
+			<thead>
+			  <tr>
+				<th class="no-border-bottom col-xs-4">Name</th>
+				<th class="no-border-bottom col-xs-20">Value</th>
+			  </tr>
+			</thead>
+			<tbody>
+			  <tr ng-repeat="property in feed.properties" class="">
+				<td class="no-border-top font11px">{{feedPropertiesLabels[property.key]}}</td>
+				<td class="no-border-top"><div ng-if="property.key !== 'timeout' &amp;&amp; property.key !== 'jobPriority'">
+					<input type="text" class="form-control" placeholder="{{propPlaceholders[property.key]}}" ng-model="property.value" validation-optional-message="{{validations.messages.value}}" ng-pattern="validations.patterns.alpha">
+				  </div>
+				  <div class="col-xs-24 plr0px" ng-if="property.key === 'timeout'">
+						<span class="col-xs-1 plr0px pt5px pb5px">at</span>
+						<input type="text" class="col-xs-2 feedFormInputBorder" ng-keydown="validations.acceptOnlyNumber($event)" ng-model="property.value.quantity" ng-pattern="validations.patterns.twoDigits">
+						<div class="col-xs-1"></div>
+						<select ng-model="property.value.unit" class="col-xs-4">
+						  <option value="" disabled="" selected="" style="display:none;">-Select timeout-</option>
+						  <option value="minutes">minutes</option>
+						  <option value="hours">hours</option>
+						  <option value="days">days</option>
+						  <option value="months">months</option>
+						</select>
+				  </div>
+				  <div class="" ng-if="property.key === 'jobPriority'">
+					<select ng-model="property.value" class="form-control padding0">
+					  <option value="" disabled="" selected="" style="display:none;">-Select job-</option>
+					  <option value="VERY_HIGH">Very high</option>
+					  <option value="HIGH">High</option>
+					  <option value="NORMAL">Normal</option>
+					  <option value="LOW">Low</option>
+					  <option value="VERY_LOW">Very Low</option>
+					</select>
+				  </div>
+				</td>
+			  </tr>
+			</tbody>
+		  </table>
+	</div>
+    <div class="col-xs-24 mt35 pb15px plr0px">
+		<button id="feed.backToStep1" class="btn prevBtn" type="button" ng-click="goBack()" ng-disabled="buttonSpinners.backShow">
+		  PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow">
+		</button>
+		<div class="pull-right">
+			<a class="btn cnclBtn" ui-sref="main">
+			  CANCEL
+			</a>
+			<button id="feed.step2" class="btn nextBtn" ng-click="goNext(feedForm.$invalid)" scroll-to-error>
+			  NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show">
+			</button>
+		</div>
+	</div>
+</form>
diff --git a/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html b/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html
index a8a4844..a77d310 100644
--- a/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html
@@ -17,147 +17,208 @@
  * limitations under the License.
  */
 -->
-<div class="row" id="feedFormSummaryStep">
+<div class="row feedSummaryRow" id="feedSummaryStep">
   <h4 class="col-sm-24">
     General
   </h4>
-  <div class="col-sm-12">
-    <label>Name</label>: {{feed.name}}
-  </div>
-  <div class="col-sm-12">
-    <label>Description</label>: {{optional(feed.description)}}
-  </div>
-
-  <h4 class="col-sm-24">
-    Tags
-  </h4>
   <div class="col-sm-24">
+    <label>Feed Name</label>: <span>{{feed.name}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Description</label>:<span> {{optional(feed.description)}}</span>
+  </div>
+  <div class="col-sm-24">
+    <label>Tags</label>:
     <div ng-repeat="tag in feed.tags | filter:{key: '!!'}">
-      {{tag.key}} = {{tag.value}}
+      <span>{{tag.key}} = {{tag.value}}</span>
     </div>
-    <div ng-show="!hasTags()">No tags selected</div>
+    <div ng-show="!hasTags()"><span>No tags selected</span></div>
   </div>
 
-  <h4 class="col-sm-24">
-    Groups
-  </h4>
   <div class="col-sm-24">
+    <label>Feed Groups</label>:
     {{feed.groups}}
-    <div ng-show="!feed.groups">No groups selected</div>
+    <div ng-show="!feed.groups"><span>No groups selected</span></div>
   </div>
 
   <h4 class="col-sm-24">
     Access Control List
   </h4>
-  <div class="col-sm-8">
-    <label>Owner</label>: {{optional(feed.ACL.owner)}}
-  </div>
-  <div class="col-sm-8">
-    <label>Group</label>: {{optional(feed.ACL.group)}}
-  </div>
-  <div class="col-sm-8">
-    <label>Permissions</label>: {{optional(feed.ACL.permission)}}
+  <div class="col-sm-24">
+    <label>Owner</label>: <span>{{optional(feed.ACL.owner)}}</span>
+    <label>Group</label>: <span>{{optional(feed.ACL.group)}}</span>
+    <label>Permissions</label>:<span> {{optional(feed.ACL.permission)}}</span>
   </div>
 
   <h4 class="col-sm-24">
-    Schema
+    Feed Schema
   </h4>
 
-  <div class="col-sm-12">
-    <label>Location</label>: {{optional(feed.schema.location)}}
-  </div>
-  <div class="col-sm-12">
-    <label>Provider</label>: {{optional(feed.schema.provider)}}
+  <div class="col-sm-24">
+    <label>Location</label>: <span>{{optional(feed.schema.location)}}</span>
+    <label>Provider</label>: <span>{{optional(feed.schema.provider)}}</span>
   </div>
 
   <h4 class="col-sm-24">
     Properties
   </h4>
 
-  <div class="col-sm-8">
-    <label>Frequency</label>: <frequency value="feed.frequency" prefix="Every"/>
+  <div class="col-sm-24">
+    <label>Frequency</label>:<span> <frequency value="feed.frequency" prefix="Every"/></span>
   </div>
-  <div class="col-sm-8">
-    <label>Late Arrival</label>: <frequency value="feed.lateArrival.cutOff" prefix="Up to"/>
+  <div class="col-sm-24">
+    <label>Late Arrival</label>:<span> <frequency value="feed.lateArrival.cutOff" prefix="Up to"/></span>
   </div>
-  <div class="col-sm-8">
-    <label>Availability Flag</label>: {{optional(feed.availabilityFlag)}}
+  <div class="col-sm-24">
+    <label>Availability Flag</label>: <span>{{optional(feed.availabilityFlag)}}</span>
   </div>
 
-  <div class="col-sm-8" ng-repeat="property in feed.properties">
-    <label>{{property.key}}</label>:
+  <div class="col-sm-24" ng-repeat="property in feed.properties">
+    <label>{{feedPropertiesLabels[property.key]}}</label>:
     <span ng-if="property.key !== 'timeout'">{{optional(property.value)}}</span>
-    <frequency ng-if="property.key === 'timeout'" value="property.value" prefix="at"/>
+    <span><frequency ng-if="property.key === 'timeout'" value="property.value" prefix="at"/></span>
   </div>
 
-  <div class="col-sm-8" ng-repeat="property in feed.customProperties | filter: {key: '!!'}">
-    <label>{{property.key}}</label>: {{property.value}}
+  <div class="col-sm-24" ng-repeat="property in feed.customProperties | filter: {key: '!!'}">
+    <label>{{feedPropertiesLabels[property.key]}}</label>: <span>{{property.value}}</span>
   </div>
 
-  <h4 class="col-sm-8" >
-    Default Storage Type:
+  <h4 class="col-sm-24">Default Storage Type:</h4>
+  <div class="col-sm-24">
+    <label class="light" ng-show="feed.storage.fileSystem.locations">File System</label>
+    <label class="light" ng-show="feed.storage.catalog.catalogTable.uri">Catalog Storage</label>
+  </div>
+
+  <h4 class="col-sm-24">Default Location:</h4>
+  <div class="col-sm-24" ng-repeat="location in feed.storage.fileSystem.locations"
+    ng-show="feed.storage.fileSystem.locations">
+    <label>{{capitalize(location.type)}}</label>:
+    <span>{{optional(location.path)}}</span>
+  </div>
+
+  <div class="col-sm-24" ng-show="feed.storage.catalog.catalogTable.uri">
+    <label>Table uri</label>:<span>{{optional(feed.storage.catalog.catalogTable.uri)}}</span>
+  </div>
+
+  <h4 class="col-sm-24" ng-if="(feed.clusters | filter:{type:'source'} | filter:emptyClusterName).length > 0">
+    Source Cluster(s)
   </h4>
 
-  <div class="col-sm-8 light" ng-show="feed.storage.fileSystem.active">File System</div>
-  <div class="col-sm-8 light" ng-show="feed.storage.catalog.active">Catalog Storage</div>
-
-  <h4 class="col-sm-24" >Default Location:</h4>
-
-  <div ng-repeat="location in feed.storage.fileSystem.locations" ng-show="feed.storage.fileSystem.active">
-    <label class="col-sm-24" >{{capitalize(location.type)}}</label>
-    <div class="col-sm-24">{{optional(location.path)}}</div>
-  </div>
-
-  <div ng-show="feed.storage.catalog.active">
-    <label class="col-sm-24" >Table uri</label>
-    <div class="col-sm-24">{{optional(feed.storage.catalog.catalogTable.uri)}}</div>
-  </div>
-
-  <div ng-repeat="cluster in feed.clusters" >
-    <h4 class="col-sm-24" >{{capitalize(cluster.type)}} Cluster</h4>
-
-    <div class="col-sm-12">
-      <label>Name</label>: {{cluster.name}}
+  <div ng-repeat="cluster in feed.clusters | filter:{type:'source'} | filter:emptyClusterName">
+    <div class="col-sm-24">
+      <label>Name</label>: <span>{{cluster.name}}</span>
     </div>
-    <div class="clearfix hidden-md"></div>
 
-    <div class="col-sm-12">
-      <label>Start</label>: {{cluster.validity.start.date|date:'yyyy-MM-dd'}} {{cluster.validity.start.time|date:'HH:mm'}}
-    </div>
-    <div class="col-sm-12">
-      <label>End</label>: {{cluster.validity.end.date|date:'yyyy-MM-dd'}} {{cluster.validity.end.time|date:'HH:mm'}}
+    <div class="col-sm-24">
+      <label>Start</label>: <span>{{getDateTimeString(cluster.validity.start.date,cluster.validity.start.time)}}</span>
     </div>
     <div class="col-sm-24">
-      <label>Timezone</label>: {{feed.timezone}}
+      <label>End</label>: <span>{{getDateTimeString(cluster.validity.end.date,cluster.validity.end.time)}}</span>
     </div>
     <div class="col-sm-24">
-      <label>Retention</label>: <frequency value="cluster.retention" prefix="Archive in"/>
+      <label>Timezone</label>: <span>{{feed.timezone}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Retention</label>: <span><frequency value="cluster.retention" prefix=""/></span>
+    </div>
+
+    <label class="col-sm-24" ng-show="cluster.storage.fileSystem.locations">Location</label>
+    <div class="col-sm-24" ng-repeat="location in cluster.storage.fileSystem.locations"
+      ng-show="cluster.storage.fileSystem.locations">
+      <label>{{capitalize(location.type)}}</label>: <span>{{optional(location.path)}}</span>
+    </div>
+    <div class="col-sm-24" ng-show="cluster.storage.catalog.catalogTable.uri">
+      <label>Table uri</label>: <span>{{optional(cluster.storage.catalog.catalogTable.uri)}}</span>
     </div>
   </div>
-  <div class="clearfix hidden-md"></div>
-  <h4 class="col-sm-24" >Location</h4>
-  <div ng-repeat="location in cluster.storage.fileSystem.locations" ng-show="cluster.storage.fileSystem">
-    <label class="col-sm-24" >{{capitalize(location.type)}}</label>
-    <div class="col-sm-24">{{optional(location.path)}}</div>
+
+  <h4 class="col-sm-24"
+    ng-if="feed.enableFeedReplication && (feed.clusters | filter:{type:'target'} | filter:emptyClusterName).length > 0">
+    Target Cluster(s)
+  </h4>
+  <div ng-repeat="cluster in feed.clusters | filter:{type:'target'} | filter:emptyClusterName" ng-if="feed.enableFeedReplication">
+    <div class="col-sm-24">
+      <label>Name</label>: <span>{{cluster.name}}</span>
+    </div>
+
+    <div class="col-sm-24">
+      <label>Start</label>: <span>{{getDateTimeString(cluster.validity.start.date,cluster.validity.start.time)}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>End</label>: <span>{{getDateTimeString(cluster.validity.end.date,cluster.validity.end.time)}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Timezone</label>: <span>{{feed.timezone}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Retention</label>: <span><frequency value="cluster.retention" prefix=""/></span>
+    </div>
+
+    <label class="col-sm-24" ng-show="cluster.storage.fileSystem.locations">Location</label>
+    <div class="col-sm-24" ng-repeat="location in cluster.storage.fileSystem.locations"
+      ng-show="cluster.storage.fileSystem.locations">
+      <label>{{capitalize(location.type)}}</label>: <span>{{optional(location.path)}}</span>
+    </div>
+    <div class="col-sm-24" ng-show="cluster.storage.catalog.catalogTable.uri">
+      <label>Table uri</label>: <span>{{optional(cluster.storage.catalog.catalogTable.uri)}}</span>
+    </div>
   </div>
-  <div ng-show="cluster.storage.catalog.active">
-    <label class="col-sm-24" >Table uri</label>
-    <div class="col-sm-24">{{optional(cluster.storage.catalog.catalogTable.uri)}}</div>
+
+  <h4 class="col-sm-24" ng-if="feed.dataTransferType === 'import' || feed.dataTransferType === 'export'">
+    Datasource
+  </h4>
+  <div class="col-sm-24 plr0px" ng-if="feed.dataTransferType === 'import'">
+    <div class="col-sm-24">
+      <label>Datasource Name</label>: <span>{{feed.import.source.name}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Table Name</label>: <span>{{feed.import.source.tableName}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Extract Type</label>: <span>{{feed.import.source.extract.type}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Merge Type</label>: <span>{{feed.import.source.extract.mergepolicy}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Columns</label>:
+      <span ng-if="feed.import.source.columnsType === 'include'">{{feed.import.source.includesCSV}}</span>
+      <span ng-if="feed.import.source.columnsType === 'exclude'">{{feed.import.source.excludesCSV}}</span>
+      <span ng-if="feed.import.source.columnsType === 'all'">All</span>
+    </div>
+  </div>
+
+  <div class="col-sm-24 plr0px" ng-if="feed.dataTransferType === 'export'">
+    <div class="col-sm-24">
+      <label>Datasource Name</label>: <span>{{feed.export.target.name}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Table Name</label>: <span>{{feed.export.target.tableName}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Load Method</label>: <span>{{feed.export.target.load.type}}</span>
+    </div>
+    <div class="col-sm-24">
+      <label>Columns</label>:
+      <span ng-if="feed.export.target.columnsType === 'include'">{{feed.export.target.includesCSV}}</span>
+      <span ng-if="feed.export.target.columnsType === 'exclude'">{{feed.export.target.excludesCSV}}</span>
+      <span ng-if="feed.export.target.columnsType === 'all'">All</span>
+    </div>
   </div>
 </div>
 
-<div class="row">
-  <div class="col-xs-24 mt20">
-    <button id="feed.backToStep4" class="btn prevBtn" type="button"
-         ng-click="goBack('forms.feed.clusters')"
-         ng-disabled="buttonSpinners.backShow">
-      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
-    </button>
-    <button id="feed.step5" class="btn nextBtn pull-right" ng-click="saveEntity()">
-      Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
+<div class="col-xs-24 mt35 pb15px pl0px">
+  <button id="feed.backToStep4" class="btn prevBtn" type="button"
+       ng-click="goBack()"
+       ng-disabled="buttonSpinners.backShow">
+    PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+  </button>
+  <div class="pull-right">
+    <a class="btn cnclBtn" ui-sref="main">
+      CANCEL
     </a>
+    <button id="feed.step5" class="btn nextBtn" ng-click="saveEntity()" focus-if>
+      SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
+    </button>
   </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/falcon-ui/app/html/feed/feedFormTpl.html b/falcon-ui/app/html/feed/feedFormTpl.html
index ee30d54..c1a2952 100644
--- a/falcon-ui/app/html/feed/feedFormTpl.html
+++ b/falcon-ui/app/html/feed/feedFormTpl.html
@@ -17,91 +17,82 @@
  * limitations under the License.
  */
 -->
-<div class="col-xs-22 col-xs-offset-1 feedForm" id="feedFormTmpl">
+<div id="formBox" class="feedForm">
   <div class="col-xs-24">
-    <div class="row dt">
-
-      <h3 id="feed.title" class="col-xs-24">
-        <span class="entypo download icon-lg"></span> New Feed
-      </h3>
-
-      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-20' : !propsOpen}">
-        <div class="detailsBox">
-          <div class="feedProgressBox" ng-class="{
-            general:isActive('forms.feed.general'),
-            properties:isActive('forms.feed.properties'),
-            location:isActive('forms.feed.location'),
-            clusters:isActive('forms.feed.clusters'),
-            summary:isActive('forms.feed.summary')
-            }">
-            <div class="progressBar col-xs-24">
-              <div>
-                <span>
-                  <div class="fir">1<span class="entypo check"></span></div>
-                  <h6>General</h6>
-                </span>
-                <span>
-                  <div class="sec">2<span class="entypo check"></span></div>
-                  <h6>Properties</h6>
-                </span>
-                <span>
-                  <div class="thi">3<span class="entypo check"></span></div>
-                  <h6>Location</h6>
-                </span>
-                <span>
-                  <div class="fou">4<span class="entypo check"></span></div>
-                  <h6>Clusters</h6>
-                </span>
-                <span>
-                  <div class="fif">5<span class="entypo check"></span></div>
-                  <h6>Summary</h6>
-                </span>
-              </div>
-            </div>
+    <div class="preview pullOver">
+      <button id="previewXMLBtn" type="button" class="btn btn-default btn-md pull-right nextBtn"
+      ng-disabled="invalidXml && xmlPreview.edit" ng-click="toggleclick()" >Preview XML</button>
+    </div>
+    <br/>
+    <div>
+      <div class="formBoxContainer detailsBox">
+        <div class="row feedProgressBox" ng-class="{
+          general:isActive('forms.feed.general'),
+          summary:isActive('forms.feed.summary')
+          }">
+          <div class="progressBar col-xs-24">
+              <div class="text-center fir" ng-class="{
+                active:isActive('forms.feed.general'),
+                completed:isCompleted('forms.feed.general')}">General</div>
+              <div class="text-center fif" ng-class="{
+                active:isActive('forms.feed.summary'),
+                completed:isCompleted('forms.feed.summary')}">Summary</div>
           </div>
-
-          <div class="row">
-            <div class="col-xs-offset-1 col-xs-22">
-              <fieldset ng-disabled="!editXmlDisabled">
-                <div ui-view class="formViewContainer"></div>
-              </fieldset>
-            </div>
+        </div>
+        <div class="row customContainer">
+          <div class="col-xs-offset-1 col-xs-22">
+            <fieldset ng-disabled="!editXmlDisabled">
+              <div class="formViewContainer">
+                <div class="col-xs-24">
+                  <label class="title"><span class="entypo download icon-lg entypo-align-sub"></span> NEW FEED</label>
+                </div>
+                <div ui-view></div>
+              </div>
+            </fieldset>
           </div>
         </div>
       </div>
 
-      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-4' : !propsOpen}">
-        <div class="detailsBox">
-          <div class="row dt">
-
-            <div class="col-xs-13 col-xs-offset-1 noSpecial">
-              <h5><i class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-minus-sign':'glyphicon-plus-sign'"></i> XML Preview</h5>
+      <div class="hide xmlPreviewContainer detailsBox">
+        <div class="row dt">
+          <div class="col-xs-24 pt15px">
+            <div class="col-xs-13 noSpecial">
+                <h5>XML Preview</h5>
+                <label style="margin-top: -10px;margin-bottom: -2px;" ng-if="invalidXml" class="custom-danger">Invalid Xml</label>
             </div>
 
-            <div ng-if="propsOpen" class="col-xs-9">
+            <div class="pull-right">
               <button type="button"
                       id="feed.editXML"
-                      class="btn btn-default btn-xs pull-right"
+                      class="btn btn-default btn-xs"
                       ng-click="toggleEditXml()"
-                      ng-class="{'btn-warning':!editXmlDisabled}">
+                      ng-class="{'btn-warning':!editXmlDisabled}"
+                      ng-disabled="invalidXml">
                 <div ng-if="editXmlDisabled">Edit XML</div>
                 <div ng-if="!editXmlDisabled">Finish</div>
               </button>
 
+              <button type="button"
+                      id="revertXMLBtn"
+                      class="btn btn-default btn-xs"
+                      ng-if="invalidXml"
+                      ng-click="revertXml()">
+                  <div>Revert</div>
+              </button>
             </div>
-
-            <div ng-show="propsOpen" class="col-sm-24">
-              <div class="row">
-                <div class="col-sm-22 col-sm-offset-1">
-                  <textarea ng-model="prettyXml" elastic class="form-control prettyXml" ng-disabled="editXmlDisabled"></textarea>
-                </div>
-              </div>
-            </div>
+		  </div>
+          <div class="col-sm-24 showValidationStyle">
+            <textarea ng-model="prettyXml"
+                      elastic
+                      class="form-control"
+                      ng-disabled="editXmlDisabled"
+                      ng-class="{fakeInvalid:invalidXml}">
+            </textarea>
+            <!--{{xmlEditValidationError}}-->
+          </div>
 
           </div>
         </div>
-      </div>
-
     </div>
   </div>
 </div>
diff --git a/falcon-ui/app/html/feed/feedSummary.html b/falcon-ui/app/html/feed/feedSummary.html
index 760e810..1f0dcc6 100644
--- a/falcon-ui/app/html/feed/feedSummary.html
+++ b/falcon-ui/app/html/feed/feedSummary.html
@@ -34,9 +34,9 @@
   </div>
 
   <div class="row">
-    <h5 class="col-sm-24">
+    <label class="col-sm-24">
       Tags
-    </h5>
+    </label>
   </div>
 
   <div class="row">
@@ -48,14 +48,8 @@
   </div>
 
   <div class="row">
-    <h5 class="col-sm-24">
-      Groups
-    </h5>
-  </div>
-
-  <div class="row">
     <div class="col-sm-24">
-      {{feed.groups}}
+      <label>Groups</label>: {{feed.groups}}
     </div>
   </div>
 
@@ -114,13 +108,13 @@
 
   <div class="row">
     <div class="col-sm-8" ng-repeat="property in feed.properties">
-      <label>{{property.key}}</label>:
+      <label>{{feedPropertiesLabels[property.key]}}</label>:
       <span ng-if="property.key !== 'timeout'">{{property.value}}</span>
       <frequency ng-if="property.key === 'timeout'" value="property.value" prefix="at"/>
     </div>
 
     <div class="col-sm-8" ng-repeat="property in feed.customProperties | filter: {key: '!!'}">
-      <label>{{property.key}}</label>: {{property.value}}
+      <label>{{feedPropertiesLabels[property.key]}}</label>: {{property.value}}
     </div>
 
     <h5 class="col-xs-24">
@@ -129,31 +123,29 @@
   </div>
 
   <div class="row">
-    <div class="col-sm-8 light" ng-show="feed.storage.fileSystem.active">File System</div>
-    <div class="col-sm-8 light" ng-show="feed.storage.catalog.active">Catalog Storage</div>
+    <div class="col-sm-8 light" ng-show="feed.storage.fileSystem.locations">File System</div>
+    <div class="col-sm-8 light" ng-show="feed.storage.catalog.catalogTable.uri">Catalog Storage</div>
   </div>
 
   <div class="row">
     <h5 class="col-sm-24">Default Location:</h5>
   </div>
 
-
-  <div ng-repeat="location in feed.storage.fileSystem.locations" ng-show="feed.storage.fileSystem.active">
+  <div ng-repeat="location in feed.storage.fileSystem.locations" ng-show="feed.storage.fileSystem.locations">
     <div class="row">
-      <label class="col-sm-24">{{capitalize(location.type)}}</label>
-    </div>
-
-    <div class="row">
-      <div class="col-sm-24">{{location.path}}</div>
+      <div class="col-sm-24">
+        <label>{{capitalize(location.type)}}</label>:
+        <span>{{location.path}}</span>
+      </div>
     </div>
   </div>
 
-  <div ng-show="feed.storage.catalog.active">
+  <div ng-show="feed.storage.catalog.catalogTable.uri">
     <div class="row">
-      <label class="col-sm-24">Table uri</label>
-    </div>
-    <div class="row">
-      <div class="col-sm-24">{{feed.storage.catalog.catalogTable.uri}}</div>
+      <div class="col-sm-24">
+        <label>Table uri</label>
+        <span>{{feed.storage.catalog.catalogTable.uri}}</span>
+      </div>
     </div>
   </div>
 
@@ -186,29 +178,74 @@
     <div class="row">
       <div class="col-sm-24">
         <label>Retention</label>:
-        <frequency value="cluster.retention" prefix="Archive in"/>
+        <frequency value="cluster.retention" prefix=""/>
+      </div>
+    </div>
+
+    <div class="row">
+      <label class="col-sm-24">Location</label>
+    </div>
+
+    <div ng-repeat="location in cluster.storage.fileSystem.locations" ng-show="cluster.storage.fileSystem.locations">
+      <div class="row">
+        <div class="col-sm-24">
+          <label>{{capitalize(location.type)}}</label>
+          <span>{{location.path}}</span>
+        </div>
+      </div>
+    </div>
+    <div ng-show="cluster.storage.catalog.catalogTable.uri">
+      <div class="row">
+        <div class="col-sm-24">
+          <label>Table uri</label>
+          <span>{{cluster.storage.catalog.catalogTable.uri}}</span>
+        </div>
       </div>
     </div>
   </div>
-  <div class="clearfix hidden-md"></div>
+
   <div class="row">
-    <h5 class="col-sm-24">Location</h5>
+    <h4 class="col-sm-24" ng-if="feed.import || feed.export">
+      Datasource
+    </h4>
+    <div class="col-sm-24 plr0px" ng-if="feed.import">
+      <div class="col-sm-24">
+        <label>Datasource Name</label>: <span>{{feed.import.source.name}}</span>
+      </div>
+      <div class="col-sm-24">
+        <label>Table Name</label>: <span>{{feed.import.source.tableName}}</span>
+      </div>
+      <div class="col-sm-24">
+        <label>Extract Type</label>: <span>{{feed.import.source.extract.type}}</span>
+      </div>
+      <div class="col-sm-24">
+        <label>Merge Type</label>: <span>{{feed.import.source.extract.mergepolicy}}</span>
+      </div>
+      <div class="col-sm-24">
+        <label>Columns</label>:
+        <span ng-if="feed.import.source.includesCSV">{{feed.import.source.includesCSV}}</span>
+        <span ng-if="feed.import.source.excludesCSV">{{feed.import.source.excludesCSV}}</span>
+        <span ng-if="!feed.import.source.includesCSV && !feed.import.source.excludesCSV">All</span>
+      </div>
+    </div>
+
+    <div class="col-sm-24 plr0px" ng-if="feed.export">
+      <div class="col-sm-24">
+        <label>Datasource Name</label>: <span>{{feed.export.target.name}}</span>
+      </div>
+      <div class="col-sm-24">
+        <label>Table Name</label>: <span>{{feed.export.target.tableName}}</span>
+      </div>
+      <div class="col-sm-24">
+        <label>Load Method</label>: <span>{{feed.export.target.load.type}}</span>
+      </div>
+      <div class="col-sm-24">
+        <label>Columns</label>:
+        <span ng-if="feed.export.target.includesCSV">{{feed.export.target.includesCSV}}</span>
+        <span ng-if="feed.export.target.excludesCSV">{{feed.export.target.excludesCSV}}</span>
+        <span ng-if="!feed.export.target.includesCSV && !feed.export.target.excludesCSV">All</span>
+      </div>
+    </div>
   </div>
 
-  <div ng-repeat="location in cluster.storage.fileSystem.locations" ng-show="cluster.storage.fileSystem">
-    <div class="row">
-      <label class="col-sm-24">{{capitalize(location.type)}}</label>
-    </div>
-    <div class="row">
-      <div class="col-sm-24">{{location.path}}</div>
-    </div>
-  </div>
-  <div ng-show="cluster.storage.catalog.active">
-    <div class="row">
-      <label class="col-sm-24">Table uri</label>
-    </div>
-    <div class="row">
-      <div class="col-sm-24">{{cluster.storage.catalog.catalogTable.uri}}</div>
-    </div>
-  </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/falcon-ui/app/html/formsTpl.html b/falcon-ui/app/html/formsTpl.html
index b8d50fb..bd63470 100644
--- a/falcon-ui/app/html/formsTpl.html
+++ b/falcon-ui/app/html/formsTpl.html
@@ -18,6 +18,6 @@
  */
 -->
 <div class="col-sm-24 formPage" ng-class="{showValidationStyle:validations.displayValidations.show}">
-  <div ui-view>
+  <div class="col-sm-offset-2 col-sm-20" ui-view>
   </div>
 </div>
diff --git a/falcon-ui/app/html/instanceDetails.html b/falcon-ui/app/html/instanceDetails.html
index b67c041..e22c717 100644
--- a/falcon-ui/app/html/instanceDetails.html
+++ b/falcon-ui/app/html/instanceDetails.html
@@ -17,29 +17,29 @@
  * limitations under the License.
  */
 -->
-<div class="container" id="instanceDetails">
+<div class="container instanceDetails pt15px">
 
   <div class="row">
     <div class="col-sm-24">
       <div class="detailsBox">
         <div class="row">
           <div class="col-sm-9">
-            <h3 class="instance-title">
-              <a href="javascript:void(0);" ng-click="backToEntity()">{{ instance.name }}</a> | {{ instance.instance }}
+            <h3 class="instance-title pl0px">
+              <a href="javascript:void(0);" ng-click="backToEntity()">{{ instance.name }}</a> | <span>{{ instance.instance }}</span>
             </h3>
           </div>
           <div class="col-sm-3 instance-status">
             <span class="text-success">STARTED</span><br/>
-            {{ instance.startTime | date :'MM/dd/yyyy HH:mm' }}
+            <span>{{ instance.startTime | date : dateFormat }}</span>
           </div>
           <div class="col-sm-5 border-left">
             <h4 class="instance-title">
               Status: <span ng-class="{
-              'blink-success': instance.status == 'RUNNING',
-              'text-success': instance.status == 'SUCCEEDED',
-              'blink-warning': instance.status == 'WAITING' || instance.status == 'UNKNOWN',
-              'blink-danger': instance.status == 'SUSPENDED',
-              'text-danger': instance.status == 'FAILED' || instance.status == 'KILLED',
+                'blink-success': instance.status == 'RUNNING',
+                'text-success': instance.status == 'SUCCEEDED',
+                'blink-warning': instance.status == 'WAITING' || instance.status == 'UNKNOWN',
+                'blink-danger': instance.status == 'SUSPENDED',
+                'text-danger': instance.status == 'FAILED' || instance.status == 'KILLED',
               }">{{ instance.status }}</span>
             </h4>
           </div>
@@ -49,11 +49,11 @@
               <span class="entypo play"></span> <div>Resume</div>
             </div>
             <div class="btn btn-big btn-xs buttons-to-show" ng-click="reRunInstance()"
-                 ng-disabled="!(instance.status === 'KILLED' || instance.status === 'SUCCEEDED' || instance.status === 'FAILED')">
-              <span class="entypo play"></span> <div>Rerun</div>
-            </div>
+                ng-disabled="!(instance.status === 'KILLED' || instance.status === 'SUCCEEDED' || instance.status === 'FAILED')">
+                <span class="entypo play"></span> <div>Rerun</div>
+              </div>
             <div class="btn btn-big btn-xs buttons-to-show" ng-click="suspendInstance()" ng-disabled="!(instance.status === 'RUNNING')">
-              <span class="entypo paus"></span> <div>Suspend</div>
+              <span class="entypo paus"></span> <div>Pause</div>
             </div>
             <div class="btn btn-big btn-xs buttons-to-show" ng-click="killInstance()" ng-disabled="!(instance.status === 'SUSPENDED' || instance.status === 'RUNNING')">
               <span class="entypo stop"></span> <div>Kill</div>
diff --git a/falcon-ui/app/html/mainTpl.html b/falcon-ui/app/html/mainTpl.html
index 890463f..963bfb0 100644
--- a/falcon-ui/app/html/mainTpl.html
+++ b/falcon-ui/app/html/mainTpl.html
@@ -17,59 +17,124 @@
  * limitations under the License.
  */
 -->
-
-<div class="col-sm-offset-1 col-sm-22">
-
-  <div class="row searchBoxContainer" id="searchBoxContainer">
-    <div class="col-sm-4"></div>
-    <div class="col-sm-16">
-
-      <img src="css/img/ajax-loader.gif" class="glyphicon search-loading-icon" ng-show="loading"/>
-      <i class="glyphicon glyphicon-search search-icon" ng-hide="loading"></i>
-
-      <tags-input ng-model="tags" min-length="1" add-on-space="true" add-from-autocomplete-only="true"
-                  on-tag-added="displayResults()" on-tag-removed="displayResults()" placeholder="Search">
-        <auto-complete source="loadTags($query)" min-length="0"></auto-complete>
-      </tags-input>
-
-      <i id="nsPopover" class="glyphicon glyphicon-question-sign" ng-class="tags.length > 0 ? 'question-icon' : 'remove-icon'"
-         ns-popover
-         ns-popover-template="menu"
-         ns-popover-trigger="click"
-         ns-popover-theme="ns-popover-tooltip-theme"
-         ns-popover-timeout="5"
-         ns-popover-placement="bottom|right"></i>
-      <script type="text/ng-template" id="menu">
-        <div class="triangle"></div>
-        <!--<div class="ns-popover-tooltip">-->
-          <!--<h5>Hey there! Want some search tips?</h5>-->
-          <!--The <strong>first word</strong> you type will be taken as the <strong>Name</strong> of the entity.-->
-          <!--<br/>-->
-          <!--You can search <strong>*</strong> for getting all the entities.-->
-          <!--<br/>-->
-          <!--The <strong>second and following</strong> words will be taken as <strong> Tags</strong>.-->
-          <!--<br/>-->
-          <!--For filtering by type, write <strong>type=feed|process|mirror</strong>-->
-        <!--</div>-->
-        <div class="ns-popover-tooltip">
-          <h5>Hey there! Want some search tips?</h5>
-          You can type <strong>*</strong> and select <strong>Name: *</strong> from the autocomplete for getting all the entities.
-        </div>
-      </script>
-      <i class="glyphicon glyphicon-remove remove-icon" ng-if="tags.length > 0" ng-click="clearTags()"></i>
-
-    </div>
-    <div class="col-sm-4"></div>
-  </div>
-
-  <div class="col-sm-24 dashboardBox" ng-show="searchList.length > 0" id="dashboardBox">
-    <div class="row">
-      <div class="col-sm-24">
+<div ng-show="!hasClusters" class="no-entity">
+  <span>
+    No Cluster Entity Defined. Please contact your Administrator or perform the steps described in
+    <a target="_blank" href='https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.4.2/bk_data_governance/content/using_gui_to_define_data_pipelines.html'>
+    Falcon Documentation</a> to create a Cluster.
+  </span>
+</div>
+<div class="col-sm-24">
+  <div class="row searchResultContainer" ng-show="searchList.length > 0">
+    <div class="col-sm-offset-2 col-sm-20 dashboardBox">
         <entities-search-list input="searchList" entity-details="entityDetails" clone="cloneEntity" tags="tags"
                               remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity"
                               resume="resumeEntity" focus-search="focusSearch" pages="pages" go-page="goPage"/>
-      </div>
     </div>
   </div>
 
-</div>
\ No newline at end of file
+</div>
+
+<!--<div class="col-xs-24" ng-hide="searchList.length > 0">-->
+  <!--<div class="row" ng-controller="chartCtrl">-->
+    <!--<div class="col-xs-20 chartCol">-->
+      <!--<div class="chartMenuBox">-->
+        <!--<div class="entityBox">-->
+          <!--<h5> Entity </h5>-->
+          <!--<div class="entityTypeButtons">-->
+            <!--<button class="btn"-->
+                    <!--ng-click="chartOptions.entity = 'feed'; requestNewData()"-->
+                    <!--ng-class="{active: chartOptions.entity === 'feed'}">-->
+              <!--Feeds-->
+            <!--</button>-->
+            <!--<button class="btn"-->
+                    <!--ng-click="chartOptions.entity = 'process'; requestNewData()"-->
+                    <!--ng-class="{active: chartOptions.entity === 'process'}">-->
+              <!--Processes-->
+            <!--</button>-->
+            <!--<button class="btn"-->
+                    <!--ng-click="chartOptions.entity = 'dataset'; requestNewData()"-->
+                    <!--ng-class="{active: chartOptions.entity === 'dataset'}">-->
+              <!--Dataset-->
+            <!--</button>-->
+          <!--</div>-->
+        <!--</div>-->
+        <!--<div class="timeBox">-->
+          <!--<h5>Time</h5>-->
+          <!--<label>-->
+            <!--<input type="radio" ng-model="chartOptions.mode" value="hourly" ng-change="requestNewData()">-->
+            <!--24 Hs-->
+          <!--</label>-->
+          <!--<label>-->
+            <!--<input type="radio" ng-model="chartOptions.mode" value="daily" ng-change="requestNewData()">-->
+            <!--14 Days-->
+          <!--</label>-->
+        <!--</div>-->
+        <!--<div class="dayBox">-->
+          <!--<h5>Day</h5>-->
+          <!--<input type="text"-->
+                 <!--ng-change="requestNewData()"-->
+                 <!--class="form-control dateInput"-->
+                 <!--placeholder="mm/dd/yyyy"-->
+                 <!--datepicker-popup="{{dateFormat}}"-->
+                 <!--ng-model="chartOptions.day"-->
+                 <!--is-open="opened"-->
+                 <!--ng-click="openDatePicker($event)"-->
+                 <!--ng-required="true"-->
+                 <!--simple-date />-->
+          <!--<span class="entypo calendar dateInputIcon"-->
+                <!--ng-click="openDatePicker($event)">-->
+          <!--</span>-->
+        <!--</div>-->
+      <!--</div>-->
+      <!--<chart class="chart"-->
+             <!--input="graphData"-->
+             <!--t="30"-->
+             <!--mode="chartOptions.mode"-->
+             <!--ng-class="{daily: chartOptions.mode === 'daily'}"-->
+             <!--details="details">-->
+      <!--</chart>-->
+
+    <!--</div>-->
+    <!--<div class="col-xs-4 chartSideBar" ng-show="chartSidebarModel">-->
+
+      <!--<h3> {{ chartSidebarDate.firstLeg }} </h3>-->
+      <!--<h4> {{ chartSidebarDate.secondLeg }}-->
+        <!--<span ng-if="chartOptions.mode === 'hourly'"> {{ chartSidebarDate.timeLeg }} </span>-->
+      <!--</h4>-->
+
+      <!--<hr />-->
+
+      <!--<h5 class="text-success"> Succeed </h5>-->
+      <!--<table class="table">-->
+        <!--<tr ng-repeat="item in chartSidebarModel.topSuccessfulEntities | orderBy:'-numberOfSuccessfulEntities'">-->
+          <!--<td> {{item.name}} </td>-->
+          <!--<td><span> {{item.numberOfSuccessfulEntities}} </span></td>-->
+        <!--</tr>-->
+      <!--</table>-->
+
+      <!--<hr />-->
+
+      <!--<h5 class="text-danger"> Failed </h5>-->
+      <!--<table class="table">-->
+        <!--<tr ng-repeat="item in chartSidebarModel.topFailedEntities | orderBy:'-numberOfFailedEntities'">-->
+          <!--<td> {{item.name}} </td>-->
+          <!--<td><span> {{item.numberOfFailedEntities}} </span></td>-->
+        <!--</tr>-->
+      <!--</table>-->
+
+      <!--<hr />-->
+
+      <!--<h5> Data Copied </h5>-->
+      <!--<table class="table">-->
+        <!--<tr ng-repeat="item in chartSidebarModel.topDataCopiedEntities | orderBy:'-dataCopied'">-->
+          <!--<td> {{item.name}} </td>-->
+          <!--<td><span> {{item.dataCopied}} </span></td>-->
+        <!--</tr>-->
+      <!--</table>-->
+
+    <!--</div>-->
+
+  <!--</div>-->
+<!--</div>-->
+
diff --git a/falcon-ui/app/html/process/processFormAdvancedStepTpl.html b/falcon-ui/app/html/process/processFormAdvancedStepTpl.html
new file mode 100644
index 0000000..ce5119d
--- /dev/null
+++ b/falcon-ui/app/html/process/processFormAdvancedStepTpl.html
@@ -0,0 +1,183 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<form name="processForm" class="mt10" novalidate id="processFormAdvancedStep">
+  <div class="col-xs-24"><label>Retry Policy</label></div>
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-4 plr0px">
+      <div class="col-xs-24">
+        <label class="light" tooltip="process.properties.retryPolicy" tooltip-position="up">
+          Type
+        </label>
+      </div>
+      <div class="col-xs-24">
+        <select ng-model="process.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}" ng-change="policyChange()">
+          <option value="" disabled selected style='display:none;'>-Select policy-</option>
+          <option value="periodic">Periodic</option>
+          <option value="exp-backoff">Exponential Backup</option>
+          <option value="final">None</option>
+        </select>
+      </div>
+    </div>
+    <div class="col-xs-offset-1 col-xs-5 plr0px">
+      <div class="col-xs-24">
+        <label class="light">Delay Up to</label>
+      </div>
+      <div class="col-xs-24 inlineInputsGroup">
+        <input type="text" class="form-control"
+               ng-model="process.retry.delay.quantity" validation-message="{{validations.messages.number}}"
+               id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)"
+               ng-disabled = "process.retry.policy === 'final'"
+               ng-required="true"
+               ng-pattern="validations.patterns.twoDigits"/>
+
+        <select ng-model="process.retry.delay.unit" ng-required="true" ng-disabled = "process.retry.policy === 'final'" validation-message="{{validations.messages.option}}">
+          <option value="" disabled selected style='display:none;'>-Select delay-</option>
+          <option value="minutes">minutes</option>
+          <option value="hours">hours</option>
+          <option value="days">days</option>
+          <option value="months">months</option>
+        </select>
+      </div>
+    </div>
+    <div class="col-xs-4 plr0px">
+      <div class="col-xs-24">
+        <label class="light">Attempts</label>
+      </div>
+      <div class="col-xs-24">
+        <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
+               ng-model="process.retry.attempts" ng-keydown="validations.acceptOnlyNumber($event)"
+               id="attemptsField"
+               ng-required="true"
+               ng-disabled = "process.retry.policy === 'final'"
+               ng-pattern="validations.patterns.twoDigits"/>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-xs-24"><label>Performance & Ordering</label></div>
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-4 plr0px">
+      <div class="col-xs-24">
+        <label class="light">Max Parallel Instances</label>
+      </div>
+      <div class="col-xs-24">
+        <select ng-model="process.parallel" ng-required="true">
+          <option ng-repeat="value in [1,2,3,4,5,6,7,8,9,10,11,12] track by $index">{{value}}</option>
+        </select>
+      </div>
+    </div>
+    <div class="col-xs-offset-1 col-xs-4 plr0px">
+      <div class="col-xs-24">
+        <label class="light" tooltip="process.properties.order">Order</label>
+      </div>
+      <div class="col-xs-24">
+        <select ng-model="process.order" ng-required="true" validation-message="{{validations.messages.option}}">
+          <option value="" disabled selected style='display:none;'>-Select order-</option>
+          <option ng-repeat="value in ['FIFO', 'LIFO', 'LAST_ONLY'] track by $index">{{value}}</option>
+        </select>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-xs-24">
+    <label>Properties</label>
+  </div>
+  <div ng-repeat="property in process.properties track by $index" class="col-xs-24 plr0px">
+      <div class="col-xs-6 dynamic-table-spacer">
+        <input type="text" class="form-control" ng-model="property.name"
+               ng-pattern="validations.patterns.propertyName"
+               validation-optional-message="{{validations.messages.name}}"
+               ng-disabled="xmlPreview.edit"
+               ng-required="property.value" placeholder="name" />
+      </div>
+      <div class="col-xs-6 dynamic-table-spacer">
+        <input type="text" class="form-control" ng-model="property.value"
+               validation-optional-message="{{validations.messages.value}}"
+               ng-disabled="xmlPreview.edit"
+               ng-required="property.name" placeholder="value" />
+      </div>
+      <div class="dynamic-table-spacer">
+        <button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)" ng-if="!$first || !$last"
+             ng-disabled="xmlPreview.edit">
+          <span class="entypo minus"></span> delete
+        </button>
+        <button type="button" class="btn btn-default btn-xs" ng-click="addProperty()"
+            ng-disabled="xmlPreview.edit" ng-if="$last">
+            <span class="entypo plus"></span> ADD
+        </button>
+      </div>
+  </div>
+
+
+  <div class="col-xs-24"><label class="mt15">Access Control List</label></div>
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-4">
+        <label class="light">Owner<mandatory-field></mandatory-field></label>
+        <input type="text"
+               name="aclOwnerInput"
+               ng-model="process.ACL.owner"
+               ng-pattern="validations.patterns.unixId"
+               ng-required="true"
+               class="form-control"
+               validation-message="{{validations.messages.acl.owner}}"/>
+    </div>
+    <div class="col-xs-4">
+        <label class="light">Group<mandatory-field></mandatory-field></label>
+        <input type="text"
+               name="aclGroupInput"
+               ng-model="process.ACL.group"
+               ng-pattern="validations.patterns.unixId"
+               ng-required="true"
+               class="form-control"
+               validation-message="{{validations.messages.acl.group}}" />
+    </div>
+    <div class="col-xs-24">
+      <div class="col-xs-8 plr0px">
+        <label class="light">Permissions<mandatory-field></mandatory-field></label>
+        <acl-permissions acl-model="process.ACL.permission"></acl-permissions>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-xs-24 pb15px mt35">
+    <button class="btn prevBtn" type="button"
+         ng-click="goBack()"
+         ng-disabled="buttonSpinners.backShow">
+      PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
+      </a>
+      <button id="nextButton" class="btn nextBtn"
+           ng-disabled="buttonSpinners.show"
+           ng-click="goNext(processForm.$invalid)" scroll-to-error>
+        NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+      <button class="btn advancedSaveBtn"
+           ng-disabled="processForm.$invalid || buttonSpinners.saveShow"
+           ng-click="saveEntity()" scroll-to-error>
+        SAVE ADVANCED OPTIONS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
+      </button>
+    </div>
+  </div>
+
+</form>
diff --git a/falcon-ui/app/html/process/processFormClustersStepTpl.html b/falcon-ui/app/html/process/processFormClustersStepTpl.html
index 21bf4bf..8f58504 100644
--- a/falcon-ui/app/html/process/processFormClustersStepTpl.html
+++ b/falcon-ui/app/html/process/processFormClustersStepTpl.html
@@ -17,95 +17,91 @@
  * limitations under the License.
  */
 -->
-<form name="processForm" class="mt10" novalidate id="processFormClusterStep">
-  <div class="col-xs-offset-1 col-xs-22">
+<form name="processForm" novalidate>
+  <div class="col-xs-24">
     <div ng-repeat="cluster in process.clusters" class="row">
       <div class="col-xs-24 detailsBox processCluster">
-
-        <h5>Cluster</h5>
-        <div class="row">
-          <div class="col-xs-24">
-            <label class="light">Name</label>
-            <select ng-model="cluster.name" ng-class="{firstSelectClusterStep: $index === 0}"
+        <div class="col-xs-24"><label class="mt15" tooltip="process.cluster">CLUSTER</label></div>
+        <div class="col-xs-24">
+          <label class="light">Cluster Name<mandatory-field></mandatory-field></label>
+          <select ng-model="cluster.name" ng-class="{firstSelectClusterStep: $index === 0}"
                     ng-required="true"
                     class="form-control padding0"
                     validation-message="{{validations.messages.cluster}}">
-              <option value="" disabled selected style='display:none;'>-Select cluster-</option>
-              <option ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
-            </select>
-          </div>
+            <option value="" disabled selected style='display:none;'>-Select cluster-</option>
+            <option ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
+          </select>
         </div>
-        <div class="clearfix"></div>
 
-        <label class="col-xs-24"> Validity </label>
-        <div class="col-xs-24 validityBox">
-          <div class="startDateBox">
-            <label>Start
+        <div class="col-xs-24"><label class="mt15">VALIDITY</label></div>
+        <div class="col-xs-24"><label class="mt15 light">Time Zone : <span>{{process.timezone}}</span></label></div>
+        <div class="col-xs-24 validityBox plr0px">
+          <div class="col-xs-24 plr0px">
+            <div class="col-xs-4 startDateBox">
+              <label class="light">Start<mandatory-field></mandatory-field></label>
               <input type="text"
                      name="startDateInput"
                      class="form-control dateInput"
-                     placeholder="mm/dd/yyyy"
+                     placeholder="{{dateFormat | lowercase}}"
                      datepicker-popup="{{dateFormat}}"
                      ng-model="cluster.validity.start.date"
                      is-open="cluster.validity.start.opened"
                      ng-click="openDatePicker($event, cluster.validity.start)"
+                     ng-change="constructDate()"
                      ng-required="true"
                      simple-date>
-            </label>
-            <label class="col-xs-24 custom-danger validationMessageGral"
-                   ng-if="!cluster.validity.start.date">
-              {{validations.messages.date.empty}}
-            </label>
-          </div>
-          <div class="startTimeBox">
-            <label>Time
-              <timepicker
+
+            </div>
+            <div class="col-xs-6 startTimeBox">
+              <label class="light">Time<mandatory-field></mandatory-field></label>
+              <timepicker ng-change="constructDate()"
                           ng-model="cluster.validity.start.time"
                           hour-step="1"
                           minute-step="1"
                           show-meridian="true">
               </timepicker>
-            </label>
+            </div>
           </div>
-          <div class="endDateBox">
-            <label>End
+          <label class="col-xs-24 custom-danger validationMessageGral"
+                 ng-if="!cluster.validity.start.date">
+            {{validations.messages.date.empty}}
+          </label>
+          <div class="col-xs-24 plr0px">
+            <div class="col-xs-4 endDateBox">
+              <label class="light">End<mandatory-field></mandatory-field></label>
               <input type="text"
                      name="endDateInput"
                      class="form-control dateInput"
-                     placeholder="mm/dd/yyyy"
+                     placeholder="{{dateFormat | lowercase}}"
                      datepicker-popup="{{dateFormat}}"
                      ng-model="cluster.validity.end.date"
                      is-open="cluster.validity.end.opened"
                      ng-click="openDatePicker($event, cluster.validity.end)"
+                     ng-change="constructDate()"
                      ng-required="true"
                      min-date="cluster.validity.start.date"
                      simple-date>
-            </label>
-            <label class="col-xs-24 custom-danger validationMessageGral"
-                   ng-if="!cluster.validity.end.date">
-              {{validations.messages.date.empty}}
-            </label>
-          </div>
-          <div class="endTimeBox">
-            <label>Time
-              <timepicker
+            </div>
+            <div class="col-xs-6 endTimeBox">
+              <label class="light">Time<mandatory-field></mandatory-field></label>
+              <timepicker ng-change="constructDate()"
                           ng-model="cluster.validity.end.time"
                           hour-step="1"
                           minute-step="1"
                           show-meridian="true">
               </timepicker>
-            </label>
+            </div>
           </div>
-
-          <div class="col-xs-24 mt10">
+          <label class="col-xs-24 custom-danger validationMessageGral"
+                 ng-if="!cluster.validity.end.date">
+            {{validations.messages.date.empty}}
+          </label>
+        </div>
+        <div class="col-xs-24 mt10">
             <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)" ng-if="!$first">
               <span class="entypo minus"></span> delete
             </button>
-          </div>
         </div>
-
-
-
       </div>
     </div>
   </div>
@@ -114,20 +110,23 @@
       <span class="entypo plus"></span> add cluster
     </button>
   </div>
-  <div class="col-xs-24 mt20">
+
+  <div class="col-xs-24 pb15px mt35">
     <button class="btn prevBtn" type="button"
-         ng-click="goBack('forms.process.properties')"
+         ng-click="goBack()"
          ng-disabled="buttonSpinners.backShow">
-      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+      PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
     </button>
-    <button class="btn nextBtn pull-right"
-         ng-disabled="buttonSpinners.show"
-            ng-click="goNext(processForm.$invalid, 'forms.process.io')" >
-      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
-    </a>
+    <div class="pull-right">
+        <a class="btn cnclBtn" ui-sref="main">
+            CANCEL
+        </a>
+        <button class="btn nextBtn"
+             ng-disabled="buttonSpinners.show"
+             ng-click="goNext(processForm.$invalid)" scroll-to-error>
+          NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+        </button>
+    </div>
   </div>
 
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/process/processFormGeneralStepTpl.html b/falcon-ui/app/html/process/processFormGeneralStepTpl.html
index cc21854..6665bb7 100644
--- a/falcon-ui/app/html/process/processFormGeneralStepTpl.html
+++ b/falcon-ui/app/html/process/processFormGeneralStepTpl.html
@@ -19,152 +19,522 @@
 -->
 <form name="processForm" class="mt10" novalidate id="processFormGeneralStep">
 
-    <div class="col-xs-24">
-      <label class="light">Name</label>
-      <input type="text" class="form-control" ng-keydown="validations.acceptNoSpaces($event)"
-             check-name="{type:'process', check:cloningMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
-             ng-disabled="!cloningMode" id="entityNameField" ng-model="process.name"
-             ng-required="true" ng-maxlength="100" ng-pattern="validations.patterns.name"/>
-    </div>
+  <div class="col-xs-24">
+    <label class="light" tooltip="process.name">Process Name<mandatory-field></mandatory-field></label>
+  </div>
 
-    <div class="col-xs-24">
-      <label class="light">Tags</label>
-    </div>
+  <div class="col-xs-6">
+    <input type="text" class="form-control" ng-keydown="validations.acceptNoSpaces($event)"
+           check-name="{type:'process', check:!editingMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
+           ng-disabled="editingMode" id="entityNameField" ng-model="process.name"
+           ng-required="true" ng-maxlength="100" ng-pattern="validations.patterns.name"/>
+  </div>
 
-    <div id="tagsSection" class="col-xs-24">
-      <div ng-repeat="tag in process.tags">
-        <div class="row dynamic-table-spacer">
-          <div class="col-xs-10">
-            <input type="text" class="form-control" ng-model="tag.key" placeholder="key"
-                   validation-optional-message="{{validations.messages.key}}"
-                   ng-pattern="validations.patterns.alpha" ng-required="tag.value"/>
-          </div>
-          <div class="col-xs-11">
-            <input type="text" class="form-control" placeholder="value"
-                   validation-optional-message="{{validations.messages.value}}"
-                   ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key"/>
-          </div>
-          <div class="col-xs-3">
-            <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0">
-              <span class="entypo minus"></span> delete
-            </button>
-          </div>
+  <div class="col-xs-24">
+    <label class="light">Tags</label>
+  </div>
+
+  <div id="tagsSection" class="col-xs-12">
+    <div ng-repeat="tag in process.tags track by $index">
+      <div class="row dynamic-table-spacer">
+        <div class="col-xs-8">
+          <input type="text" class="form-control" ng-model="tag.key" placeholder="key"
+                 validation-optional-message="{{validations.messages.key}}"
+                 ng-pattern="validations.patterns.alpha" ng-required="tag.value"/>
+        </div>
+        <div class="col-xs-8">
+          <input type="text" class="form-control" ng-model="tag.value" placeholder="value"
+                 validation-optional-message="{{validations.messages.value}}"
+                 ng-pattern="validations.patterns.alpha" ng-required="tag.key"/>
+        </div>
+        <div class="col-xs-8">
+          <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="!$first || !$last">
+            <span class="entypo minus"></span> delete
+          </button>
+          <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-if="$last">
+            <span class="entypo plus"></span> ADD
+          </button>
         </div>
       </div>
     </div>
-    <div class="col-xs-24 mt10 mb10">
-      <button type="button" class="btn btn-default btn-xs" ng-click="addTag()">
-        <span class="entypo plus"></span> add tag
+  </div>
+
+  <div class="col-xs-24">
+    <label>Details</label>
+  </div>
+
+  <div class="col-xs-5 plr0px">
+    <div class="col-xs-24">
+      <label class="light" tooltip="process.workflow.engine">Engine<mandatory-field></mandatory-field></label>
+      <select ng-model="process.workflow.engine"
+              class="form-control padding0"
+              ng-required="true"
+              validation-message="{{validations.messages.engine}}">
+        <option value="" disabled selected style='display:none;'>-Select engine-</option>
+        <option value="spark">Spark</option>
+        <option value="oozie">Oozie</option>
+        <option value="pig">Pig</option>
+        <option value="hive">Hive</option>
+      </select>
+    </div>
+
+    <div class="col-xs-24" ng-show="process.workflow.engine !== 'spark'">
+      <label class="light" tooltip="process.workflow.name">Workflow Name<mandatory-field></mandatory-field></label>
+      <input type="text" class="form-control"
+             id="workflowNameField"
+             ng-model="process.workflow.name"
+             ng-required="process.workflow.engine !== 'spark'"
+             ng-maxlength="100"
+             ng-pattern="validations.patterns.workflowName"
+             validation-optional-message="{{validations.messages.name}}" />
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light" tooltip="process.workflow.path">Workflow Path<mandatory-field></mandatory-field></label>
+      <input type="text" class="form-control"
+             id="pathField"
+             ng-model="process.workflow.path"
+             ng-required="true"
+             ng-maxlength="200"
+             validation-message="{{validations.messages.path}}"
+             ng-pattern="validations.patterns.path"/>
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light">Cluster<mandatory-field></mandatory-field></label>
+      <div ng-repeat="cluster in process.clusters track by $index">
+        <select ng-model="cluster.name"
+                  ng-required="true"
+                  ng-change="getSourceDefinition(cluster.name)"
+                  class="form-control padding0"
+                  validation-message="{{validations.messages.cluster}}">
+          <option value="" disabled selected style='display:none;'>-Select cluster-</option>
+          <option ng-repeat="clusterItem in clusterList track by $index">{{clusterItem.name}}</option>
+        </select>
+      </div>
+    </div>
+  </div>
+  <div class="col-xs-offset-1 col-xs-6 plr0px" ng-show="process.workflow.engine==='spark'">
+    <div class="col-xs-24">
+      <label class="light" tooltip="process.workflow.spark.name">Name<mandatory-field></mandatory-field></label>
+      <input type="text" class="form-control"
+             ng-model="process.workflow.spark.name"
+             ng-required="process.workflow.engine==='spark'"
+             ng-maxlength="100"
+             ng-pattern="validations.patterns.name"
+             validation-optional-message="{{validations.messages.name}}" />
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light" tooltip="process.workflow.spark.application">Application<mandatory-field></mandatory-field></label>
+      <input type="text" class="form-control"
+             ng-model="process.workflow.spark.jar"
+             ng-required="process.workflow.engine==='spark'" />
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light" tooltip="process.workflow.spark.class">Main Class</label>
+      <input type="text" class="form-control"
+             ng-model="process.workflow.spark.class"
+             ng-required="process.workflow.engine==='spark' && !isPython" ng-disabled='isPython'/>
+    </div>
+
+    <div class="col-xs-12">
+      <label class="light" tooltip="process.workflow.spark.master">Runs On</label>
+      <select ng-model="process.workflow.spark.master"
+                class="form-control padding0"
+                ng-required="process.workflow.engine==='spark'">
+        <option value="" disabled selected style='display:none;'>-Select Runs On-</option>
+        <option value="yarn">Yarn</option>
+        <option value="local">Local</option>
+      </select>
+    </div>
+
+    <div class="col-xs-12 plr0px" ng-if="process.workflow.spark.master === 'yarn'">
+      <div class="col-xs-24">
+        <label class="light" tooltip="process.workflow.spark.mode">Mode<mandatory-field></mandatory-field></label>
+      </div>
+      <div class="col-xs-24 pt3px">
+          <input type="radio" name="sparkMode" value="cluster" ng-model="process.workflow.spark.mode" />
+          Cluster
+          <input type="radio" name="sparkMode" value="client" ng-model="process.workflow.spark.mode" />
+          Client
+      </div>
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light">Spark Options</label>
+      <input type="text" class="form-control" ng-model="process.workflow.spark.sparkOptions"/>
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light">Spark Arguments</label>
+      <input type="text" class="form-control" ng-model="process.workflow.spark.arg"/>
+    </div>
+  </div>
+
+  <div class="col-xs-offset-1 col-xs-5 plr0px">
+    <div><label>INPUT(S)</label></div>
+
+    <div ng-repeat="input in process.inputs track by $index">
+      <div class="col-xs-24 detailsBox processCluster">
+        <div class="row">
+          <div class="col-xs-24">
+            <label class="light">Name<mandatory-field></mandatory-field></label>
+            <input type="text" class="form-control"
+                   ng-class="{firstInput: $index === 0}"
+                   validation-message="{{validations.messages.name}}"
+                   ng-model="input.name"
+                   ng-required="true"
+                   ng-maxlength="39"
+                   ng-pattern="validations.patterns.inputName"/>
+          </div>
+        </div>
+
+        <div class="row">
+          <div class="col-xs-24">
+            <label class="light">Feed<mandatory-field></mandatory-field></label>
+            <select ng-model="input.feed" ng-required="true" class="col-sm-24 form-control padding0"
+                    validation-message="{{validations.messages.feed}}">
+              <option value="" disabled selected style='display:none;'>-Select feed-</option>
+              <option ng-repeat="feedItem in feedsList track by $index">{{feedItem.name}}</option>
+            </select>
+          </div>
+        </div>
+
+        <div><label>INSTANCE</label></div>
+        <div class="row">
+          <div class="col-xs-12">
+            <label class="light">Start<mandatory-field></mandatory-field></label>
+            <input type="text" class="form-control" validation-message="{{validations.messages.value}}"
+                   ng-model="input.start"
+                   ng-required="true"
+                   ng-maxlength="39"/>
+          </div>
+          <div class="col-xs-12">
+            <label class="light">End<mandatory-field></mandatory-field></label>
+            <input type="text" class="form-control {{invalidEndDate}}" validation-message="{{validations.messages.value}}"
+                   ng-model="input.end"
+                   ng-required="true"
+                   ng-maxlength="100"
+                   on-blur="validateStartEndDate"/>
+            <label ng-show="invalidEndDate" class="custom-danger nameValidationMessage">End should be equal or greater than Start</label>
+          </div>
+        </div>
+        <div class="col-xs-24 mt10">
+            <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeInput($index)">
+              <span class="entypo minus"></span> delete
+            </button>
+        </div>
+      </div>
+    </div>
+
+    <button type="button" class="btn btn-default btn-xs mt10 mb10 addInputButton" ng-click="addInput()">
+      <span class="entypo plus"></span> ADD
+    </button>
+  </div>
+
+  <div class="col-xs-offset-1 col-xs-5 plr0px">
+    <div><label>OUTPUT(S)</label></div>
+    <div ng-repeat="output in process.outputs track by $index">
+      <div class="col-xs-24 detailsBox processCluster">
+        <div class="row">
+          <div class="col-xs-24">
+            <label class="light">Name<mandatory-field></mandatory-field></label>
+            <input type="text"
+                   ng-class="{firstOutput: $index === 0}"
+                   class="form-control"
+                   validation-message="{{validations.messages.name}}"
+                   ng-model="output.name"
+                   ng-required="true"
+                   ng-maxlength="39"
+                   ng-pattern="validations.patterns.id"/>
+          </div>
+        </div>
+        <div class="row">
+          <div class="col-xs-24">
+            <label class="light">Feed<mandatory-field></mandatory-field></label>
+            <select ng-model="output.feed" ng-required="true" class="col-sm-24 form-control padding0"
+                    validation-message="{{validations.messages.feed}}" >
+              <option value="" disabled selected style='display:none;'>-Select feed-</option>
+              <option ng-repeat="feedItem in feedsList track by $index">{{feedItem.name}}</option>
+            </select>
+          </div>
+        </div>
+        <div><label class="mt15">INSTANCE</label></div>
+        <div class="row">
+          <div class="col-xs-24">
+            <label class="light">Instance<mandatory-field></mandatory-field></label>
+            <input type="text" class="form-control" validation-message="{{validations.messages.value}}"
+                   ng-model="output.outputInstance" ng-required="true" ng-maxlength="39"/>
+          </div>
+        </div>
+        <div class="row mt10">
+          <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeOutput($index)">
+            <span class="entypo minus"></span> delete
+          </button>
+        </div>
+      </div>
+    </div>
+
+    <button type="button" class="btn btn-default btn-xs mb10 mt10" ng-click="addOutput()">
+      <span class="entypo plus"></span> ADD
+    </button>
+  </div>
+
+  <div class="col-xs-24">
+    <label>Run Duration<mandatory-field></mandatory-field></label>
+  </div>
+  <div class="col-xs-24" ng-repeat="cluster in process.clusters track by $index" class="validityBox">
+    <div class="col-xs-24 plr0px validityBox">
+      <div class="col-xs-24 plr0px">
+        <label class="light">Start</label>
+      </div>
+      <div class="plr0px col-xs-2 startDateBox">
+        <input type="text"
+          name="startDateInput"
+          class="form-control dateInput"
+          placeholder="{{dateFormat | lowercase}}"
+          ng-model="cluster.validity.start.date"
+          simple-date-picker />
+      </div>
+      <div class="col-xs-3 startTimeBox">
+        <timepicker ng-change="constructDate()"
+                    ng-model="cluster.validity.start.time"
+                    hour-step="1"
+                    minute-step="1"
+                    show-meridian="true">
+        </timepicker>
+      </div>
+      <label class="col-xs-24 custom-danger validationMessageGral"
+             ng-if="!cluster.validity.start.date">
+        {{validations.messages.date.empty}}
+      </label>
+    </div>
+    <div class="col-xs-24 plr0px validityBox">
+      <div class="col-xs-24 plr0px">
+        <label class="light">End</label>
+      </div>
+      <div class="plr0px col-xs-2 endDateBox">
+        <input type="text"
+          name="startDateInput"
+          class="form-control dateInput"
+          placeholder="{{dateFormat | lowercase}}"
+          ng-model="cluster.validity.end.date"
+          simple-date-picker />
+      </div>
+      <div class="col-xs-3 endTimeBox">
+        <timepicker ng-change="constructDate()"
+                    ng-model="cluster.validity.end.time"
+                    hour-step="1"
+                    minute-step="1"
+                    show-meridian="true">
+        </timepicker>
+      </div>
+      <label class="col-xs-24 custom-danger validationMessageGral"
+             ng-if="!cluster.validity.end.date">
+        {{validations.messages.date.empty}}
+      </label>
+    </div>
+  </div>
+
+  <div class="col-xs-24">
+    <label>Frequency</label>
+  </div>
+
+  <div class="col-xs-12 plr0px">
+    <div class="col-xs-24">
+      <label class="light">Repeat Every<mandatory-field></mandatory-field></label>
+    </div>
+    <div class="col-xs-24 inlineInputsGroup">
+      <input type="text" class="form-control" validation-message="{{validations.messages.number}}" name="frequencyQuantity"
+             ng-model="process.frequency.quantity" ng-keydown="validations.acceptOnlyNumber($event)"
+             ng-keyup="checkMininumFrequency(process.frequency.quantity,process.frequency.unit, processForm.frequencyQuantity)"
+             id="frequencyQuantity"
+             ng-required="true"
+             ng-pattern="validations.patterns.twoDigits"/>
+
+      <select ng-model="process.frequency.unit" ng-required="true"
+        ng-change="checkMininumFrequency(process.frequency.quantity,process.frequency.unit, processForm.frequencyQuantity)"
+        validation-message="{{validations.messages.number}}">
+        <option selected value="minutes">minutes</option>
+        <option value="hours">hours</option>
+        <option value="days">days</option>
+        <option value="months">months</option>
+      </select>
+      <div class="col-xs-24 custom-danger" ng-if="!isFrequencyValid">{{validations.messages.frequency.minimum}}</div>
+    </div>
+    <div class="col-xs-24">
+      <label class="light" tooltip="process.properties.timezone">Timezone<mandatory-field></mandatory-field></label>
+    </div>
+    <div class="col-xs-18">
+      <time-zone-select ng-model="process.timezone" id="timeZoneSelect" required="true">
+      </time-zone-select>
+    </div>
+  </div>
+
+  <div class="col-xs-24 advancedOption" ng-click="expandOptions = !expandOptions" id="processAdvancedOption">
+    <label class="mt15 pointer blink-success">ADVANCED OPTIONS</label>
+    <i class="glyphicon glyphicon-chevron-down mt15" ng-if="!expandOptions"></i>
+    <i class="glyphicon glyphicon-chevron-up mt15" ng-if="expandOptions"></i>
+  </div>
+
+	<div id="advancedOptionsBox" class="col-xs-24 plr0px" ng-class="{expanded:expandOptions}">
+    <div class="col-xs-24"><label>Retry Policy</label></div>
+    <div class="col-xs-24 plr0px">
+      <div class="col-xs-4 plr0px">
+        <div class="col-xs-24">
+          <label class="light" tooltip="process.properties.retryPolicy" tooltip-position="up">
+            Type
+          </label>
+        </div>
+        <div class="col-xs-24">
+          <select ng-model="process.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}" ng-change="policyChange()">
+            <option value="" disabled selected style='display:none;'>-Select policy-</option>
+            <option value="periodic">Periodic</option>
+            <option value="exp-backoff">Exponential Backup</option>
+            <option value="final">None</option>
+          </select>
+        </div>
+      </div>
+      <div class="col-xs-offset-1 col-xs-5 plr0px">
+        <div class="col-xs-24">
+          <label class="light">Delay Up to</label>
+        </div>
+        <div class="col-xs-24 inlineInputsGroup">
+          <input type="text" class="form-control"
+                 ng-model="process.retry.delay.quantity" validation-message="{{validations.messages.number}}"
+                 id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)"
+                 ng-disabled = "process.retry.policy === 'final'"
+                 ng-required="true"
+                 ng-pattern="validations.patterns.twoDigits"/>
+
+          <select ng-model="process.retry.delay.unit" ng-required="true" ng-disabled = "process.retry.policy === 'final'" validation-message="{{validations.messages.option}}">
+            <option value="" disabled selected style='display:none;'>-Select delay-</option>
+            <option value="minutes">minutes</option>
+            <option value="hours">hours</option>
+            <option value="days">days</option>
+            <option value="months">months</option>
+          </select>
+        </div>
+      </div>
+      <div class="col-xs-4 plr0px">
+        <div class="col-xs-24">
+          <label class="light">Attempts</label>
+        </div>
+        <div class="col-xs-24">
+          <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
+                 ng-model="process.retry.attempts" ng-keydown="validations.acceptOnlyNumber($event)"
+                 id="attemptsField"
+                 ng-required="true"
+                 ng-disabled = "process.retry.policy === 'final'"
+                 ng-pattern="validations.patterns.twoDigits"/>
+        </div>
+      </div>
+    </div>
+
+    <div class="col-xs-24"><label>Performance & Ordering</label></div>
+    <div class="col-xs-24 plr0px">
+      <div class="col-xs-4 plr0px">
+        <div class="col-xs-24">
+          <label class="light">Max Parallel Instances</label>
+        </div>
+        <div class="col-xs-24">
+          <select ng-model="process.parallel" ng-required="true">
+            <option ng-repeat="value in [1,2,3,4,5,6,7,8,9,10,11,12] track by $index">{{value}}</option>
+          </select>
+        </div>
+      </div>
+      <div class="col-xs-offset-1 col-xs-4 plr0px">
+        <div class="col-xs-24">
+          <label class="light" tooltip="process.properties.order">Order</label>
+        </div>
+        <div class="col-xs-24">
+          <select ng-model="process.order" ng-required="true" validation-message="{{validations.messages.option}}">
+            <option value="" disabled selected style='display:none;'>-Select order-</option>
+            <option ng-repeat="value in ['FIFO', 'LIFO', 'LAST_ONLY'] track by $index">{{value}}</option>
+          </select>
+        </div>
+      </div>
+    </div>
+
+    <div class="col-xs-24">
+      <label>Properties</label>
+    </div>
+    <div ng-repeat="property in process.properties track by $index" class="col-xs-24 plr0px">
+        <div class="col-xs-6 dynamic-table-spacer">
+          <input type="text" class="form-control" ng-model="property.name"
+                 ng-pattern="validations.patterns.propertyName"
+                 validation-optional-message="{{validations.messages.name}}"
+                 ng-disabled="xmlPreview.edit"
+                 ng-required="property.value" placeholder="name" />
+        </div>
+        <div class="col-xs-6 dynamic-table-spacer">
+          <input type="text" class="form-control" ng-model="property.value"
+                 validation-optional-message="{{validations.messages.value}}"
+                 ng-disabled="xmlPreview.edit"
+                 ng-required="property.name" placeholder="value" />
+        </div>
+        <div class="dynamic-table-spacer">
+          <button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)" ng-if="!$first || !$last"
+               ng-disabled="xmlPreview.edit">
+            <span class="entypo minus"></span> delete
+          </button>
+          <button type="button" class="btn btn-default btn-xs" ng-click="addProperty()"
+              ng-disabled="xmlPreview.edit" ng-if="$last">
+              <span class="entypo plus"></span> ADD
+          </button>
+        </div>
+    </div>
+
+
+    <div class="col-xs-24"><label class="mt15">Access Control List</label></div>
+    <div class="col-xs-24 plr0px">
+      <div class="col-xs-4">
+          <label class="light">Owner<mandatory-field></mandatory-field></label>
+          <input type="text"
+                 name="aclOwnerInput"
+                 ng-model="process.ACL.owner"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-required="true"
+                 class="form-control"
+                 validation-message="{{validations.messages.acl.owner}}"/>
+      </div>
+      <div class="col-xs-4">
+          <label class="light">Group<mandatory-field></mandatory-field></label>
+          <input type="text"
+                 name="aclGroupInput"
+                 ng-model="process.ACL.group"
+                 ng-pattern="validations.patterns.unixId"
+                 ng-required="true"
+                 class="form-control"
+                 validation-message="{{validations.messages.acl.group}}" />
+      </div>
+      <div class="col-xs-24">
+        <div class="col-xs-8 plr0px">
+          <label class="light">Permissions<mandatory-field></mandatory-field></label>
+          <acl-permissions acl-model="process.ACL.permission"></acl-permissions>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-xs-24 pb15px mt35">
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
+      </a>
+      <button id="nextButton" class="btn nextBtn"
+           ng-disabled="buttonSpinners.show"
+           ng-click="goNext(processForm.$invalid)" scroll-to-error>
+        NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+      <button class="btn nextBtn"
+           ng-disabled="processForm.$invalid || buttonSpinners.saveShow"
+           ng-click="saveEntity(processForm.$invalid)" scroll-to-error>
+        SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
       </button>
     </div>
-
-  <h4 class="col-xs-24">Workflow</h4>
-
-  <div class="col-xs-24">
-    <div class="light">Name</div>
-    <input type="text" class="form-control" validation-optional-message="{{validations.messages.name}}"
-           id="workflowNameField"
-           ng-model="process.workflow.name"
-           ng-maxlength="100"
-           ng-pattern="validations.patterns.name"/>
   </div>
 
-  <div id="engineSection" class="col-xs-24">
-    <label class="light">Engine</label>
-    <div class="row">
-      <div class="col-xs-4">
-        <input
-                type="radio" id="oozieEngineRadio"
-                ng-change="selectWorkflow()"
-                ng-model="process.workflow.engine"
-                value="oozie" /> Oozie
-      </div>
-      <div class="col-xs-4">
-        <input type="radio" id="pigEngineRadio"
-               ng-change="selectWorkflow()"
-               ng-model="process.workflow.engine"
-               value="pig" /> Pig
-      </div>
-      <div class="col-xs-4">
-        <input type="radio" id="hiveEngineRadio"
-               ng-change="selectWorkflow()"
-               ng-model="process.workflow.engine"
-               value="hive" /> Hive
-      </div>
-
-      <select id="engineVersionField"
-              ng-model="process.workflow.version"
-              ng-show="process.workflow.engine">
-
-        <option value="" disabled selected style='display:none;'>-Select {{process.workflow.engine}} version-</option>
-
-        <option ng-repeat="version in versions"
-          id="{{process.workflow.engine}}Version{{$index}}"
-          value="{{version}}"
-          ng-selected="process.workflow.version === version">
-          {{version}}
-        </option>
-      </select>
-
-    </div>
-  </div>
-  <div class="col-xs-24">
-    <label class="light">Path</label>
-    <input type="text" class="form-control"
-           id="pathField"
-           ng-model="process.workflow.path"
-           ng-required="true"
-           ng-maxlength="200"
-           validation-optional-message="{{validations.messages.path}}"
-           ng-pattern="validations.patterns.osPath"/>
-  </div>
-
-  <div class="aclBox col-xs-24">
-    <h4>Access Control List</h4>
-    <div>
-      <label>Owner
-        <input type="text"
-               name="aclOwnerInput"
-               ng-model="process.ACL.owner"
-               ng-pattern="validations.patterns.unixId"
-               ng-required="true"
-               class="form-control"
-               validation-message="{{validations.messages.acl.owner}}"/>
-      </label>
-    </div>
-    <div>
-      <label>Group
-        <input type="text"
-               name="aclGroupInput"
-               ng-model="process.ACL.group"
-               ng-pattern="validations.patterns.unixId"
-               ng-required="true"
-               class="form-control"
-               validation-message="{{validations.messages.acl.group}}" />
-      </label>
-    </div>
-    <div>
-      <label>Permissions
-        <input type="text"
-               name="aclPermissionsInput"
-               ng-model="process.ACL.permission"
-               ng-pattern="validations.patterns.unixPermissions"
-               ng-required="true"
-               class="form-control"
-               validation-message="{{validations.messages.acl.permission}}" />
-      </label>
-    </div>
-  </div>
-
-  <div class="col-xs-24 mt20">
-    <button id="nextButton" class="btn nextBtn pull-right"
-         ng-disabled="buttonSpinners.show"
-         ng-click="goNext(processForm.$invalid, 'forms.process.properties')" >
-      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
-    </a>
-  </div>
-
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html b/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html
index 528ce14..09b4aa2 100644
--- a/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html
+++ b/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html
@@ -17,31 +17,33 @@
  * limitations under the License.
  */
 -->
-<form name="processForm" novalidate id="processFormInOutStep">
-  <div class="col-sm-offset-1 col-sm-22">
-    <h4 ng-if="process.inputs.length === 0">Inputs</h4>
+<form name="processForm" novalidate>
+  <div class="col-sm-24">
+    <div ng-if="process.inputs.length === 0">
+      <label class="mt15">INPUTS</label>
+    </div>
 
-    <div ng-repeat="input in process.inputs" class="row">
-      <h4 class="col-xs-24">Input</h4>
+    <div ng-repeat="input in process.inputs">
+      <div><label class="mt15">INPUT</label></div>
 
       <div class="col-xs-24 detailsBox processCluster">
 
           <div class="row">
             <div class="col-xs-24">
-              <label class="light">Name</label>
+              <label class="light">Name<mandatory-field></mandatory-field></label>
               <input type="text" class="form-control"
                      ng-class="{firstInput: $index === 0}"
                      validation-message="{{validations.messages.name}}"
                      ng-model="input.name"
                      ng-required="true"
-                     ng-maxlength="100"
-                     ng-pattern="validations.patterns.name"/>
+                     ng-maxlength="39"
+                     ng-pattern="validations.patterns.inputName"/>
             </div>
           </div>
 
         <div class="row">
           <div class="col-xs-24">
-            <label class="light">Feed</label>
+            <label class="light">Feed<mandatory-field></mandatory-field></label>
 
             <select ng-model="input.feed" ng-required="true" class="col-sm-24 form-control padding0"
                     validation-message="{{validations.messages.feed}}">
@@ -51,22 +53,20 @@
           </div>
         </div>
 
-          <div class="clearfix"></div>
-          <h5>Instance</h5>
+          <div><label class="mt15">INSTANCE</label></div>
 
           <div class="row">
             <div class="col-xs-12">
-              <label class="light">Start</label>
+              <label class="light">Start<mandatory-field></mandatory-field></label>
 
               <input type="text" class="form-control" validation-message="{{validations.messages.value}}"
                      ng-model="input.start"
                      ng-required="true"
-                     ng-maxlength="100"
-                     on-blur="validateStartEndDate"/>
+                     ng-maxlength="39"/>
 
             </div>
             <div class="col-xs-12">
-              <label class="light">End</label>
+              <label class="light">End<mandatory-field></mandatory-field></label>
 
               <input type="text" class="form-control {{invalidEndDate}}" validation-message="{{validations.messages.value}}"
                      ng-model="input.end"
@@ -76,11 +76,11 @@
               <label ng-show="invalidEndDate" class="custom-danger nameValidationMessage">End should be equal or greater than Start</label>
             </div>
 
-            <div class="col-xs-24 mt10">
+          </div>
+          <div class="col-xs-24 mt10">
               <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeInput($index)">
                 <span class="entypo minus"></span> delete
               </button>
-            </div>
           </div>
       </div>
     </div>
@@ -89,28 +89,29 @@
       <span class="entypo plus"></span> add input
     </button>
 
-    <h4 ng-if="process.outputs.length === 0">Outputs</h4>
-
-    <div ng-repeat="output in process.outputs" class="row">
-      <h4 class="col-xs-24">Output</h4>
+    <div ng-if="process.outputs.length === 0">
+      <label class="mt15">OUTPUTS</label>
+    </div>
+    <div ng-repeat="output in process.outputs">
+      <div><label class="mt15">OUTPUT</label></div>
 
       <div class="col-xs-24 detailsBox processCluster">
         <div class="row">
           <div class="col-xs-24">
-            <label class="light">Name</label>
+            <label class="light">Name<mandatory-field></mandatory-field></label>
             <input type="text"
                    ng-class="{firstOutput: $index === 0}"
                    class="form-control"
                    validation-message="{{validations.messages.name}}"
                    ng-model="output.name"
                    ng-required="true"
-                   ng-maxlength="100"
+                   ng-maxlength="39"
                    ng-pattern="validations.patterns.id"/>
           </div>
         </div>
         <div class="row">
           <div class="col-xs-24">
-            <label class="light">Feed</label>
+            <label class="light">Feed<mandatory-field></mandatory-field></label>
             <select ng-model="output.feed" ng-required="true" class="col-sm-24 form-control padding0"
                     validation-message="{{validations.messages.feed}}" >
               <option value="" disabled selected style='display:none;'>-Select feed-</option>
@@ -118,16 +119,16 @@
             </select>
           </div>
         </div>
-        <div class="clearfix"></div>
-        <h5>Instance</h5>
+
+        <div><label class="mt15">INSTANCE</label></div>
         <div class="row">
           <div class="col-xs-24">
-            <label class="light">Instance</label>
+            <label class="light">Instance<mandatory-field></mandatory-field></label>
 
             <input type="text" class="form-control" validation-message="{{validations.messages.value}}"
                    ng-model="output.outputInstance"
                    ng-required="true"
-                   ng-maxlength="100"/>
+                   ng-maxlength="39"/>
           </div>
         </div>
         <div class="row mt10">
@@ -143,21 +144,21 @@
       <span class="entypo plus"></span> add output
     </button>
   </div>
-  <div class="row">
-    <div class="col-xs-24 mt20">
-      <button class="btn prevBtn" type="button"
-           ng-click="goBack('forms.process.clusters')"
-           ng-disabled="buttonSpinners.backShow">
-        Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
-      </button>
-      <button class="btn nextBtn pull-right"
+  <div class="col-xs-24 pb15px mt35">
+    <button class="btn prevBtn" type="button"
+       ng-click="goBack()"
+       ng-disabled="buttonSpinners.backShow">
+    PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <div class="pull-right">
+        <a class="btn cnclBtn" ui-sref="main">
+            CANCEL
+        </a>
+        <button class="btn nextBtn"
            ng-disabled="invalidEndDate || buttonSpinners.show"
-           ng-click="goNext(processForm.$invalid, 'forms.process.summary')" >
-        Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-      </button>
-      <a class="pull-right" ui-sref="main">
-        Cancel
-      </a>
+           ng-click="goNext(processForm.$invalid)" scroll-to-error>
+        NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+        </button>
     </div>
   </div>
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/process/processFormPropertiesStepTpl.html b/falcon-ui/app/html/process/processFormPropertiesStepTpl.html
index 657a1cb..1af0bdb 100644
--- a/falcon-ui/app/html/process/processFormPropertiesStepTpl.html
+++ b/falcon-ui/app/html/process/processFormPropertiesStepTpl.html
@@ -17,19 +17,19 @@
  * limitations under the License.
  */
 -->
-<form name="processForm" class="mt10" novalidate id="processFormPropsStep">
+<form name="processForm" novalidate>
 
-  <h5 class="col-xs-24">Timing</h5>
+  <div class="col-xs-24"><label class="mt15">TIMING</label></div>
 
   <div class="col-xs-24 mb10">
-    <label class="light">Timezone</label>
-    <time-zone-select ng-model="process.timezone" id="timeZoneSelect"></time-zone-select>
+    <label class="light" tooltip="process.properties.timezone">Timezone<mandatory-field></mandatory-field></label>
+    <time-zone-select ng-model="process.timezone" id="timeZoneSelect" required="true">
+    </time-zone-select>
   </div>
-
-  <div class="col-xs-9">
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-9">
     <div class="inlineInputsGroup">
-      <div>Frequency</div>
-      <span>Every</span>
+      <div><label class="light">Frequency Every<mandatory-field></mandatory-field></label></div>
       <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
              ng-model="process.frequency.quantity" ng-keydown="validations.acceptOnlyNumber($event)"
              id="frequencyQuantity"
@@ -45,39 +45,48 @@
         <option value="months">months</option>
       </select>
     </div>
-  </div>
-  <div class="col-xs-7">
+    </div>
+    <div class="col-xs-7">
     <div class="inlineInputsGroup">
-      <div>Maximum Parallel Instances</div>
+      <div><label class="light">Maximum Parallel Instances<mandatory-field></mandatory-field></label></div>
       <select
         ng-model="process.parallel"
         ng-required="true">
         <option ng-repeat="value in [1,2,3,4,5,6,7,8,9,10,11,12]">{{value}}</option>
       </select>
     </div>
-  </div>
-  <div class="col-xs-8">
+    </div>
+    <div class="col-xs-8">
     <div class="inlineInputsGroup">
-      <div>Order</div>
+      <div>
+        <label class="light" tooltip="process.properties.order">
+          Instance Usage<mandatory-field></mandatory-field>
+        </label>
+      </div>
       <select ng-model="process.order" ng-required="true" validation-message="{{validations.messages.option}}">
         <option value="" disabled selected style='display:none;'>-Select order-</option>
         <option ng-repeat="value in ['FIFO', 'LIFO', 'LAST_ONLY']">{{value}}</option>
       </select>
     </div>
-  </div>
-  <div class="clearfix mb10"></div>
-  <h4 class="col-xs-24">Retry</h4>
-
-  <div class="col-xs-9 inlineInputsGroup">
-      <div class="mt10 mb10">Policy</div>
-      <select ng-model="process.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}">
-        <option value="" disabled selected style='display:none;'>-Select policy-</option>
-        <option ng-repeat="value in ['periodic', 'exp-backoff', 'final']">{{value}}</option>
-      </select>
     </div>
   </div>
-  <div class="col-xs-7 inlineInputsGroup">
-      <div class="mt10">Attempts</div>
+  <div class="col-xs-24"><label class="mt15">RETRY</label></div>
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-9 inlineInputsGroup">
+      <div>
+        <label class="light" tooltip="process.properties.retryPolicy" tooltip-position="up">
+          Retry Policy<mandatory-field></mandatory-field>
+        </label>
+      </div>
+      <select ng-model="process.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}">
+        <option value="" disabled selected style='display:none;'>-Select policy-</option>
+        <option value="periodic">Periodic</option>
+        <option value="exp-backoff">Exponential Backup</option>
+        <option value="final">None</option>
+      </select>
+    </div>
+    <div class="col-xs-7 inlineInputsGroup">
+      <div><label class="light">Attempts<mandatory-field></mandatory-field></label></div>
 
       <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
              ng-model="process.retry.attempts" ng-keydown="validations.acceptOnlyNumber($event)"
@@ -85,11 +94,9 @@
              ng-required="true"
              ng-pattern="validations.patterns.twoDigits"/>
     </div>
-  </div>
-  <div class="col-xs-8">
+    <div class="col-xs-8">
     <div class="inlineInputsGroup">
-      <div class="mt10">Delay</div>
-      <span>Up to</span>
+      <div><label class="light">Delay Up to<mandatory-field></mandatory-field></label></div>
       <input type="text" class="form-control"
              ng-model="process.retry.delay.quantity" validation-message="{{validations.messages.number}}"
              id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)"
@@ -104,23 +111,25 @@
         <option value="months">months</option>
       </select>
     </div>
+    </div>
   </div>
-
-  <div class="col-xs-24 mt20">
+  <div class="col-xs-24 mt35 pb15px pl0px">
     <button class="btn prevBtn"
          type="button"
-         ng-click="goBack('forms.process.general')"
+         ng-click="goBack()"
          ng-disabled="buttonSpinners.backShow">
-      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+      PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
     </button>
-    <button class="btn nextBtn pull-right"
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
+      </a>
+      <button class="btn nextBtn"
          ng-disabled="buttonSpinners.show"
-         ng-click="goNext(processForm.$invalid, 'forms.process.clusters')" >
-      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-    </button>
-    <a class="pull-right" ui-sref="main">
-      Cancel
-    </a>
+         ng-click="goNext(processForm.$invalid)" scroll-to-error>
+          NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+    </div>
   </div>
 
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/process/processFormSummaryStepTpl.html b/falcon-ui/app/html/process/processFormSummaryStepTpl.html
index b60dd4e..086e8fc 100644
--- a/falcon-ui/app/html/process/processFormSummaryStepTpl.html
+++ b/falcon-ui/app/html/process/processFormSummaryStepTpl.html
@@ -19,155 +19,192 @@
 -->
 <form name="processForm" class="mt10" novalidate id="processFormSummaryStep">
 
-  <div class="row">
-    <h4 class="col-sm-24">Process</h4>
+  <div class="row" id="processSummaryStep">
+    <h4 class="col-sm-24">General</h4>
 
-    <div class="clearfix hidden-md">&nbsp</div>
-
-    <label class="col-sm-24">Name</label>
-    <label class="col-sm-24 light">{{process.name}}</label>
-
-    <div class="clearfix hidden-md">&nbsp</div>
-
-    <label class="col-sm-24">Tags</label>
     <div class="col-sm-24">
-      <div ng-repeat="tag in process.tags | filter:{key: '!!'}">
-        {{tag.key}} = {{tag.value}}
-      </div>
-      <div ng-show="!hasTags()">No tags selected</div>
+      <label>Process Name</label>: <span data-qe-id="processName">{{process.name}}</span>
     </div>
 
-    <div class="clearfix hidden-md">&nbsp</div>
+    <div class="col-sm-24">
+      <label>Tags</label>:
+      <div ng-repeat="tag in process.tags | filter:{key: '!!'} track by $index">
+        <span data-qe-id="processTags">{{tag.key}} = {{tag.value}}</span>
+      </div>
+      <div ng-show="!hasTags()"><span data-qe-id="processTags">No tags selected</span></div>
+    </div>
+
+    <h4 class="col-sm-24">
+      Access Control List
+    </h4>
+    <div class="col-sm-24">
+      <label>Owner</label>: <span data-qe-id="processACLOwner">{{optional(process.ACL.owner)}}</span>
+      <label>Group</label>: <span data-qe-id="processACLGroup">{{optional(process.ACL.group)}}</span>
+      <label>Permissions</label>:<span data-qe-id="processACLPermission"> {{optional(process.ACL.permission)}}</span>
+    </div>
 
     <h4 class="col-sm-24">Workflow</h4>
-    <div class="clearfix hidden-md">&nbsp</div>
-    <div class="row">
-      <div class="col-sm-8">
-        <label class="col-sm-24">Name</label>
-        <label class="col-sm-24 light">{{process.workflow.name}}</label>
+    <div class="col-sm-24">
+      <label>Workflow Name</label>:
+      <label class="light" data-qe-id="processWorkflowName">{{process.workflow.name}}</label>
+    </div>
+    <div class="col-sm-24">
+      <label>Engine</label>:
+      <label class="light"  data-qe-id="processWorkflowEngine">{{process.workflow.engine}}</label>
+    </div>
+    <div class="col-sm-24">
+      <label>Workflow Path</label>:
+      <label class="light" data-qe-id="processWorkflowPath">{{process.workflow.path}}</label>
+    </div>
+
+    <div class="col-sm-24 plr0px" ng-show="process.workflow.engine==='spark'">
+      <h4 class="col-sm-24">Spark Attributes</h4>
+      <div class="col-sm-24">
+        <label>Aplication</label>:
+        <label class="light" data-qe-id="processSparkApplication">{{process.workflow.spark.name}}</label>
       </div>
-      <div class="col-sm-8">
-        <label class="col-sm-24">Engine</label>
-        <label class="col-sm-24 light">{{process.workflow.engine}}</label>
+      <div class="col-sm-24">
+        <label>Main Class</label>:
+        <label class="light"  data-qe-id="processSparkMainClass">{{process.workflow.spark.class}}</label>
       </div>
-      <div class="col-sm-8">
-        <label class="col-sm-24">Version</label>
-        <label class="col-sm-24 light">{{process.workflow.version}}</label>
+      <div class="col-sm-24">
+        <label>Runs On</label>:
+        <label class="light" data-qe-id="processSparkRunsOn">{{process.workflow.spark.master}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Mode</label>:
+        <label class="light" data-qe-id="processSparkMode">{{process.workflow.spark.mode}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Jar</label>:
+        <label class="light" data-qe-id="processSparkJar">{{process.workflow.spark.jar}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Spark Options</label>:
+        <label class="light" data-qe-id="processSparkOpts">{{process.workflow.spark.sparkOptions}}</label>
+      </div>
+
+      <div class="col-sm-24">
+        <label>Spark Arguments</label>:
+        <label class="light" data-qe-id="processSparkOpts">{{process.workflow.spark.arg}}</label>
       </div>
     </div>
-    <label class="col-sm-24">Path</label>
-    <label class="col-sm-24 light">{{process.workflow.path}}</label>
-
 
     <h4 class="col-sm-24">Timing</h4>
-    <div class="clearfix hidden-md">&nbsp</div>
-    <label class="col-sm-24">Timezone</label>
-    <label class="col-sm-24 light">{{optional(process.timezone)}}</label>
-    <div class="row">
-      <div class="col-sm-8">
-        <label class="col-sm-24">Frequency</label>
-        <label class="col-sm-24 light">Every {{process.frequency.quantity}} {{process.frequency.unit}}</label>
-      </div>
-      <div class="col-sm-8">
-        <label class="col-sm-24">Max. parallel instances</label>
-        <label class="col-sm-24 light">{{process.parallel}}</label>
-      </div>
-      <div class="col-sm-8">
-        <label class="col-sm-24">Order</label>
-        <label class="col-sm-24 light">{{optional(process.order)}}</label>
-      </div>
+    <div class="col-sm-24">
+      <label>Timezone</label>:
+      <label class="light" data-qe-id="processTimezone">{{optional(process.timezone)}}</label>
     </div>
-    <div class="clearfix hidden-md">&nbsp</div>
+    <div class="col-sm-24">
+      <label>Frequency</label>:
+      <label class="light">Every
+        <span data-qe-id="processFrequencyQuantity">{{process.frequency.quantity}}</span>
+        <span data-qe-id="processFrequencyUnit">{{process.frequency.unit}}</span>
+      </label>
+    </div>
+    <div class="col-sm-24">
+      <label>Max. parallel instances</label>:
+      <label class="light" data-qe-id="processParallel">{{process.parallel}}</label>
+    </div>
+    <div class="col-sm-24">
+      <label>Instance Usage</label>:
+      <label class="light" data-qe-id="processOrder">{{optional(process.order)}}</label>
+    </div>
+
     <h4 class="col-sm-24">Retry</h4>
-    <div class="clearfix hidden-md">&nbsp</div>
-    <div class="row">
-      <div class="col-sm-8">
-        <label class="col-sm-24">Policy</label>
-        <label class="col-sm-24 light">{{process.retry.policy}}</label>
-      </div>
-      <div class="col-sm-8">
-        <label class="col-sm-24">Attempts</label>
-        <label class="col-sm-24 light">{{process.retry.attempts}}</label>
-      </div>
-      <div class="col-sm-8">
-        <label class="col-sm-24">Delay</label>
-        <label class="col-sm-24 light">Up to {{process.retry.delay.quantity}} {{process.retry.delay.unit}}</label>
-      </div>
+    <div class="col-sm-24">
+      <label>Retry Policy</label>:
+      <label class="light" data-qe-id="processRetryPolicy">{{process.retry.policy}}</label>
     </div>
-    <div class="clearfix hidden-md">&nbsp</div>
+    <div class="col-sm-24">
+      <label>Attempts</label>:
+      <label class="light" data-qe-id="processRetryAttempts">{{process.retry.attempts}}</label>
+    </div>
+    <div class="col-sm-24">
+      <label>Delay</label>:
+      <label class="light">Up to
+        <span data-qe-id="processRetryDelayQuantity">{{process.retry.delay.quantity}}</span>
+        <span data-qe-id="processRetryDelayUnit">{{process.retry.delay.unit}}</span>
+      </label>
+    </div>
+
+    <h4 class="col-sm-24" ng-if="(process.properties | filter:{name: '!!'}).length > 0">Properties</h4>
+    <div class="col-sm-24" ng-repeat="property in process.properties | filter:{name: '!!'} track by $index">
+      <label>{{property.name}}</label>:<span> {{property.value}}</span>
+    </div>
+
     <h4 class="col-sm-24">Clusters</h4>
-    <div ng-repeat="cluster in process.clusters">
+    <div ng-repeat="cluster in process.clusters track by $index" data-qe-id="processClusters">
       <div class="row col-sm-offset-1 col-sm-22 detailsBox">
-        <label class="col-sm-24">Name</label>
-        <label class="col-sm-24 light">{{cluster.name}}</label>
-        <div class="clearfix hidden-md">&nbsp</div>
-        <h4 class="col-sm-24">Validity</h4>
-        <div class="row">
-          <div class="col-sm-12">
-            <label class="col-sm-24">Start</label>
-            <label class="col-sm-24 light">{{cluster.validity.start.date|date:'yyyy-MM-dd'}} {{cluster.validity.start.time|date:'HH:mm'}}</label>
-          </div>
-          <div class="col-sm-12">
-            <label class="col-sm-24">End</label>
-            <label class="col-sm-24 light">{{cluster.validity.end.date|date:'yyyy-MM-dd'}} {{cluster.validity.end.time|date:'HH:mm'}}</label>
-          </div>
+        <div class="col-sm-24">
+          <label>Cluster Name</label>:
+          <label class="light" data-qe-id="processClusterName">{{cluster.name}}</label>
+        </div>
+        <label class="col-sm-24">Validity</label>
+        <div class="col-sm-24">
+          <label>Start</label>:
+          <label class="light" data-qe-id="processClusterStart">{{cluster.validity.start.date|date:'yyyy-MM-dd'}} {{cluster.validity.start.time|date:'HH:mm'}}</label>
+          <label>End</label>:
+          <label class="light" data-qe-id="processClusterEnd">{{cluster.validity.end.date|date:'yyyy-MM-dd'}} {{cluster.validity.end.time|date:'HH:mm'}}</label>
         </div>
       </div>
     </div>
-    <div class="clearfix hidden-md">&nbsp</div>
     <h4 class="col-sm-24">Inputs</h4>
-    <div ng-repeat="input in process.inputs">
+    <div ng-repeat="input in process.inputs track by $index" data-qe-id="processInputs">
       <div class="row col-sm-offset-1 col-sm-22 detailsBox">
-        <label class="col-sm-24">Name</label>
-        <label class="col-sm-24 light">{{input.name}}</label>
-        <label class="col-sm-24">Feed</label>
-        <label class="col-sm-24 light">{{input.feed}}</label>
-        <div class="clearfix hidden-md">&nbsp</div>
-        <h4 class="col-sm-24">Instance</h4>
-        <div class="row">
-          <div class="col-sm-12">
-            <label class="col-sm-24">Start</label>
-            <label class="col-sm-24 light">{{input.start}}</label>
-          </div>
-          <div class="col-sm-12">
-            <label class="col-sm-24">End</label>
-            <label class="col-sm-24 light">{{input.end}}</label>
-          </div>
+        <div class="col-sm-24">
+          <label>Name</label>:
+          <label class="light" data-qe-id="processInputName">{{input.name}}</label>
+        </div>
+        <div class="col-sm-24">
+          <label>Feed</label>:
+          <label class="light" data-qe-id="processInputFeed">{{input.feed}}</label>
+        </div>
+        <label class="col-sm-24">Instance</label>
+        <div class="col-sm-24">
+          <label>Start</label>:
+          <label class="light" data-qe-id="processInstanceStart">{{input.start}}</label>
+          <label>End</label>:
+          <label class="light" data-qe-id="processInstanceEnd">{{input.end}}</label>
         </div>
       </div>
     </div>
     <h4 class="col-sm-24">Outputs</h4>
-    <div ng-repeat="output in process.outputs">
+    <div ng-repeat="output in process.outputs track by $index" data-qe-id="processOutputs">
       <div class="row col-sm-offset-1 col-sm-22 detailsBox">
-        <label class="col-sm-24">Name</label>
-        <label class="col-sm-24 light">{{output.name}}</label>
-        <label class="col-sm-24">Feed</label>
-        <label class="col-sm-24 light">{{output.feed}}</label>
-        <div class="clearfix hidden-md">&nbsp</div>
-        <h4 class="col-sm-24">Instance</h4>
+        <div class="col-sm-24">
+          <label>Name</label>
+          <label class="light" data-qe-id="processOutputName">{{output.name}}</label>
+        </div>
+        <div class="col-sm-24">
+          <label>Feed</label>
+          <label class="light" data-qe-id="processOutputFeed">{{output.feed}}</label>
+        </div>
         <label class="col-sm-24">Instance</label>
-        <label class="col-sm-24 light">{{output.outputInstance}}</label>
+        <div class="col-sm-24">
+          <label>Instance</label>
+          <label class="light" data-qe-id="processOutputInstance">{{output.outputInstance}}</label>
+        </div>
       </div>
     </div>
   </div>
-  <div class="clearfix hidden-md">&nbsp</div>
 
-  <div class="row">
-    <div class="col-xs-24 mt20">
-      <button type="button" class="btn prevBtn"
-           ng-click="goBack('forms.process.io')"
-           ng-disabled="buttonSpinners.backShow">
-        Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
-      </button>
-      <button class="btn nextBtn pull-right"
-           ng-disabled="processForm.$invalid || buttonSpinners.show"
-           ng-click="saveEntity()">
-        Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
-      </button>
-      <a class="pull-right" ui-sref="main">
-        Cancel
+  <div class="col-xs-24 mt35 pb15px pl0px">
+    <button type="button" class="btn prevBtn"
+         ng-click="goBack()"
+         ng-disabled="buttonSpinners.backShow">
+      PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
       </a>
+      <button class="btn nextBtn"
+           ng-disabled="processForm.$invalid || buttonSpinners.show"
+           ng-click="saveEntity()" scroll-to-error>
+        SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
     </div>
   </div>
 
-</form>
\ No newline at end of file
+</form>
diff --git a/falcon-ui/app/html/process/processFormTpl.html b/falcon-ui/app/html/process/processFormTpl.html
index 00d2c66..7c4a9e1 100644
--- a/falcon-ui/app/html/process/processFormTpl.html
+++ b/falcon-ui/app/html/process/processFormTpl.html
@@ -17,90 +17,77 @@
  * limitations under the License.
  */
 -->
-<div class="col-xs-22 col-xs-offset-1 entityForm" id="processFormTmpl">
+<div class="entityForm">
   <div class="col-xs-24">
-    <div class="row">
-
-      <h3 id="formTitle" class="col-xs-24">
-        <span class="entypo cycle icon-lg"></span> New Process
-      </h3>
-
-      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-20' : !propsOpen}">
-        <div class="detailsBox">
-          <div class="processProgressBox" ng-class="{
-            general:isActive('forms.process.general'),
-            properties:isActive('forms.process.properties'),
-            clusters:isActive('forms.process.clusters'),
-            inputsAndOutputs: isActive('forms.process.io'),
-            summary:isActive('forms.process.summary')
-            }">
-            <div class="progressBar col-xs-24">
-              <div>
-                <span>
-                  <div class="fir">1<span class="entypo check"></span></div>
-                  <h6>General</h6>
-                </span>
-                <span>
-                  <div class="sec">2<span class="entypo check"></span></div>
-                  <h6>Properties</h6>
-                </span>
-                <span>
-                  <div class="thi">3<span class="entypo check"></span></div>
-                  <h6>Clusters</h6>
-                </span>
-                <span>
-                  <div class="fou">4<span class="entypo check"></span></div>
-                  <h6>Inputs & Outputs</h6>
-                </span>
-                <span>
-                  <div class="fif">5<span class="entypo check"></span></div>
-                  <h6>Summary</h6>
-                </span>
-              </div>
-            </div>
-          </div>
-
-          <div class="row">
-            <div class="col-xs-offset-1 col-xs-22">
-              <fieldset id="fieldWrapper" ng-disabled="!editXmlDisabled">
-                <div ui-view class="formViewContainer"></div>
-              </fieldset>
-            </div>
+      <div class="preview pullOver">
+          <button id="previewXMLBtn" type="button" class="btn btn-default btn-md pull-right nextBtn" ng-click="toggleclick()" >Preview XML</button>
+      </div>
+      <br/>
+    <div>
+      <div class=" formBoxContainer detailsBox">
+        <div class="row processProgressBox" ng-class="{
+          general:isActive('forms.process.general'),
+          summary:isActive('forms.process.summary')
+          }">
+          <div class="progressBar col-xs-24">
+            <div class="text-center fir" ng-class="{
+                active:isActive('forms.process.general'),
+                completed:isCompleted('forms.process.general')}">General</div>
+            <div class="text-center thi" ng-class="{
+                active:isActive('forms.process.summary'),
+                completed:isCompleted('forms.process.summary')}">Summary</div>
           </div>
         </div>
-      </div>
 
-      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-4' : !propsOpen}">
-        <div class="detailsBox">
-          <div class="row">
-
-            <div class="col-xs-13 col-xs-offset-1 noSpecial">
-              <h5><i class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-minus-sign':'glyphicon-plus-sign'"></i> XML Preview</h5>
+        <div class="row customContainer">
+          <div class="col-xs-offset-1 col-xs-22">
+            <fieldset id="fieldWrapper" ng-disabled="!editXmlDisabled">
+              <div class="formViewContainer">
+                <div class="col-xs-24">
+                  <label class="title"><span class="entypo cycle icon-lg entypo-align-sub"></span> NEW PROCESS</label>
+                </div>
+                <div ui-view></div>
+              </div>
+            </fieldset>
+          </div>
+        </div>
+	  </div>
+      <div class="hide xmlPreviewContainer detailsBox">
+        <div class="row dt">
+          <div class="col-xs-24 pt15px">
+            <div class="col-xs-13 noSpecial">
+                <h5>XML Preview</h5>
+                <label style="margin-top: -10px;margin-bottom: -2px;" ng-if="invalidXml" class="custom-danger">Invalid Xml</label>
             </div>
-
-            <div ng-if="propsOpen" class="col-xs-9">
+            <div class="pull-right">
               <button type="button"
                       id="editXmlButton"
-                      class="btn btn-default btn-xs pull-right"
+                      class="btn btn-default btn-xs"
                       ng-click="toggleEditXml()"
-                      ng-class="{'btn-warning':!editXmlDisabled}">
+                      ng-class="{'btn-warning':!editXmlDisabled}"
+                      ng-disabled="invalidXml">
                 <div ng-if="editXmlDisabled">Edit XML</div>
                 <div ng-if="!editXmlDisabled">Finish</div>
               </button>
-            </div>
 
-            <div ng-show="propsOpen" class="col-xs-24">
-              <div class="row">
-                <div class="col-xs-22 col-xs-offset-1" >
-                  <textarea ng-model="prettyXml" class="form-control prettyXml" elastic ng-disabled="editXmlDisabled"></textarea>
-                </div>
-              </div>
+              <button type="button"
+                      id="revertXMLBtn"
+                      class="btn btn-default btn-xs"
+                      ng-if="invalidXml"
+                      ng-click="revertXml()">
+                  <div>Revert</div>
+              </button>
             </div>
-
+          </div>
+          <div class="col-xs-24 showValidationStyle">
+            <textarea ng-model="prettyXml"
+                      class="form-control"
+                      elastic
+                      ng-disabled="editXmlDisabled"
+                      ng-class="{fakeInvalid:invalidXml}">
+            </textarea>
           </div>
         </div>
       </div>
-
-    </div>
   </div>
 </div>
diff --git a/falcon-ui/app/html/process/processSummary.html b/falcon-ui/app/html/process/processSummary.html
index e9eb4a4..cc4a1d9 100644
--- a/falcon-ui/app/html/process/processSummary.html
+++ b/falcon-ui/app/html/process/processSummary.html
@@ -30,7 +30,6 @@
       <div ng-repeat="tag in process.tags | filter:{key: '!!'}">
         {{tag.key}} = {{tag.value}}
       </div>
-      <div ng-show="!hasTags()">No tags selected</div>
     </div>
 
     <h5 class="col-sm-24">Access Control List</h5>
@@ -61,14 +60,41 @@
         <label class="col-sm-24">Engine</label>
         <label class="col-sm-24 light">{{process.workflow.engine}}</label>
       </div>
-      <div class="col-sm-8">
-        <label class="col-sm-24">Version</label>
-        <label class="col-sm-24 light">{{process.workflow.version}}</label>
-      </div>
     </div>
     <label class="col-sm-24">Path</label>
     <label class="col-sm-24 light">{{process.workflow.path}}</label>
 
+    <div class="col-sm-24 plr0px" ng-show="process.workflow.engine==='spark'">
+      <h5 class="col-sm-24">Spark Attributes</h4>
+      <div class="col-sm-24">
+        <label>Aplication</label>:
+        <label class="light" data-qe-id="processSparkApplication">{{process.workflow.spark.name}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Main Class</label>:
+        <label class="light"  data-qe-id="processSparkMainClass">{{process.workflow.spark.class}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Runs On</label>:
+        <label class="light" data-qe-id="processSparkRunsOn">{{process.workflow.spark.master}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Mode</label>:
+        <label class="light" data-qe-id="processSparkMode">{{process.workflow.spark.mode}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Jar</label>:
+        <label class="light" data-qe-id="processSparkJar">{{process.workflow.spark.jar}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Spark Options</label>:
+        <label class="light" data-qe-id="processSparkOpts">{{process.workflow.spark.sparkOptions}}</label>
+      </div>
+      <div class="col-sm-24">
+        <label>Spark Arguments</label>:
+        <label class="light" data-qe-id="processSparkOpts">{{process.workflow.spark.arg}}</label>
+      </div>
+    </div>
 
     <h5 class="col-sm-24">Timing</h5>
     <label class="col-sm-24" ng-if="process.timezone">Timezone</label>
@@ -89,6 +115,11 @@
       </div>
     </div>
 
+    <h5 class="col-sm-24" ng-if="(process.properties | filter:{name: '!!'}).length > 0">Properties</h5>
+    <div class="col-sm-24" ng-repeat="property in process.properties  | filter:{name: '!!'}">
+      <label>{{property.name}}</label>:<span> {{property.value}}</span>
+    </div>
+
     <h5 class="col-sm-24">Retry</h5>
 
     <div class="row">
@@ -181,4 +212,4 @@
       </div>
     </div>
   </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/falcon-ui/app/html/snapshot/snapshotFormAdvancedStepTpl.html b/falcon-ui/app/html/snapshot/snapshotFormAdvancedStepTpl.html
new file mode 100644
index 0000000..d0fb50b
--- /dev/null
+++ b/falcon-ui/app/html/snapshot/snapshotFormAdvancedStepTpl.html
@@ -0,0 +1,194 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<form name="snapshotForm" novalidate id="snapshotFormAdvancedStep">
+
+	<div class="col-xs-24">
+		<label tooltip="dataset.tdeEncryptionEnabled">TDE Encryption</label>
+		<input type="checkbox" ng-model="snapshot.tdeEncryptionEnabled" ng-checked="snapshot.tdeEncryptionEnabled"/>
+	</div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24"><label>Retry Policy</label></div>
+  <div class="col-xs-24">
+		<label class="light" tooltip="snapshot.retryPolicy" tooltip-position="up">
+			Type
+		</label>
+	</div>
+	<div class="col-xs-6">
+    <select ng-model="snapshot.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}"
+			ng-change="policyChange()">
+      <option value="" disabled selected style='display:none;'>-Select policy-</option>
+      <option value="periodic">Periodic</option>
+      <option value="exp-backoff">Exponential Backup</option>
+      <option value="final">None</option>
+    </select>
+	</div>
+	<div class="col-xs-24">
+		<label class="light">Delay Up to</label>
+	</div>
+	<div class="col-xs-3">
+		<input type="text" class="form-control"
+					 ng-model="snapshot.retry.delay.quantity" validation-message="{{validations.messages.number}}"
+					 id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)"
+					 ng-required="true"
+					 ng-disabled = "snapshot.retry.policy === 'final'"
+					 ng-pattern="validations.patterns.twoDigits"/>
+	</div>
+	<div class="col-xs-3 plr0px">
+		<select ng-model="snapshot.retry.delay.unit" ng-required="true"
+			validation-message="{{validations.messages.option}}"
+			ng-disabled = "snapshot.retry.policy === 'final'">
+			<option value="" disabled selected style='display:none;'>-Select delay-</option>
+			<option value="minutes">minutes</option>
+			<option value="hours">hours</option>
+			<option value="days">days</option>
+			<option value="months">months</option>
+		</select>
+	</div>
+  <div class="col-xs-24">
+    <label class="light">Attempts</label>
+	</div>
+	<div class="col-xs-6">
+    <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
+           ng-model="snapshot.retry.attempts" ng-keydown="validations.acceptOnlyNumber($event)"
+           id="attemptsField"
+					 ng-disabled = "snapshot.retry.policy === 'final'"
+           ng-required="true"
+           ng-pattern="validations.patterns.twoDigits"/>
+  </div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24"><label>Performance & Throttling - Distributed Copy</label></div>
+	<div class="col-xs-12 plr0px">
+		<div class="col-xs-12 plr0px">
+			<div class="col-xs-24 plr0px">
+				<div class="col-xs-24">
+					<label class="light" tooltip="dataset.distcpMapBandwidth">Max Bandwidth</label>
+				</div>
+				<div class="col-xs-20">
+					<input type="text"
+								 name="distcpMapBandwidth"
+								 ng-model="snapshot.allocation.distcpMapBandwidth"
+								 class="form-control" />
+				</div>
+				<label class="light bandwidth-label">MB</label>
+			</div>
+			<div class="col-xs-20">
+				<label class="light" tooltip="dataset.distcpMaxMaps">Max Map Jobs</label>
+				<input type="text"
+							 name="distcpMaxMaps"
+							 ng-model="snapshot.allocation.distcpMaxMaps"
+							 class="form-control" />
+			</div>
+		</div>
+	</div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24">
+    <label>Alerts</label>
+  </div>
+
+	<div class="col-xs-24">
+    <label class="light" tooltip="dataset.jobNotificationReceivers">Send alerts to</label>
+  </div>
+  <div class="col-xs-12 alertsBox plr0px">
+    <div class="emailBox">
+      <div class="col-xs-16">
+        <input class="form-control"
+               name="emailAlertInput"
+               ng-model="snapshot.alert.email"
+               type="text"
+               placeholder="Email"
+               ng-pattern="validations.patterns.email"
+               validation-optional-message="{{validations.messages.email}}">
+      </div>
+    </div>
+    <div class="addAlertBox col-xs-3">
+      <button class="btn btn-default btn-xs"
+              ng-disabled="!snapshot.alert.email"
+              type="button"
+              ng-click="addAlert()">
+        <span class="glyphicon glyphicon-plus"></span>add alert
+      </button>
+    </div>
+	</div>
+	<div class="col-xs-24">
+    <div class="col-xs-12 emailArrayRow mt10" ng-repeat="email in snapshot.alerts">
+      <span class="col-xs-16">{{email}}</span>
+      <div class="col-xs-3"><button class="btn btn-default btn-xs"
+              type="button"
+              ng-click="removeAlert()">
+        <span class="glyphicon glyphicon-minus"></span> delete
+      </button></div>
+    </div>
+  </div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24"><label>Access Control List</label></div>
+	<div class="col-xs-12 plr0px">
+		<div class="col-xs-24 plr0px">
+			<div class="col-xs-12">
+				<label class="light">Owner<mandatory-field></mandatory-field></label>
+				<input type="text"
+							 name="aclOwnerInput"
+							 ng-model="snapshot.ACL.owner"
+							 ng-pattern="validations.patterns.unixId"
+							 class="form-control"
+							 ng-required="true"
+							 validation-message="{{validations.messages.acl.owner}}"/>
+			</div>
+			<div class="col-xs-12 pl0px">
+				<label class="light">Group<mandatory-field></mandatory-field></label>
+				<input type="text"
+							 name="aclGroupInput"
+							 ng-model="snapshot.ACL.group"
+							 ng-pattern="validations.patterns.unixId"
+							 class="form-control"
+							 ng-required="true"
+							 validation-message="{{validations.messages.acl.group}}" />
+			</div>
+		</div>
+		<div class="col-xs-24">
+			<div class="col-xs-8 plr0px">
+				<label class="light">Permissions<mandatory-field></mandatory-field></label>
+				<acl-permissions acl-model="snapshot.ACL.permission"></acl-permissions>
+			</div>
+		</div>
+	</div>
+
+  <div class="col-xs-24 mt35 pb15px plr0px">
+		<button id="snapshot.backToStep1" class="btn prevBtn" type="button" ng-click="goBack()" ng-disabled="buttonSpinners.backShow">
+			PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow">
+		</button>
+		<div class="pull-right">
+			<a class="btn cnclBtn" ui-sref="main">
+				CANCEL
+			</a>
+			<button id="snapshot.step2" class="btn nextBtn" ng-click="goNext(snapshotForm.$invalid)" scroll-to-error>
+				NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show">
+			</button>
+			<button id="snapshot.step3" class="btn advancedSaveBtn" ng-click="save(snapshotForm.$invalid)"
+				ng-disabled="buttonSpinners.saveShow" scroll-to-error>
+				SAVE ADVANCED OPTIONS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow">
+			</button>
+		</div>
+	</div>
+
+</form>
diff --git a/falcon-ui/app/html/snapshot/snapshotFormGeneralStepTpl.html b/falcon-ui/app/html/snapshot/snapshotFormGeneralStepTpl.html
new file mode 100644
index 0000000..9990554
--- /dev/null
+++ b/falcon-ui/app/html/snapshot/snapshotFormGeneralStepTpl.html
@@ -0,0 +1,505 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<form id="snapshotFormGeneralStep" name="datasetForm" novalidate>
+
+  <div class="col-xs-6">
+    <label class="light" tooltip="dataset.name">Name<mandatory-field></mandatory-field></label>
+    <input type="text"
+           name="nameInput"
+           class="form-control"
+           ng-model="snapshot.name"
+           placeholder=""
+           ng-disabled="editingMode"
+           ng-pattern="validations.patterns.name"
+           ng-required="true"
+           check-name="{type:'process', check:!editingMode}"/>
+    </label>
+  </div>
+
+  <div class="col-xs-24">
+    <label class="light">Tags</label>
+  </div>
+
+  <div class="col-xs-12">
+    <div ng-repeat="tag in snapshot.tags">
+      <div class="row dynamic-table-spacer">
+        <div class="col-xs-8">
+          <input type="text" class="form-control" ng-model="tag.key"
+            validation-optional-message="{{validations.messages.key}}"
+              ng-pattern="validations.patterns.alpha" ng-required="tag.value" placeholder="name"/>
+        </div>
+        <div class="col-xs-8">
+          <input type="text" class="form-control" validation-optional-message="{{validations.messages.value}}"
+              ng-model="tag.value" ng-pattern="validations.patterns.alpha"
+              ng-required="tag.key" placeholder="value"/>
+        </div>
+        <div class="col-xs-8">
+          <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="!$first || !$last">
+            <span class="entypo minus"></span> delete
+          </button>
+          <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-if="$last">
+            <span class="entypo plus"></span> add tag
+          </button>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-xs-24 plr0px">
+    <div class="col-xs-12 plr0px">
+      <div class="col-xs-24 plr0px clusterBox">
+        <h3>Source</h3>
+        <div class="runJobOnBox">
+          <input type="radio" id="runJobOnSourceRadio" ng-model="snapshot.runOn" ng-rquired="true" value="source"/>
+          Run job here
+        </div>
+
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6"><label class="light">Cluster<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-10 mt10">
+              <select ng-model="snapshot.source.cluster"
+                  ng-required="true" validation-message="{{validations.messages.cluster}}"
+                  name="sourceClusterSelect" class="form-control padding0"
+                  ng-change="validateCluster()">
+                <option value="" disabled style='display:none;'>-Select source cluster-</option>
+                <option ng-selected="snapshot.source.cluster === cluster.name"
+                        ng-repeat="cluster in clusterList"
+                        value="{{cluster.name}}">
+                  {{cluster.name}}
+                </option>
+              </select>
+          </div>
+        </div>
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6">
+            <label class="light" tooltip="dataset.snapshot.sourceSnapshotDir">
+              Source Directory<mandatory-field></mandatory-field>
+            </label>
+          </div>
+          <div class="col-xs-10 mt10">
+            <input type="text"
+                   name="sourceDirectoryPath"
+                   ng-model="snapshot.source.directoryPath"
+                   ng-pattern="validations.patterns.path"
+                   class="form-control"
+                   ng-required="true"
+                   validation-message="{{validations.messages.path}}" />
+          </div>
+        </div>
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6">
+            <label class="light" tooltip="dataset.snapshot.sourceSnapshotRetentionAgeLimit">Delete Snapshot After</label>
+          </div>
+          <div class="col-xs-4 mt10">
+            <input type="text"
+                   name="sourceDeleteFrequency"
+                   ng-model="snapshot.source.deleteFrequency.quantity"
+                   ng-pattern="validations.patterns.twoDigits"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   ng-rquired="true"
+                   validation-message="{{validations.messages.number}}" />
+          </div>
+          <div class="col-xs-8 mt10">
+            <select ng-model="snapshot.source.deleteFrequency.unit"
+              class="form-control padding0" ng-rquired="true">
+              <option selected value="minutes">minutes</option>
+              <option value="hours">hours</option>
+              <option value="days">days</option>
+              <option value="months">months</option>
+            </select>
+          </div>
+        </div>
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6">
+            <label class="light" tooltip="dataset.snapshot.sourceSnapshotRetentionNumber">Keep Last</label>
+          </div>
+          <div class="col-xs-4 mt10">
+            <input type="text"
+                   name="sourceRetentionNumber"
+                   ng-model="snapshot.source.retentionNumber"
+                   ng-pattern="validations.patterns.twoDigits"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   ng-rquired="true"
+                   validation-message="{{validations.messages.number}}" />
+          </div>
+          <label class="light">snapshots</label>
+        </div>
+      </div>
+    </div>
+
+    <div class="col-xs-12 plr0px pl5">
+      <div class="col-xs-24 plr0px clusterBox">
+        <h3>Target</h3>
+        <div class="runJobOnBox">
+          <input type="radio" id="runJobOnTargetRadio" ng-model="snapshot.runOn" value="target" ng-rquired="true" />
+          Run job here
+        </div>
+
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6"><label class="light">Cluster<mandatory-field></mandatory-field></label></div>
+          <div class="col-xs-10 mt10">
+              <select ng-model="snapshot.target.cluster"
+                  ng-required="true" validation-message="{{validations.messages.cluster}}"
+                  name="targetClusterSelect" class="form-control padding0"
+                  ng-change="validateCluster()">
+                <option value="" disabled style='display:none;'>-Select target cluster-</option>
+                <option ng-selected="snapshot.target.cluster === cluster.name"
+                        ng-repeat="cluster in clusterList"
+                        value="{{cluster.name}}">
+                  {{cluster.name}}
+                </option>
+              </select>
+              <div class="custom-danger" ng-show="clusterErrorMessage != ''">
+                {{clusterErrorMessage}}
+              </div>
+          </div>
+        </div>
+
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6">
+            <label class="light" tooltip="dataset.snapshot.targetSnapshotDir">
+              Target Directory<mandatory-field></mandatory-field>
+            </label>
+          </div>
+          <div class="col-xs-10 mt10">
+            <input type="text"
+                   name="targetDirectoryPath"
+                   ng-model="snapshot.target.directoryPath"
+                   ng-pattern="validations.patterns.path"
+                   class="form-control"
+                   ng-required="true"
+                   validation-message="{{validations.messages.path}}" />
+          </div>
+        </div>
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6">
+            <label class="light" tooltip="dataset.snapshot.targetSnapshotRetentionAgeLimit">Delete Snapshot After</label>
+          </div>
+          <div class="col-xs-4 mt10">
+            <input type="text"
+                   name="targetDeleteFrequency"
+                   ng-model="snapshot.target.deleteFrequency.quantity"
+                   ng-pattern="validations.patterns.twoDigits"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   ng-rquired="true"
+                   validation-message="{{validations.messages.number}}" />
+          </div>
+          <div class="col-xs-8 mt10">
+            <select ng-model="snapshot.target.deleteFrequency.unit" class="form-control padding0" ng-rquired="true">
+              <option selected value="minutes">minutes</option>
+              <option value="hours">hours</option>
+              <option value="days">days</option>
+              <option value="months">months</option>
+            </select>
+          </div>
+        </div>
+        <div class="col-xs-24 plr0px">
+          <div class="col-xs-6">
+            <label class="light" tooltip="dataset.snapshot.targetSnapshotRetentionNumber">Keep Last</label>
+          </div>
+          <div class="col-xs-4 mt10">
+            <input type="text"
+                   name="targetRetentionNumber"
+                   ng-model="snapshot.target.retentionNumber"
+                   ng-pattern="validations.patterns.twoDigits"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   ng-rquired="true"
+                   validation-message="{{validations.messages.number}}" />
+          </div>
+          <label class="light">snapshots</label>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-xs-24"><label>Run Duration</label></div>
+	<div class="col-xs-24 validityBox plr0px">
+		<div class="col-xs-24 plr0px">
+			<div class="startDateBox col-xs-4">
+				<label class="light">Start</label>
+				<input type="text"
+					name="startDateInput"
+					class="form-control dateInput"
+					placeholder="{{dateFormat | lowercase}}"
+					ng-model="snapshot.validity.start.date"
+					ng-required="true"
+					simple-date-picker />
+
+			</div>
+			<div class="startTimeBox col-xs-4">
+				<label class="light">Begin Time</label>
+				<timepicker ng-change="constructDate()"
+										ng-model="snapshot.validity.start.time"
+										ng-required="true"
+										hour-step="1"
+										minute-step="1"
+										show-meridian="true">
+				</timepicker>
+			</div>
+		</div>
+		<div class="col-xs-24 plr0px">
+			<div class="endDateBox col-xs-4">
+				<label class="light">End</label>
+				<input type="text"
+					name="startDateInput"
+					class="form-control dateInput"
+					placeholder="{{dateFormat | lowercase}}"
+					ng-model="snapshot.validity.end.date"
+					ng-required="true"
+					simple-date-picker />
+
+			</div>
+			<div class="endTimeBox col-xs-4">
+				<label class="light">End Time<mandatory-field></mandatory-field></label>
+				<timepicker ng-change="constructDate()"
+										ng-model="snapshot.validity.end.time"
+										ng-required="true"
+										hour-step="1"
+										minute-step="1"
+										show-meridian="true">
+				</timepicker>
+			</div>
+		</div>
+	</div>
+
+  <div class="col-xs-12 frequencyBox plr0px">
+    <div class="col-xs-24">
+      <label>Frequency</label>
+    </div>
+    <div class="col-xs-24">
+      <label class="light">Repeat Every</label>
+    </div>
+    <div class="col-xs-24 plr0px">
+      <div class="col-xs-8">
+        <input type="text"
+               name="frequencyQuantity"
+               ng-model="snapshot.frequency.quantity"
+               ng-pattern="validations.patterns.twoDigits"
+               ng-keydown="validations.acceptOnlyNumber($event)"
+               ng-keyup="checkMininumFrequency(snapshot.frequency.quantity, snapshot.frequency.unit, datasetForm.frequencyQuantity)"
+               class="form-control"
+               ng-required="true"
+               validation-message="{{validations.messages.number}}" />
+      </div>
+      <div class="col-xs-8">
+        <select ng-model="snapshot.frequency.unit" class="form-control padding0" ng-required="true"
+          ng-change="checkMininumFrequency(snapshot.frequency.quantity, snapshot.frequency.unit, datasetForm.frequencyQuantity)">
+          <option selected value="minutes">minutes</option>
+          <option value="hours">hours</option>
+          <option value="days">days</option>
+          <option value="months">months</option>
+        </select>
+      </div>
+      <div class="col-xs-24 custom-danger" ng-if="!isFrequencyValid">{{validations.messages.frequency.minimum}}</div>
+    </div>
+
+    <div class="col-xs-24">
+      <label class="light">Timezone</label>
+    </div>
+    <div class="col-xs-24">
+      <time-zone-select ng-model="snapshot.validity.timezone"></time-zone-select>
+    </div>
+  </div>
+
+  <div class="col-xs-24 advancedOption" ng-click="expandOptions = !expandOptions" id="snapshotAdvancedOption">
+    <label class="mt15 pointer blink-success">ADVANCED OPTIONS</label>
+    <i class="glyphicon glyphicon-chevron-down mt15" ng-if="!expandOptions"></i>
+    <i class="glyphicon glyphicon-chevron-up mt15" ng-if="expandOptions"></i>
+  </div>
+
+	<div id="advancedOptionsBox" class="col-xs-24 plr0px" ng-class="{expanded:expandOptions}">
+    <div class="col-xs-24">
+		<label tooltip="dataset.tdeEncryptionEnabled">TDE Encryption</label>
+		<input type="checkbox" ng-model="snapshot.tdeEncryptionEnabled" ng-checked="snapshot.tdeEncryptionEnabled"/>
+	</div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24"><label>Retry Policy</label></div>
+    <div class="col-xs-24">
+		<label class="light" tooltip="snapshot.retryPolicy" tooltip-position="up">
+			Type
+		</label>
+	</div>
+	<div class="col-xs-6">
+      <select ng-model="snapshot.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}"
+			ng-change="policyChange()">
+        <option value="" disabled selected style='display:none;'>-Select policy-</option>
+        <option value="periodic">Periodic</option>
+        <option value="exp-backoff">Exponential Backup</option>
+        <option value="final">None</option>
+      </select>
+	</div>
+	<div class="col-xs-24">
+		<label class="light">Delay Up to</label>
+	</div>
+	<div class="col-xs-3">
+		<input type="text" class="form-control"
+					 ng-model="snapshot.retry.delay.quantity" validation-message="{{validations.messages.number}}"
+					 id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)"
+					 ng-required="true"
+					 ng-disabled = "snapshot.retry.policy === 'final'"
+					 ng-pattern="validations.patterns.twoDigits"/>
+	</div>
+	<div class="col-xs-3 plr0px">
+		<select ng-model="snapshot.retry.delay.unit" ng-required="true"
+			validation-message="{{validations.messages.option}}"
+			ng-disabled = "snapshot.retry.policy === 'final'">
+			<option value="" disabled selected style='display:none;'>-Select delay-</option>
+			<option value="minutes">minutes</option>
+			<option value="hours">hours</option>
+			<option value="days">days</option>
+			<option value="months">months</option>
+		</select>
+	</div>
+    <div class="col-xs-24">
+      <label class="light">Attempts</label>
+	</div>
+	<div class="col-xs-6">
+      <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
+             ng-model="snapshot.retry.attempts" ng-keydown="validations.acceptOnlyNumber($event)"
+             id="attemptsField"
+					 ng-disabled = "snapshot.retry.policy === 'final'"
+             ng-required="true"
+             ng-pattern="validations.patterns.twoDigits"/>
+    </div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24"><label>Performance & Throttling - Distributed Copy</label></div>
+	<div class="col-xs-12 plr0px">
+		<div class="col-xs-12 plr0px">
+			<div class="col-xs-24 plr0px">
+				<div class="col-xs-24">
+					<label class="light" tooltip="dataset.distcpMapBandwidth">Max Bandwidth</label>
+				</div>
+				<div class="col-xs-20">
+					<input type="text"
+								 name="distcpMapBandwidth"
+								 ng-model="snapshot.allocation.distcpMapBandwidth"
+								 class="form-control" />
+				</div>
+				<label class="light bandwidth-label">MB</label>
+			</div>
+			<div class="col-xs-20">
+				<label class="light" tooltip="dataset.distcpMaxMaps">Max Map Jobs</label>
+				<input type="text"
+							 name="distcpMaxMaps"
+							 ng-model="snapshot.allocation.distcpMaxMaps"
+							 class="form-control" />
+			</div>
+		</div>
+	</div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24">
+      <label>Alerts</label>
+    </div>
+
+	<div class="col-xs-24">
+      <label class="light" tooltip="dataset.jobNotificationReceivers">Send alerts to</label>
+    </div>
+    <div class="col-xs-12 alertsBox plr0px">
+      <div class="emailBox">
+        <div class="col-xs-16">
+          <input class="form-control"
+                 name="emailAlertInput"
+                 ng-model="snapshot.alert.email"
+                 type="text"
+                 placeholder="Email"
+                 ng-pattern="validations.patterns.email"
+                 validation-optional-message="{{validations.messages.email}}">
+        </div>
+      </div>
+      <div class="addAlertBox col-xs-3">
+        <button class="btn btn-default btn-xs"
+                ng-disabled="!snapshot.alert.email"
+                type="button"
+                ng-click="addAlert()">
+          <span class="glyphicon glyphicon-plus"></span>add alert
+        </button>
+      </div>
+	</div>
+	<div class="col-xs-24">
+      <div class="col-xs-12 emailArrayRow mt10" ng-repeat="email in snapshot.alerts">
+        <span class="col-xs-16">{{email}}</span>
+        <div class="col-xs-3"><button class="btn btn-default btn-xs"
+                type="button"
+                ng-click="removeAlert()">
+          <span class="glyphicon glyphicon-minus"></span> delete
+        </button></div>
+      </div>
+    </div>
+	<hr class="col-xs-24" />
+
+	<div class="col-xs-24"><label>Access Control List</label></div>
+	<div class="col-xs-12 plr0px">
+		<div class="col-xs-24 plr0px">
+			<div class="col-xs-12">
+				<label class="light">Owner<mandatory-field></mandatory-field></label>
+				<input type="text"
+							 name="aclOwnerInput"
+							 ng-model="snapshot.ACL.owner"
+							 ng-pattern="validations.patterns.unixId"
+							 class="form-control"
+							 ng-required="true"
+							 validation-message="{{validations.messages.acl.owner}}"/>
+			</div>
+			<div class="col-xs-12 pl0px">
+				<label class="light">Group<mandatory-field></mandatory-field></label>
+				<input type="text"
+							 name="aclGroupInput"
+							 ng-model="snapshot.ACL.group"
+							 ng-pattern="validations.patterns.unixId"
+							 class="form-control"
+							 ng-required="true"
+							 validation-message="{{validations.messages.acl.group}}" />
+			</div>
+		</div>
+		<div class="col-xs-24">
+			<div class="col-xs-8 plr0px">
+				<label class="light">Permissions<mandatory-field></mandatory-field></label>
+				<acl-permissions acl-model="snapshot.ACL.permission"></acl-permissions>
+			</div>
+		</div>
+	</div>
+  </div>
+
+  <div class="col-xs-24 pb15px mt35">
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
+      </a>
+      <button class="btn nextBtn"
+            ng-disabled="buttonSpinners.show"
+            ng-click="goNext(datasetForm.$invalid)" scroll-to-error>
+      NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+      <button class="btn nextBtn"
+            ng-disabled="datasetForm.$invalid || buttonSpinners.saveShow"
+            ng-click="save(datasetForm.$invalid)" scroll-to-error>
+      SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
+      </button>
+    </div>
+  </div>
+
+</form>
diff --git a/falcon-ui/app/html/snapshot/snapshotFormSummaryStepTpl.html b/falcon-ui/app/html/snapshot/snapshotFormSummaryStepTpl.html
new file mode 100644
index 0000000..8329aa2
--- /dev/null
+++ b/falcon-ui/app/html/snapshot/snapshotFormSummaryStepTpl.html
@@ -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
+ *
+ *     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.
+ */
+-->
+<div id="formSummaryBox" class="col-xs-24">
+  <h4>General</h4>
+  <div>
+    <label>Name</label>:
+    <span>{{snapshot.name}}</span>
+  </div>
+  <div>
+    <label>Type</label> :
+    <span>{{snapshot.type}}</span>
+  </div>
+  <div>
+    <label>Tags</label>:
+    <div ng-repeat="tag in snapshot.tags"><span>{{tag.key}}</span> - <span>{{tag.value}}</span></div>
+  </div>
+
+  <div class="col-xs-12 plr0px mb15">
+    <div>
+      <h4>Source</h4>
+    </div>
+    <div class="box">
+      <h3>{{snapshot.source.cluster}}</h3>
+      <div>
+        <label class="locationBox">Source Directory</label>:
+        <span>{{snapshot.source.directoryPath}}</span>
+      </div>
+      <div>
+        <label>Delete Snapshot After</label>:
+        <span>{{snapshot.source.deleteFrequency.quantity}} {{snapshot.source.deleteFrequency.unit}}</span>
+      </div>
+      <div>
+        <label>Keep Last</label>:
+        <span>{{snapshot.source.retentionNumber}} snapshots</span>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-xs-12 mb15">
+    <div>
+      <h4>Target</h4>
+    </div>
+    <div class="box">
+      <h3>{{snapshot.target.cluster}}</h3>
+      <div>
+        <label class="locationBox">Target Directory</label>:
+        <span>{{snapshot.target.directoryPath}}</span>
+      </div>
+      <div>
+        <label>Delete Snapshot After</label>:
+        <span>{{snapshot.target.deleteFrequency.quantity}} {{snapshot.source.deleteFrequency.unit}}</span>
+      </div>
+      <div>
+        <label>Keep Last</label>:
+        <span>{{snapshot.target.retentionNumber}} snapshots</span>
+      </div>
+    </div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Run On</h4>
+    <div ng-if="snapshot.runOn === 'source'"><span>{{snapshot.source.cluster}}</span></div>
+    <div ng-if="snapshot.runOn === 'target'"><span>{{snapshot.target.cluster}}</span></div>
+  </div>
+
+  <hr />
+
+  <div>
+    <h4 class="lightSubtitle">Run Duration</h4>
+    <div><label>Start on</label>: <span>{{snapshot.validity.start.date|date:'yyyy-MM-dd'}} {{snapshot.validity.start.time|date:'HH:mm'|date:'HH:mm'}}</span></div>
+    <div><label>End on</label>: <span>{{snapshot.validity.end.date|date:'yyyy-MM-dd'}} {{snapshot.validity.end.time|date:'HH:mm'}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Frequency</h4>
+    <div><span>{{snapshot.frequency.quantity}} {{snapshot.frequency.unit}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Timezone</h4>
+    <div><span>{{snapshot.validity.timezone}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">TDE Encryption</h4>
+    <span>{{snapshot.tdeEncryptionEnabled}}</span>
+  <div>
+
+  <div>
+    <h4 class="lightSubtitle">Retry</h4>
+    <label>Policy</label>: <span>{{snapshot.retry.policy}}</span>
+    <label>delay</label>: <span>{{snapshot.retry.delay.quantity}} {{snapshot.retry.delay.unit}}</span>
+    <label>Attempts</label>: <span>{{snapshot.retry.attempts}}</span>
+  </div>
+  <hr />
+
+  <div>
+    <h4 class="lightSubtitle">Allocation</h4>
+    <div>
+      <label>Max Bandwidth</label>:
+      <span>{{snapshot.allocation.distcpMapBandwidth}} MB</span>
+    </div>
+    <div>
+      <label>Max Map Jobs</label>:
+      <span>{{snapshot.allocation.distcpMaxMaps}}</span>
+    </div>
+  </div>
+
+  <div>
+    <h4 ng-if="snapshot.alerts.length > 0" class="lightSubtitle">Alerts</h4>
+    <span>{{ snapshot.alerts.join() }}</span>
+  </div>
+
+  <hr />
+  <h4 class="lightSubtitle">Access Control List</h4>
+  <div>
+    <label>Owner</label>: <span>{{snapshot.ACL.owner}}</span>
+    <label>Group</label>: <span>{{snapshot.ACL.group}}</span>
+    <label>Permissions</label>: <span>{{snapshot.ACL.permission}}</span>
+  </div>
+
+  <div class="col-xs-24 mt35 pb15px plr0px">
+    <button type="button" class="btn prevBtn"
+            ng-click="goBack()"
+            ng-disabled="buttonSpinners.backShow">
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <div class="pull-right">
+      <a class="btn cnclBtn" ui-sref="main">
+        CANCEL
+      </a>
+      <button class="btn nextBtn"
+              ng-disabled="buttonSpinners.saveShow"
+              ng-click="save()">
+        SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
+      </button>
+    </div>
+  </div>
+
+</div>
diff --git a/falcon-ui/app/html/snapshot/snapshotFormTpl.html b/falcon-ui/app/html/snapshot/snapshotFormTpl.html
new file mode 100644
index 0000000..121e82e
--- /dev/null
+++ b/falcon-ui/app/html/snapshot/snapshotFormTpl.html
@@ -0,0 +1,50 @@
+<!--
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<div id="formBox" class="snapshotForm">
+  <div class="col-xs-24">
+    <div class="formBoxContainer detailsBox">
+      <div class="row snapshotProgressBox" ng-class="{ general:isActive('forms.snapshot.general'),
+                                                 summary:isActive('forms.snapshot.summary')}">
+        <div class="progressBar col-xs-24">
+          <div class="text-center" ng-class="{
+                active:isActive('forms.snapshot.general'),
+                completed:isCompleted('forms.snapshot.general')}">General</div>
+          <div class="text-center" ng-class="{
+                active:isActive('forms.snapshot.summary'),
+                completed:isCompleted('forms.snapshot.summary')}">Summary</div>
+        </div>
+      </div>
+
+      <div class="row customContainer">
+        <div class="col-xs-offset-1 col-xs-22">
+          <fieldset ng-disabled="!editXmlDisabled">
+            <div class="formViewContainer">
+              <div class="col-xs-24">
+                <label class="title">
+                  <span class="entypo cycle icon-lg entypo-align-sub"></span> NEW SNAPSHOT BASED MIRROR</label>
+              </div>
+              <div ui-view></div>
+            </div>
+          </fieldset>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/falcon-ui/app/html/snapshot/snapshotSummary.html b/falcon-ui/app/html/snapshot/snapshotSummary.html
new file mode 100644
index 0000000..5762680
--- /dev/null
+++ b/falcon-ui/app/html/snapshot/snapshotSummary.html
@@ -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.
+ */
+-->
+<div id="formSummaryBox" class="summaryBox">
+  <h4>General</h4>
+  <div>
+    <label>Name</label>:
+    <span>{{extension.name}}</span>
+  </div>
+  <div>
+    <label>Type</label> :
+    <span>{{extension.type}}</span>
+  </div>
+  <div>
+    <label>Tags</label>:
+    <div ng-repeat="tag in extension.tags"><span>{{tag.key}}</span> - <span>{{tag.value}}</span></div>
+  </div>
+
+  <div>
+    <h4>Source</h4>
+  </div>
+  <div class="box">
+    <h3>{{extension.source.cluster}}</h3>
+    <div>
+      <label class="locationBox">Source Directory</label>:
+      <span>{{extension.source.directoryPath}}</span>
+    </div>
+    <div>
+      <label>Delete Snapshot After</label>:
+      <span>{{extension.source.deleteFrequency.quantity}} {{extension.source.deleteFrequency.unit}}</span>
+    </div>
+    <div>
+      <label>Keep Last</label>:
+      <span>{{extension.source.retentionNumber}} extensions</span>
+    </div>
+  </div>
+
+  <div>
+    <h4>Target</h4>
+  </div>
+  <div class="box">
+    <h3>{{extension.target.cluster}}</h3>
+    <div>
+      <label class="locationBox">Target Directory</label>:
+      <span>{{extension.target.directoryPath}}</span>
+    </div>
+    <div>
+      <label>Delete Snapshot After</label>:
+      <span>{{extension.target.deleteFrequency.quantity}} {{extension.source.deleteFrequency.unit}}</span>
+    </div>
+    <div>
+      <label>Keep Last</label>:
+      <span>{{extension.target.retentionNumber}} extensions</span>
+    </div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Run On</h4>
+    <div ng-if="extension.runOn === 'source'"><span>{{extension.source.cluster}}</span></div>
+    <div ng-if="extension.runOn === 'target'"><span>{{extension.target.cluster}}</span></div>
+  </div>
+
+  <hr class="col-xs-24" />
+
+  <div>
+    <h4 class="lightSubtitle">Run Duration</h4>
+    <div><label>Start on</label>: <span>{{extension.validity.start.date|date:'yyyy-MM-dd'}} {{extension.validity.start.time|date:'HH:mm'|date:'HH:mm'}}</span></div>
+    <div><label>End on</label>: <span>{{extension.validity.end.date|date:'yyyy-MM-dd'}} {{extension.validity.end.time|date:'HH:mm'}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Frequency</h4>
+    <div><span>{{extension.frequency.quantity}} {{extension.frequency.unit}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Timezone</h4>
+    <div><span>{{extension.validity.timezone}}</span></div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">TDE Encryption</h4>
+    <span>{{extension.tdeEncryptionEnabled}}</span>
+  <div>
+  <div>
+    <h4 class="lightSubtitle">Retry</h4>
+    <label>Policy</label>: <span>{{extension.retry.policy}}</span>
+    <label>delay</label>: <span>{{extension.retry.delay.quantity}} {{extension.retry.delay.unit}}</span>
+    <label>Attempts</label>: <span>{{extension.retry.attempts}}</span>
+  </div>
+  <hr class="col-xs-24" />
+
+  <div>
+    <h4 class="lightSubtitle">Allocation</h4>
+    <div>
+      <label>Max Bandwidth</label>:
+      <span>{{extension.allocation.distcpMapBandwidth}} MB</span>
+    </div>
+    <div>
+      <label>Max Map Jobs</label>:
+      <span>{{extension.allocation.distcpMaxMaps}}</span>
+    </div>
+  </div>
+
+  <div>
+    <h4 ng-if="extension.alerts.length > 0" class="lightSubtitle">Alerts</h4>
+    <span>{{ extension.alerts.join() }}</span>
+  </div>
+
+  <hr class="col-xs-24" />
+  <h4 class="lightSubtitle">Access Control List</h4>
+  <div>
+    <label>Owner</label>: <span>{{extension.ACL.owner}}</span>
+    <label>Group</label>: <span>{{extension.ACL.group}}</span>
+    <label>Permissions</label>: <span>{{extension.ACL.permission}}</span>
+  </div>
+</div>
diff --git a/falcon-ui/app/index.html b/falcon-ui/app/index.html
index 13fbe35..89ca4a9 100644
--- a/falcon-ui/app/index.html
+++ b/falcon-ui/app/index.html
@@ -18,12 +18,14 @@
  */
 -->
 <!DOCTYPE html>
-<html ng-app="app">
+<html ng-app="app" data-ng-controller="ThemeController">
   <head>
     <title>Falcon Web UI</title>
     <meta charset="utf-8">
     <meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
-    <link rel="stylesheet" href="css/main.css"/>
+    <link rel="stylesheet" ng-href="css/{{theme}}-theme.css"/>
+    <link rel="stylesheet" href="css/jquery-ui.css">
+
     <link rel="icon" type="image/x-icon"
       href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAKL2lDQ1BJQ0MgUHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s3BCkeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QoRBwcQl9gdLAAAFKZJREFUeNrtWnl8VuWVft57vy8LoCCrhCVBAgkJYO04rVinFbVacUck7IshZF9YYlgCWQgge8hGQhLZNwHHilW72epo1bZCHQgJSdg3WXREyPZ99z3P/HFvAlqt1VHAmXl/v/vL78td3vc87znPec65F/j/8X97qKs9Yb/EMpgmXf4uf/2XpWP4RdfcmvKcy0tt7V8Z9b8HgPCk1ajImwwA+EHaJpflaeiroAYrqH8D4AZAAPWEvGIp/Wrl8ugL9n1lqMib9P0FIDyhGBUFMc0gPKKglkAh5PLErCXhBWAAMJRSfQCA5CGh+cD+/MjaAQnF2Os843sFQHBCEWoL4hAev2oglHpdKXQgsQtQ60Xkrcqi2A+/MEwSVvc3FZMBToLIzH2Fcc9eeT40Kh9VpYnXNwC3PbMaexZPRmhc4UoFJCmo8g+r/2vyx7+bLZ/xkMQSVORH27E/vRQfLL0c9/1i84OhjBoB/mgQvyfUb6tWxb133XtASGyucWBVioRE5+8DGKQo4VWrU44CQFhMEfYXx33pvQOnlfcSU87sWxxVDwB9o3J7GoY5g4qdQfQA8CMFfABhelVp8svXHQD9IpepyvJp7Bu14ryieudAWcojABAanYeqkqS/u77PpFxVU5bCsISSO5Shtiuo7gAglF/6+7jHvr/s6YsAcP+snb6nLp5PJXC6qb6x0jBkFYiBVBhUUzrl3d4xK3GwOPnaAhA8cYmqXZPKPhOXfqqUsaL6uakZ/WJylbfJYO2aJATHF8Dfx99UUAagoAyFD5ZN8PaZtGKTUhgF4Ncg74RSN0AZZYryMKB+I+QAZaj2IAMB9WZ1acrPAKD35GUdDQt/JLmuds30JX3GL0LNurSvtWbj2zK+54hM1K5JZe8JS97WZEr1c1Mz+k7KNcQC3f72NLWFCdi7IlK37RPO1l0DVasuPe0NUGpaU10dGi5dXOxt8vzWU3epXryeNU0N9S96GurGWh7P0976unu9jY2fNNRfHAIAvZJXwrT4Sc1z0/oTbAyesGRczbo0hKeUXH0P6DV2IQ5vmIle4xZmQKmbDq+bkdJ70nKlRLP2uVQnHa66hSLLDMP4OZRqrZypRaS6ojA2pNvw7P4CvRCG8lFwbTm1NX1t0Jj5/Y9snL3vJwDedubqO34Z6j2XcGJLBvpELoMGcKh8GgInLr6pTbubdMWKqE+vSQj0Gr9oAEWWHNkw8xdB4xapT+vr+PGObIREr+jiaWj8jWm4BkKp9QDeh+J5EAYAAVVHGCqCWp+gwmsH16SuUerrLeuWCctwaO00hKeUJlTkRhWEJ5ehYuV3J54+MwJH5SgA6Dky583PnwsYlXNj4Mh5ZT3GPtvlfzJHWFLZowPiV7X6quv6J5XeF5ZcNvaqe0DgqJwyuF2ZR9fNONFjxCIc32oTUZeR89SZLXMIAD3HLMSxjTO/fPGJJdiXH42whNIQAO0Mhc4EHleKTysoCBApovYY4AVqNijArDjR8SR2Df1MPTEgqfRPe/Oi7uwXX4zKwq9Wj65vTHqjcgDxmjB9A4Xy3vF1M04EjV2IIxsus3Dbzh3YOaXc3JsbqW/o2P6fY2Vl9SaMpwHcrICDJH5JSpBSqtBU8AMA5bJt7h90DkgsOaopiZUFsbtsCS03OOyunPriu8sCx7ZmaWqdcnxzeikAHNkw05Gy5QCA6pVxUErdFJa8+taK3Oi/rxOSr2Bsw8CAxELsy499xWLdCK2xQESqQb4sxOsU+pHynkXebllys1jSV4tMIaW1AfVSeHxxiVNDmLZv85+y4Rt7AAj0GDGvk3K5VrTEauJq7M+fjMqCSPRPKr8NSuYQXFt/ts2u5mt+GvMy3ix+GABQsTIa/aeUdoGg476VURV2tihCRUGcBeAVAK+ExxYNVwpTNPBQVWHcK+GJ5YDhMWi6zlXmReUCyA2LK5oNMCc8vsiPoisAAJZFXK0RllByJRH9y4Ck1bXhSaUtRt+aWvq5CrG818CU8mUDU8o/GTil/O+IITQ6z/4bWxgTGlfIfnH5A1vujS1ouW70oHSExxTZXhdXmBYaV8h+0QUDr2qDIyzOXtCt8Rvd4Yklvw1PLGZ4QtGPv5ily6YPSCk7OjCljANSyhmWVPrTFkkcs8KpI/IUAIROXnlfaEw+Q2Ly4myQV365/I4rtAGLyd8DAP1iCr57w0PiChAWV2AAQFhswcNh8UUMiy862QXpyq79SxUAdHmiSPVPWr1iQHIZBySXXXD+sn9C6UMAEJ5Self/pHJfx/hHr/AChkbnnQKAkJj8r8xWoTH5TgX59Yz/xiSoYBj7ixKkX1xBPoFdpLy1vzCu2xnkcEDyaqMiL4oDkkqf6dTDVUfAf+/KSYqU/wQEFF22ryDqV/1TyqYbUD7K4ICB09a0o2acXQGuTKUItGA+ABwoTvzKeK4qtvsDlasSvnsA+kzOV1VFcRISk/+yaEkg+V5lUcK/hcWvMgGAWrqFJ5acJtl6X97kVhV5k2PCE0umAbiLAs++/OioPtHFvorI3Js76XUI2tFjtQYlxJ5BxpNETWlS4XftyV8bgOCJy1GzOpF9o/O2Q/RDJPZUFSfe0S+2wNxfGKvD41dNAHDQUNZt+/InZ4SnlN4BzIQClioKFPUcAPD1NX9FSoFT+t4tYrWlsGfgzgZQGE6i+mpw2NdKg30il6OmfCr6TFoxg5Y1jAqXaspSfhgSm29UrkrQ4QnFawn+tKIgxgcA+ieXPbcvd9LT4fGr8kiCgLeiIHZx/8SSjgq8l8QCO2XL/XD75aKhHj6vFo8HBQDevO4AqCmfiuDIFb0heqECAGX+EAAOrEqU8Piilyly5/6iuPa2JC1bD2G5IxkSQYLgDtgVUKlBQlHvdX6HKk0fUi5ASwoIKKDqagDwT4fALZFLnfC0fg0t0IKi6rIpNXYaKtpC8qH9nZo6OHo8jtS3782PeiM8rvAZW5ESJJf2inxOgfyFkNhbEH/O9gDeoJTVSwmrIfIDUACF+usKgEPl09ErcukD1Lq3gDi4dnq8owOmKnCEAI8iawpD44o6kVKovd77bWmKp0GCJKqK4nf7+TUOVkI/Cg83P1tEINpzp1bqDyICEYEGjesGgL6Ry22P93gzKAICafbOF4SRWEbKu1VF8bsAwDSMPxCsrCxOOBEaW+JLMIQkQL7t7PYkglCgT4uqJiGaQ9jUWAT7Wigt6roBwOPxuABAUwYJiUPr0hYDAIV/IgmAUQAQGl/4AMhwaD5rG+uZQGf3IdzrGHuv/T+pAYCQ6BU3Otf0M0JCTrIFEN3+ugHgyIYZ3lvGLhohloamTWyhMflzSLQlcahyVdI++2GqhCDE/eFGO73hcWdDQWC3A0B722CEAMCBkimfOrve5WDmcBHyPzQIKnXndcUBQv2oFg1fl88aZ/ezQYGCJNvStfBHFAmkyP7KlVnOyw/eCggBgYDVfaILO5Bw2U4DT0sIiAZFI2RS7sOmy5VNLSDlAQAIGrfo+gCg0eMJBAzUrn/m7b6TV8YTdl636HrD1sYy1Yn1d+3ipqANya7NHgDijAErQEGgICQl8DIABIUUSvahdWm/g8KnlmXhlqeX3XZkfdp14gHaaq0MtcVZ8RyIBii7a1fHX3SYLAJCkNgDAPB6O0I0IFpBNKpXJ1WRdDvG2qh0f6u5tXAaoALltp+vPmG4TPccEvDW1yVf8xAIGrOgeZGBWnvXhSYUdqSwCwkA6iUACI7Ju8NWeoRX0fEI9bOW+OflEsohQJCCkCG773B8oLIZmMPvbBt/eOPMPCp4LJHxANB/3IprB8CRjbPsDRU57u/jf1wam4Y1WyWWtRUADOHwZqMOFiftdUwdiM8jQN3CiCCgLd3H8Z63QYFzLAcAH9M1SWsLgaPnx+5bP+Xah4CCaji8adZ+EQmlsndbUZ2yw0Pf1uLaLXEt/aiI5qNXXK4bMM/Yd1IIQine5zQy/+ikQlJ0u96RS+85ujl9gzJdf2toalzmNGHNawqA28dd7fTRw5UQimhobNvK6+x2SMu2trQM6a+EUAIoIQwvgsXvxjMQCoSECCAyAgBcbv/dDgCaJOi1ygEgoEPHu7SIf8DI7GnHNqfrawpA30EPjHUYW1MIUs4eXxmre8YW+UDYxTaILakNWgIp9FIEFMIQHVabP9GiyHmKkEJSxKdvVG7vA6VJnxCopohBEVLroF7jnx29Z1VCXWv/Vo81NDYu/VnyZr+uT2WpruMWXn0Auo6ch7dSBl0RDQSAOgDw0U0mKYbj/meviBmBgoICoQgRuc1pf/8VoBvKbl1rj9d5e6FSNWhoUGlbCa4HgGObZr/kdrlzK05U/vn09gxePHfq6gNwesucK1xb6mxes4sVNjb5NGcAUrpfqe+dQ5EARIIAQENW2REgSoQgJBEAhsxM26XISxBqkKTWRtDo+dsA4Oz2rCkCnu0SkZF86dV89J645Np1hET4V5vx2VysKJKg2KF9GQD57AEMtic03wV4GSHRvr0nLnmgMExRGa65mmJqUmmCXm0Nv2XMosEA8PHOnPu04P7uoxcMPLgm9doBYJjmYSe1CQBoBWlJc3LF5z9XpkASEAkAgINrpp0neYg2CygSEMubZqfcmSsUYDnSUIEUj9X4OgC0ezzVPL8966Emj8fvmvYED65J3WJXgOhyV+4rhr/LbTsyBUJB36ilHZwQULSHnd4oCJ645EEAME3XaoiYjhcAwsG9Ji7pap9z3y1CJUKK0NBa0C0ia98nLy7RAcOy1LntmX/u/i0S4dcCoM+E5Y7TGyeF0v5sRY2P+LTytmQGIbyadzjK8QJJ8zIPEJZlTQCA2rXPLBKloEGlQWoS9Hp2AsDRTbPeNl2u1XYY2Oe8Wod3i8h66dSODHZ/Kgsn1s+8NgDUrJ0Kpy+QRxJNTY3GgVWxTQCPOHEN5bV+bCth9aGQhoBoPkgZwss88e+QlkqJFA4KHvdscEBElnliy5xoH9N8WyiqmUo92vtIj5HZy05sz0BARPa1CwEAaNWqzToK4QL/1U75rNBCaBKW19vP9hJzd3MrsKUlqKVN8LhFfQHAz+eGWAK2JiKVFhGPZf3+1LYM7bonDie2ZdzlNl1/0iLKbpNR6puapnYbkb3w1La56D4iW10TAIInLkXV6uQzSqm9mhxnKzmfV1rYXikbFK+3yE6NzRxACAlNnQsAB9YknYHCC6QoJ40qLbpn0JgFT1ivF+Hm4Vnq9POZP/Fxu3fYKVMsEWF9U+OMgIjMRSe2zmXn4XONqw5A7Zrpzga7xmuv924AGD44qARQsNO9BI5K+T3atr3pIgDPFRygAGrLsu65b+EuFwDc2KrdeCcjEk4qtSzvCwDw4fMZ7DEqx/xwW+ZTbh/fJ5Rh+AihhJC6Js8zHYfNWX/2+Wy5JiHgtMn2GC7j47DYfL9FEyNA4AMRwhKNdz76y5C9xfEXSbzfXCE4h0nSt7Zi73gAqChLvGSYrgwRKi2AUMHSgu4j570IANrj0Y/NegFnn8988dTOHMPX7d5EEUNE0NTkGdth6Jy/5T1fbQJAtxHZVw+AW8YvRMfHMmAarlENFy/dDABu01UkQlAAj6cpGgB83b4Z1FS27ndqQMKyvN6lzc86vjk92zTMKmkOBZJer/VY4KicYad2ZGPv8SqETFyM4KcyeXZH9phuXbv2cLldiw3TRL2n6db0zWutmyMyHz+5da4t278mQX5jIgmeMB+1a2cDAHqMnIfjW+agy/AMj9babRjGmTPPZ92slEJARNZ5EelwxUwEoHzcPncf2zT7DQCImPmC683aD7xaRAMw7ZJBoWfnTp3+XJh4Pmj0AhzZNAsBI7JxyjEUAALHLHjs/KefDnKbZprL5drtY5hRp7bN3X1VAPii0W1E1rgmj2edUgpul6vfqW2ZVb1Gzp9Q521aA6XYMh8Jl2mePrUtI6BvxCJUb0tDzzGLejQ21h0TinY8UyllnD+3I7vT5+cJGPcs2p47h8pXl322aIvINk5vmyvXBoB7ooDXS9HxyfTzlmV1aOXn/+KpbRlPAEDA8IyTWusA2B9A0gFB+fr6P3hs8+zXuk8owIm1Ceg1dknnS/WfntEiopw60mW69p/ZkRXe6cnZ5rmd87/1nsC39/rpdfs7oNat2jwMw0C9xzO45Q2sr9/DohQ0SUf9KQ3Ao735AKAazwMADm9IPduq9Y3dTdNQIqIEpMfyhHUaNvcvzcb3HLvoOgUAQHDCEhzdMONdH5dPIUXadonI/HGHYXPVsQ0z97hN12KSqqUjRNLr8QYHjp4/5PjWTHQbvQgPvkocXZ968v0F2aZhut4nqQjAo63bOwxNryGJYxvS0H3kvOsTgNqCVASNWajObs9MMAzzhGVZ6z7akc02Q9JwaltGmmkYv7pCHiuCqG9q3AAATY0X1asP2hEZlprGj3bOu93fzy8FUKAmvJYV3H5oel1o5NLeJ7bMgfnAt9Mo/U5eQHYYNtf8aEe2bvv4LHZse0PIwXUzq/1/MRUNry1Hp2Fzq72Wt88VDUTl7+uXdnpbxuIWkhuRA69uwLnt83Hv9DWt/3b4UL6lrYlaCwzDgK+v7/Rzz2cuu24BaB7dxy1sU9/QMPrj7dklPUcvwLFNdou907C57zdZ3h8299YMpVRQ1+7tKw7VXPC8tryFxbuOexan189oeV67oekrSUnyWF64Xe6Pb2rdaujRjelvtGShiGyc3Db3+gCg66gcnN6cbi/8ydn4ZOf8z3nJnDLLa0UC0CRNt8t14KMXckKDxy5RtRtS/+FXYT3HLPjRhbq6DK31YB+321+0TLvBz/fl41vnVgNAj1ELcXzzzGvvAV86Bo0D3lmPbiPnjbtUX79OnE5SK1//hWd2ZM76h1pjVA5OOsACwI1D026EmP3a+rd60ivicbvcG49vmlmF6310Gz1fAcAdc9b6tB+afqD1o2ls/cgzDBiVfR8AdInI+spn9ByZY7Qflu5y/XzKZ16a9Bi9EN+b0fmpDBMAbo7IfKTtE7MutHl0BruNyhnwvTPkm46eoxd85neX4ZlPdBw294OQyLw2V2P+/waCldfgs3UggwAAAABJRU5ErkJggg=="/>
   </head>
@@ -34,11 +36,11 @@
     </section>
 
     <section class="container-fluid">
-      <div class="row mainUIView" ui-view id="mainUIView"></div>
+      <div ng-if="!httpError" class="row mainUIView" ui-view id="mainUIView"></div>
+      <div ng-if="httpError" class="row mainUIView" error-nav id="errorView"></div>
     </section>
 
     <script src="js/vendor.min.js"></script>
     <script src="js/main.min.js"></script>
-
   </body>
 </html>
diff --git a/falcon-ui/app/js/app.js b/falcon-ui/app/js/app.js
index 5ae7eb6..1d781bc 100644
--- a/falcon-ui/app/js/app.js
+++ b/falcon-ui/app/js/app.js
@@ -23,26 +23,36 @@
     'ui.router',
     'ngCookies',
     'ngAnimate',
+    'ngStorage',
     'ngMessages',
     'checklist-model',
     'app.controllers',
     'app.directives',
     'app.services',
     'ngTagsInput',
-    'nsPopover', 'ngAnimate', 'ngMask', 'dateHelper'
+    'nsPopover',
+    'ngMask',
+    'dateHelper',
+    'focus-if',
+	'routeHelper'
   ]);
-
-  app.config(["$stateProvider", "$urlRouterProvider", "$httpProvider", function ($stateProvider, $urlRouterProvider, $httpProvider) {
+  app.constant('APP_CONSTANTS',{
+    enableXSRFHeader : true
+  });
+  app.config(["$stateProvider", "$urlRouterProvider", "$httpProvider", 'APP_CONSTANTS', function ($stateProvider, $urlRouterProvider, $httpProvider, AppConstants) {
 
     $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');
 
+    if (AppConstants.enableXSRFHeader ){
+      $httpProvider.defaults.headers.common['X-XSRF-HEADER'] = Math.round(Math.random()*100000);
+    }
     $httpProvider.defaults.headers.common["X-Requested-By"] = 'X-Requested-By';
 
     $urlRouterProvider.otherwise("/");
 
     $stateProvider
       .state('main', {
-        url: '/',
+        url: '/?fromAction',
         templateUrl: 'html/mainTpl.html',
         controller: 'DashboardCtrl'
       })
@@ -61,8 +71,16 @@
         templateUrl: 'html/formsTpl.html'
       })
       .state('forms.cluster', {
+        url : '/cluster?name&action',
         controller: 'ClusterFormCtrl',
-        templateUrl: 'html/cluster/clusterFormTpl.html'
+        templateUrl: 'html/cluster/clusterFormTpl.html',
+        resolve : {
+          ClusterModel : ['$stateParams', 'EntityDetails', function($stateParams, EntityDetails){
+            if($stateParams.name !== null){
+              return EntityDetails.getEntityDefinition("cluster", $stateParams.name);
+            }
+          }]
+        }
       })
       .state('forms.cluster.general', {
         templateUrl: 'html/cluster/clusterFormGeneralStepTpl.html'
@@ -71,12 +89,50 @@
         templateUrl: 'html/cluster/clusterFormSummaryStepTpl.html'
       })
       .state('forms.feed', {
+        url : '/feed?name&action',
         templateUrl: 'html/feed/feedFormTpl.html',
-        controller: 'FeedController'
+        controller: 'FeedController',
+        resolve : {
+          FeedModel : ['$stateParams', 'EntityDetails', 'FileApi','X2jsService', function($stateParams, EntityDetails, FileApi, X2jsService){
+            if($stateParams.action === 'import'){
+              var feedJson = X2jsService.xml_str2json(FileApi.fileRaw);
+              return feedJson;
+            }
+            if($stateParams.name !== null){
+              var modelPromise = EntityDetails.getEntityDefinition("feed", $stateParams.name);
+              return modelPromise.then(function(model){
+                if($stateParams.action === "edit"){
+                  model.edit = true;
+                }else if($stateParams.action === "clone"){
+                  model.clone = true;
+                }
+                return model;
+              });
+            }
+          }],
+          datasourcesList: ['Falcon', function (Falcon) {
+            return Falcon.getEntities('datasource').then(
+              function (response) {
+                return response.data;
+              });
+          }]
+        }
       })
       .state('forms.feed.general', {
         templateUrl: 'html/feed/feedFormGeneralStepTpl.html',
-        controller: 'FeedGeneralInformationController'
+        controller: 'FeedGeneralInformationController',
+        resolve: {
+          clustersList: ['Falcon', function (Falcon) {
+            return Falcon.getEntities('cluster').then(
+              function (response) {
+                return response.data;
+              });
+          }]
+        }
+      })
+      .state('forms.feed.advanced', {
+        templateUrl: 'html/feed/feedFormAdvancedStepTpl.html',
+        controller: 'FeedAdvancedController'
       })
       .state('forms.feed.properties', {
         templateUrl: 'html/feed/feedFormPropertiesStepTpl.html',
@@ -103,33 +159,39 @@
         controller: 'FeedSummaryController'
       })
       .state('forms.process', {
+        url : '/process?name&action',
         templateUrl: 'html/process/processFormTpl.html',
-        controller: 'ProcessRootCtrl'
+        controller: 'ProcessRootCtrl',
+        resolve : {
+          ProcessModel : ['$stateParams', 'EntityDetails', 'FileApi','X2jsService', function($stateParams, EntityDetails, FileApi, X2jsService){
+            if($stateParams.action === 'import'){
+              var processJson = X2jsService.xml_str2json(FileApi.fileRaw);
+              return processJson;
+            }
+            if($stateParams.name !== null){
+              var modelPromise = EntityDetails.getEntityDefinition("process", $stateParams.name);
+              return modelPromise.then(function(model){
+                if($stateParams.action === "edit"){
+                  model.edit = true;
+                }else if($stateParams.action === "clone"){
+                  model.clone = true;
+                }
+                return model;
+              });
+            }
+          }]
+        }
       })
       .state('forms.process.general', {
         templateUrl: 'html/process/processFormGeneralStepTpl.html',
-        controller: 'ProcessGeneralInformationCtrl'
-      })
-      .state('forms.process.properties', {
-        templateUrl: 'html/process/processFormPropertiesStepTpl.html',
-        controller: 'ProcessPropertiesCtrl'
-      })
-      .state('forms.process.clusters', {
-        templateUrl: 'html/process/processFormClustersStepTpl.html',
-        controller: 'ProcessClustersCtrl',
+        controller: 'ProcessGeneralInformationCtrl',
         resolve: {
           clustersList: ['Falcon', function (Falcon) {
             return Falcon.getEntities('cluster').then(
               function (response) {
                 return response.data;
               });
-          }]
-        }
-      })
-      .state('forms.process.io', {
-        templateUrl: 'html/process/processFormInputsAndOutputsStepTpl.html',
-        controller: 'ProcessInputsAndOutputsCtrl',
-        resolve: {
+          }],
           feedsList: ['Falcon', function (Falcon) {
             return Falcon.getEntities('feed').then(
               function (response) {
@@ -138,11 +200,16 @@
           }]
         }
       })
+      .state('forms.process.advanced', {
+        templateUrl: 'html/process/processFormAdvancedStepTpl.html',
+        controller: 'ProcessAdvancedCtrl'
+      })
       .state('forms.process.summary', {
         templateUrl: 'html/process/processFormSummaryStepTpl.html',
         controller: 'ProcessSummaryCtrl'
       })
       .state('entityDetails', {
+        url : '/entity?name&type',
         views: {
           '': {
             controller: 'EntityDetailsCtrl',
@@ -153,10 +220,25 @@
           },
           'processSummary@entityDetails': {
             templateUrl: 'html/process/processSummary.html'
+          },
+          'clusterSummary@entityDetails': {
+            templateUrl: 'html/cluster/clusterSummary.html'
+          },
+          'snapshotSummary@entityDetails': {
+            templateUrl: 'html/snapshot/snapshotSummary.html'
+          },
+          'datasetSummary@entityDetails': {
+            templateUrl: 'html/dataset/datasetSummary.html'
           }
+        },
+        resolve : {
+          entity : ['$stateParams', 'EntityDetails', function($stateParams, EntityDetails){
+            return EntityDetails.getEntityDetails($stateParams.name, $stateParams.type.toLowerCase());
+          }]
         }
       })
       .state('forms.dataset', {
+        url : '/dataset?name&action',
         controller: 'DatasetCtrl',
         templateUrl: 'html/dataset/datasetFormTpl.html',
         resolve: {
@@ -165,6 +247,19 @@
               function (response) {
                 return response.data.entity;
               });
+          }],
+          DatasetModel : ['$stateParams', 'EntityDetails', function($stateParams, EntityDetails){
+            if($stateParams.name !== null){
+              var modelPromise = EntityDetails.getEntityDefinition("process", $stateParams.name);
+              return modelPromise.then(function(model){
+                if($stateParams.action === "edit"){
+                  model.edit = true;
+                }else if($stateParams.action === "clone"){
+                  model.clone = true;
+                }
+                return model;
+              });
+            }
           }]
         }
       })
@@ -174,10 +269,81 @@
       .state('forms.dataset.summary', {
         templateUrl: 'html/dataset/datasetFormSummaryStepTpl.html'
       })
+      .state('forms.snapshot', {
+	url : '/snapshot?name&action',
+	controller: 'SnapshotController',
+	templateUrl: 'html/snapshot/snapshotFormTpl.html',
+	resolve: {
+	  clustersList: ['Falcon', function (Falcon) {
+			return Falcon.getEntities('cluster').then(
+			  function (response) {
+				  return response.data;
+			  });
+	  }],
+	  SnapshotModel : ['$stateParams', 'EntityDetails', function($stateParams, EntityDetails){
+			if ($stateParams.name !== null) {
+			  var modelPromise = EntityDetails.getEntityDefinition("process", $stateParams.name);
+			  return modelPromise.then(function(model){
+				if ($stateParams.action === "edit") {
+				  model.edit = true;
+				} else if($stateParams.action === "clone") {
+				  model.clone = true;
+				}
+				return model;
+			  });
+			}
+		}]
+	}
+      })
+      .state('forms.snapshot.general', {
+        templateUrl: 'html/snapshot/snapshotFormGeneralStepTpl.html'
+      })
+      .state('forms.snapshot.advanced', {
+        templateUrl: 'html/snapshot/snapshotFormAdvancedStepTpl.html'
+      })
+      .state('forms.snapshot.summary', {
+        templateUrl: 'html/snapshot/snapshotFormSummaryStepTpl.html'
+      })
       .state('instanceDetails', {
         templateUrl: 'html/instanceDetails.html',
         controller: 'InstanceDetailsCtrl'
       })
+      .state('forms.datasource', {
+        url : '/datasource?name&action',
+        templateUrl: 'html/datasource/datasourceFormTpl.html',
+        controller: 'DatasourceController',
+        resolve : {
+          DatasourceModel : ['$stateParams', 'EntityDetails', 'FileApi', 'X2jsService', function($stateParams, EntityDetails, FileApi, X2jsService){
+            if($stateParams.action === 'import'){
+              var dataSourceJson = X2jsService.xml_str2json(FileApi.fileRaw);
+              return dataSourceJson;
+            }
+            if($stateParams.name !== null){
+              var modelPromise = EntityDetails.getEntityDefinition("datasource", $stateParams.name);
+              return modelPromise.then(function(model){
+                if($stateParams.action === "edit"){
+                  model.edit = true;
+                } else if($stateParams.action === "clone"){
+                  model.clone = true;
+                }
+                return model;
+              });
+            }
+          }]
+        }
+      })
+      .state('forms.datasource.general', {
+        templateUrl: 'html/datasource/datasourceFormGeneralStepTpl.html',
+        controller: 'DatasourceGeneralInformationController'
+      })
+      .state('forms.datasource.advanced', {
+        templateUrl: 'html/datasource/datasourceFormAdvancedStepTpl.html',
+        controller: 'DatasourceAdvancedController'
+      })
+      .state('forms.datasource.summary', {
+        templateUrl: 'html/datasource/datasourceFormSummaryStepTpl.html',
+        controller: 'DatasourceSummaryController'
+      })
     ;
 
   }]);
@@ -185,6 +351,25 @@
   app.run(['$rootScope', '$state', '$location', '$http', '$stateParams', '$cookieStore', 'SpinnersFlag', 'ServerAPI', '$timeout', '$interval',
     function ($rootScope, $state, $location, $http, $stateParams, $cookieStore, SpinnersFlag, ServerAPI, $timeout, $interval) {
 
+      $rootScope.ambariView = function () {
+        var location_call = $location.absUrl();
+        var index_call = location_call.indexOf("views/");
+        if (index_call !== -1) {
+          return true;
+        } else {
+          return false;
+        }
+      };
+
+      var location = $location.absUrl();
+      var index = location.indexOf("views/");
+      if (index !== -1) {
+        index = index + 6;
+        var path = location.substring(index);
+        var servicePaths = path.split("/");
+        $rootScope.serviceURI = '/api/v1/views/' + servicePaths[0] + '/versions/' + servicePaths[1] + '/instances/' + servicePaths[2] + '/resources/proxy';
+      }
+
       if(!$rootScope.secureModeDefined){
         $rootScope.secureMode = false;
         ServerAPI.clearUser().then(function() {
@@ -196,6 +381,13 @@
                     $rootScope.secureMode = true;
                   }
                 }
+                if (property.key == 'safemode') {
+                  if (property.value == 'true') {
+                    $rootScope.safeMode = true;
+                  } else {
+                    $rootScope.safeMode = false;
+                  }
+                }
               });
             }
             $rootScope.secureModeDefined = true;
@@ -203,25 +395,6 @@
         });
       }
 
-      var location = $location.absUrl();
-      var index = location.indexOf("views/");
-      if (index !== -1) {
-        index = index + 6;
-        var path = location.substring(index);
-        var servicePaths = path.split("/");
-        $rootScope.serviceURI = '/api/v1/views/' + servicePaths[0] + '/versions/' + servicePaths[1] + '/instances/' + servicePaths[2] + '/resources/proxy';
-      }
-
-      $rootScope.ambariView = function () {
-        var location_call = $location.absUrl();
-        var index_call = location_call.indexOf("views/");
-        if (index_call !== -1) {
-          return true;
-        } else {
-          return false;
-        }
-      };
-
       $rootScope.isSecureMode = function () {
         if(!$rootScope.secureModeDefined){
           return false;
@@ -233,14 +406,10 @@
       };
 
       $rootScope.userLogged = function () {
-        if($rootScope.ambariView()){
+        if (angular.isDefined($cookieStore.get('userToken')) && $cookieStore.get('userToken') !== null) {
           return true;
         } else {
-          if (angular.isDefined($cookieStore.get('userToken')) && $cookieStore.get('userToken') !== null) {
-            return true;
-          } else {
-            return false;
-          }
+          return false;
         }
       };
 
@@ -338,4 +507,4 @@
 
     }]);
 
-})();
\ No newline at end of file
+})();
diff --git a/falcon-ui/app/js/controllers/cluster/cluster-module.js b/falcon-ui/app/js/controllers/cluster/cluster-module.js
index d0fdf86..1f54756 100644
--- a/falcon-ui/app/js/controllers/cluster/cluster-module.js
+++ b/falcon-ui/app/js/controllers/cluster/cluster-module.js
@@ -26,19 +26,58 @@
    */
   var clusterModule = angular.module('app.controllers.cluster', [ 'app.services' ]);
 
-  clusterModule.controller('ClusterFormCtrl', [ "$scope", "$interval", "Falcon", "EntityModel", "$state",
-                                                "X2jsService", "ValidationService", "SpinnersFlag", "$timeout", "$rootScope", "$cookieStore",
-                                              function ($scope, $interval, Falcon, EntityModel, $state,
-                                                        X2jsService, validationService, SpinnersFlag, $timeout, $rootScope, $cookieStore) {
+  clusterModule.controller('ClusterFormCtrl', [
+    "$scope", "$interval", "Falcon", "EntityModel", "$state", "FileApi", "X2jsService", "ValidationService",
+    "SpinnersFlag", "$timeout", "$rootScope", "$cookieStore", "$stateParams", "ClusterModel",
+    function ($scope, $interval, Falcon, EntityModel, $state, FileApi, X2jsService, validationService,
+      SpinnersFlag, $timeout, $rootScope, $cookieStore, $stateParams, clusterModel) {
 
-      $scope.clusterEntity = EntityModel;
+      if (clusterModel && $stateParams.action === 'clone') {
+        $scope.cloningMode = true;
+        $scope.editingMode = false;
+        $scope.clusterEntity = { 'clusterModel' : clusterModel };
+        $scope.clusterEntity.clusterModel.name = "";
+      } else if(clusterModel && $stateParams.action === 'edit') {
+        $scope.editingMode = true;
+        $scope.cloningMode = false;
+        $scope.clusterEntity = { 'clusterModel' : clusterModel };
+      } else{
+        $scope.editingMode = false;
+        $scope.cloningMode = false;
+        $scope.clusterEntity = EntityModel;
+      }
+
+      if ($rootScope.secureMode) {
+        $scope.clusterEntity.clusterModel.cluster.properties.property[0]
+          = {_name : 'dfs.namenode.kerberos.principal', _value : 'nn/_HOST@EXAMPLE.COM'}
+      }
+      $scope.$watch("clusterEntity.clusterModel.cluster._name",function(){
+        if ($scope.editingMode) {
+          return;
+        }
+        $scope.clusterEntity.clusterModel.cluster.locations.location.forEach (function(loc, index) {
+          if (loc._name === "staging") {
+            loc._path = "/apps/falcon/"
+              + ($scope.clusterEntity.clusterModel.cluster._name ? $scope.clusterEntity.clusterModel.cluster._name + "/" : "")
+              + "staging";
+          } else if (loc._name === "working") {
+            loc._path = "/apps/falcon/"
+              + ($scope.clusterEntity.clusterModel.cluster._name ? $scope.clusterEntity.clusterModel.cluster._name + "/" : "")
+              + "working";
+          }
+        });
+      });
+
       $scope.xmlPreview = { edit: false };
       $scope.secondStep = false;
 
+      $scope.enableCustomSparkInterface = function() {
+        $scope.customSparkInterfaceEnabled = !$scope.customSparkInterfaceEnabled;
+      }
       function normalizeModel() {
         //------------INTERFACE-----------//
-        var requiredInterfaceFields = ["readonly", "write", "execute", "workflow", "messaging", "registry"],
-          requiredLocationFields = ["staging", "temp", "working", ""],
+        var requiredInterfaceFields = ["readonly", "write", "execute", "workflow", "messaging", "registry", "spark"],
+          requiredLocationFields = ["staging", "temp", "working"],
           modelInterfaceArray = $scope.clusterEntity.clusterModel.cluster.interfaces.interface,
           modelLocationsArray = $scope.clusterEntity.clusterModel.cluster.locations.location;
 
@@ -47,10 +86,12 @@
             if (element._type === requiredField) { requiredInterfaceFields.splice(requiredField, 1); }
           });
         });
-        $scope.registry = { check: true };
+        $scope.registry = { check: false };
+        $scope.spark = { check: false };
+        $scope.customSparkInterfaceEnabled = false;
         requiredInterfaceFields.forEach(function (fieldToPush) {
           var fieldObject = { _type: fieldToPush, _endpoint: "", _version: "" };
-          if (fieldToPush === "registry") { $scope.registry = { check: false }; }
+          //if (fieldToPush === "registry") { $scope.registry = { check: true }; }
           modelInterfaceArray.push(fieldObject);
         });
         //--------------TAGS--------------//
@@ -64,15 +105,17 @@
         //-------------ACL----------------//
         if (!$scope.clusterEntity.clusterModel.cluster.ACL) {
           angular.copy(EntityModel.defaultValues.cluster.cluster.ACL, $scope.clusterEntity.clusterModel.cluster.ACL);
-          $scope.clusterEntity.clusterModel.cluster.ACL._owner = $cookieStore.get('userToken').user;
           /*$scope.clusterEntity.clusterModel.cluster.ACL = {
             _owner: "", _group: "", _permission: ""
           };*/
         }
+        if ($cookieStore.get('userToken') && !$scope.clusterEntity.clusterModel.cluster.ACL._owner) {
+          $scope.clusterEntity.clusterModel.cluster.ACL._owner = $cookieStore.get('userToken').user;
+        }
         //------------Location------------//
         modelLocationsArray.forEach(function(element) {
-          requiredLocationFields.forEach(function(requiredField) {
-            if(element._name === requiredField) { requiredLocationFields.splice(requiredField, 1); }
+          requiredLocationFields.forEach(function(requiredField, index) {
+            if(element._name === requiredField) { requiredLocationFields.splice(index, 1); }
           });
         });
         requiredLocationFields.forEach(function(fieldToPush) {
@@ -87,8 +130,13 @@
       }
 
       function cleanModel() {
+
+         if (!$scope.clusterEntity.clusterModel.cluster._description) {
+          $scope.clusterEntity.clusterModel.cluster._description = '';
+        }
+
         //if registry check is false backups the object and removes it from array
-        if (!$scope.registry.check) {
+        if ($scope.registry && !$scope.registry.check) {
           $scope.clusterEntity.clusterModel.cluster.interfaces.interface.forEach(function(registry, index) {
             if (registry._type === "registry") {
               $scope.backupRegistryObject = $scope.clusterEntity.clusterModel.cluster.interfaces.interface[index];
@@ -96,20 +144,31 @@
             }
           });
         }
+        if ($scope.spark && !$scope.spark.check) {
+          $scope.clusterEntity.clusterModel.cluster.interfaces.interface.forEach(function(spark, index) {
+            if (spark._type === "spark") {
+              $scope.backupSparkObject = $scope.clusterEntity.clusterModel.cluster.interfaces.interface[index];
+              $scope.clusterEntity.clusterModel.cluster.interfaces.interface.splice(index, 1);
+            }
+          });
+        }
         //deletes property empty last object and array if empty
-        var lastOne = $scope.clusterEntity.clusterModel.cluster.properties.property.length - 1;
-        if (
-          $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._name === "" ||
-          $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._name === undefined ||
-          $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._value === "" ||
-          $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._value === undefined
-        ) {
+        if($scope.clusterEntity.clusterModel.cluster.properties){
+          var lastOne = $scope.clusterEntity.clusterModel.cluster.properties.property.length - 1;
+          if (
+            $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._name === "" ||
+            $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._name === undefined ||
+            $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._value === "" ||
+            $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._value === undefined
+          ) {
 
-          $scope.removeProperty(lastOne);
+            $scope.removeProperty(lastOne);
+          }
+          if ($scope.clusterEntity.clusterModel.cluster.properties.property.length === 0) {
+            delete $scope.clusterEntity.clusterModel.cluster.properties;
+          }
         }
-        if ($scope.clusterEntity.clusterModel.cluster.properties.property.length === 0) {
-          delete $scope.clusterEntity.clusterModel.cluster.properties;
-        }
+
         var lastLocationIndex = $scope.clusterEntity.clusterModel.cluster.locations.location.length - 1;
         if (
           $scope.clusterEntity.clusterModel.cluster.locations.location[lastLocationIndex]._name === "" ||
@@ -161,11 +220,13 @@
 
       $scope.convertTags = function () {
         var result = [];
-        $scope.tagsArray.forEach(function(element) {
-          if(element.key && element.value) {
-            result.push(element.key + "=" + element.value);
-          }
-        });
+        if($scope.tagsArray) {
+          $scope.tagsArray.forEach(function(element) {
+            if(element.key && element.value) {
+              result.push(element.key + "=" + element.value);
+            }
+          });
+        }
         result = result.join(",");
         $scope.clusterEntity.clusterModel.cluster.tags = result;
       };
@@ -188,6 +249,14 @@
           $scope.convertTags();
         }
       };
+       $scope.toggleclick = function () {
+         $('.formBoxContainer').toggleClass('col-xs-14 ');
+         $('.xmlPreviewContainer ').toggleClass('col-xs-10 hide');
+         $('.preview').toggleClass('pullOver pullOverXml');
+         ($('.preview').hasClass('pullOver')) ? $('.preview').find('button').html('Preview XML') : $('.preview').find('button').html('Hide XML');
+         ($($("textarea")[0]).attr("ng-model") == "prettyXml" ) ? $($("textarea")[0]).css("min-height", $(".formBoxContainer").height() - 40 ) : '';
+       };
+
       //-------------------------------------//
       //----------LOCATION-------------------//
 
@@ -219,10 +288,45 @@
           $scope.clusterEntity.clusterModel.cluster.properties.property.splice(index, 1);
         }
       };
-      //--------------------------------------//
+
+      $scope.isActive = function (route) {
+          return route === $state.current.name;
+      };
+
+      $scope.isCompleted = function (route) {
+          return $state.get(route).data && $state.get(route).data.completed;
+      };
+
+      $scope.validateLocations = function(){
+        var stagingLoc;
+        var workingLoc;
+        $scope.clusterEntity.clusterModel.cluster.locations.location.forEach(function(location){
+          if(location._name == "staging"){
+            stagingLoc = location._path;
+          }
+          if(location._name == "working"){
+            workingLoc = location._path;
+          }
+        });
+        if(stagingLoc && workingLoc && stagingLoc == workingLoc){
+          $scope.locationsEqualError = true;
+        }else{
+          $scope.locationsEqualError = false;
+        }
+        return $scope.locationsEqualError;
+      };
+                                                  //--------------------------------------//
       $scope.goSummaryStep = function (formInvalid) {
-        SpinnersFlag.show = true;
-        if (!$scope.validations.nameAvailable || formInvalid) {
+          $state.current.data = $state.current.data || {};
+          $state.current.data.completed = !formInvalid;
+
+          SpinnersFlag.show = true;
+          if($scope.validateLocations()){
+          SpinnersFlag.show = false;
+          return;
+        }
+
+          if (!$scope.validations.nameAvailable || formInvalid) {
           validationService.displayValidations.show = true;
           validationService.displayValidations.nameShow = true;
           SpinnersFlag.show = false;
@@ -236,6 +340,12 @@
         }, 500);
 
       };
+
+      $scope.hideMessage = function (){
+        angular.element('.nameValidationMessage').hide();
+      };
+
+
       $scope.goGeneralStep = function () {
         SpinnersFlag.backShow = true;
         $scope.secondStep = false;
@@ -244,7 +354,15 @@
         $scope.validations.nameAvailable = true;
         if(!$scope.registry.check) {
           //recovers previously deleted registry object
-          $scope.clusterEntity.clusterModel.cluster.interfaces.interface.push($scope.backupRegistryObject);
+          if($scope.backupRegistryObject){
+            $scope.clusterEntity.clusterModel.cluster.interfaces.interface.push($scope.backupRegistryObject);
+          }
+        }
+        if(!$scope.spark.check) {
+          //recovers previously deleted spark object
+          if($scope.backupSparkObject){
+            $scope.clusterEntity.clusterModel.cluster.interfaces.interface.push($scope.backupSparkObject);
+          }
         }
         if(!$scope.clusterEntity.clusterModel.cluster.tags) {
           $scope.clusterEntity.clusterModel.cluster.tags = "";
@@ -261,23 +379,48 @@
         SpinnersFlag.show = true;
         $scope.saveModelBuffer();
         Falcon.logRequest();
-        Falcon.postSubmitEntity($scope.jsonString, "cluster").success(function (response) {
-           $scope.skipUndo = true;
-           Falcon.logResponse('success', response, false);
-           $state.go('main');
-         }).error(function (err) {
-           SpinnersFlag.show = false;
-           Falcon.logResponse('error', err, false);
-           angular.element('body, html').animate({scrollTop: 0}, 300);
-         });
+        if($scope.editingMode) {
+          Falcon.postUpdateEntity($scope.jsonString, "cluster", $scope.clusterEntity.clusterModel.cluster._name)
+            .success(function (response) {
+              $scope.skipUndo = true;
+              Falcon.logResponse('success', response, false);
+              $state.go('main');
+            })
+            .error(function(err) {
+              SpinnersFlag.show = false;
+              Falcon.logResponse('error', err, false);
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        } else {
+          Falcon.postSubmitEntity($scope.jsonString, "cluster")
+            .success(function (response) {
+              $scope.skipUndo = true;
+              Falcon.logResponse('success', response, false);
+              $state.go('main');
+            })
+            .error(function(err) {
+              SpinnersFlag.show = false;
+              Falcon.logResponse('error', err, false);
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        }
       };
 
       //--------------------------------------//
       //----------XML preview-----------------//
 
       $scope.xmlPreview.editXML = function () {
-        $scope.xmlPreview.edit = !$scope.xmlPreview.edit;
+          $scope.xmlPreview.edit = !$scope.xmlPreview.edit;
       };
+
+      $scope.revertXml = function() {
+        if($scope.clusterEntity.clusterModel.cluster.tags !== undefined) {
+            $scope.convertTags();
+        }
+        $scope.showInPreview();
+        $scope.invalidXml = false;
+      };
+
       $scope.showInPreview = function() {
         var xmlStr = X2jsService.json2xml_str(angular.copy($scope.clusterEntity.clusterModel));
         $scope.prettyXml = X2jsService.prettifyXml(xmlStr);
@@ -290,6 +433,7 @@
 
           if (!xmlObj.cluster.ACL || !xmlObj.cluster.ACL._owner || !xmlObj.cluster.ACL._group || !xmlObj.cluster.ACL._permission) {
             xmlObj.cluster.ACL = angular.copy(EntityModel.defaultValues.cluster.cluster.ACL);
+            xmlObj.cluster.ACL._owner = EntityModel.getUserNameFromCookie();
           }
 
           $scope.arrangeFieldsOrder(xmlObj);
@@ -297,8 +441,10 @@
           if($scope.clusterEntity.clusterModel.cluster.properties && $scope.clusterEntity.clusterModel.cluster.properties.property[0] === '') {
             $scope.clusterEntity.clusterModel.cluster.properties.property=[];
           }
+          $scope.invalidXml = false;
         }
         catch(err) {
+          $scope.invalidXml = true;
           console.log('xml malformed');
         }
 
@@ -310,9 +456,6 @@
         $scope.jsonString = X2jsService.json2xml_str($scope.jsonString);
       };
       function xmlPreviewCallback() {
-        if ($state.current.name !== 'forms.cluster.general' && $state.current.name !== 'forms.cluster.summary') {
-          $interval.cancel(refresher);
-        }
         if(!$scope.xmlPreview.edit) {
           if($scope.clusterEntity.clusterModel.cluster.tags !== undefined) { $scope.convertTags(); }
           $scope.showInPreview();
@@ -322,7 +465,9 @@
           $scope.transformBack();
         }
       }
-      var refresher = $interval(xmlPreviewCallback, 1000);
+      $scope.$watch('clusterEntity.clusterModel.cluster', xmlPreviewCallback, true);
+      $scope.$watch('tagsArray', xmlPreviewCallback, true);
+      $scope.$watch('prettyXml', xmlPreviewCallback, true);
 
       $scope.skipUndo = false;
       $scope.$on('$destroy', function () {
@@ -338,17 +483,29 @@
         model = angular.toJson(model);
 
         if (!$scope.skipUndo && !angular.equals(model, defaultModel)) {
-          $interval.cancel(refresher);
           $scope.$parent.cancel('cluster', $rootScope.previousState);
         }
       });
 
       //------------init------------//
-      normalizeModel();
+      if($state.params && $state.params.action === 'import'){
+          $scope.prettyXml = FileApi.fileRaw;
+          $scope.transformBack();
+      }else{
+        normalizeModel();
+      }
+      if($state.current.name !=="forms.cluster.general"){
+        $state.go("forms.cluster.general");
+      }
+
+      $scope.capitalize = function(input) {
+          return input ? input.charAt(0).toUpperCase() + input.slice(1) : "";
+      };
+
+      $scope.upperCase = function(input) {
+          return input ? input.toUpperCase() : "";
+      };
+
     }
   ]);
 })();
-
-
-
-
diff --git a/falcon-ui/app/js/controllers/controllers.js b/falcon-ui/app/js/controllers/controllers.js
index 4867851..869e055 100644
--- a/falcon-ui/app/js/controllers/controllers.js
+++ b/falcon-ui/app/js/controllers/controllers.js
@@ -19,6 +19,7 @@
   'use strict';
 
   angular.module('app.controllers', [
+                                      'app.controllers.theme',
                                       'app.controllers.login',
                                       'app.controllers.navHeader',
                                       'app.controllers.rootCtrl',
@@ -29,7 +30,9 @@
                                       'app.controllers.process',
                                       'app.controllers.entity',
                                       'app.controllers.instance',
-                                      'app.controllers.dataset'
+                                      'app.controllers.dataset',
+                                      'app.controllers.snapshot',
+                                      'app.controllers.datasource'
                                     ]);
 
 })();
diff --git a/falcon-ui/app/js/controllers/dashboard-controller.js b/falcon-ui/app/js/controllers/dashboard-controller.js
index 7a8d1b4..66e3aa9 100644
--- a/falcon-ui/app/js/controllers/dashboard-controller.js
+++ b/falcon-ui/app/js/controllers/dashboard-controller.js
@@ -20,11 +20,29 @@
 
   var dashboardCtrlModule = angular.module('app.controllers.dashboardCtrl', ['app.services']);
 
-  dashboardCtrlModule.controller('DashboardCtrl', [ "$scope", "Falcon", "EntityModel", "FileApi", "$state", "X2jsService",
-      "$timeout", function ($scope, Falcon, EntityModel, FileApi, $state, X2jsService, $timeout) {
+  dashboardCtrlModule.controller('DashboardCtrl', [ "$scope", "$q", "Falcon", "EntityFalcon", "EntityModel",
+    "EntityScheduler", "FileApi", "$state", "X2jsService", "$timeout", "ServerAPI",
+    function ($scope, $q, Falcon, EntityFalcon, EntityModel,
+      EntityScheduler, FileApi, $state, X2jsService, $timeout, ServerAPI) {
 
-      $scope.$parent.refreshList();
+      ServerAPI.getRuntimeConfig(EntityModel.getUserNameFromCookie());
 
+      if(!($state.params && $state.params.fromAction === 'listEntities')){
+        $scope.$parent.refreshList($scope.tags);
+      }
+      var searchPromise = $scope.$parent.goPage(1, 'list');
+      searchPromise.then(function(){
+        if($scope.$parent.searchList.length > 0){
+          return;
+        }
+        EntityFalcon.searchEntities('', '', 'cluster', 0).then(function(){
+          if(EntityFalcon.data !== null && EntityFalcon.data.entity && EntityFalcon.data.entity.length >0){
+            $scope.$parent.hasClusters = true;
+          }else{
+            $scope.$parent.hasClusters = false;
+          }
+        });
+      });
       $timeout(function() {
         angular.element('#nsPopover').trigger('click');
       }, 1000);
@@ -33,77 +51,24 @@
         $scope.$parent.refreshList($scope.tags);
       };
 
+      $scope.backToListing = function(type){
+        if($scope.tags && $scope.tags.length > 0){
+          $scope.$parent.refreshList($scope.tags);
+        }else if(type === 'cluster'){
+          $scope.$parent.goPage($scope.$parent.currentPage, 'cluster');
+        }else{
+          $scope.$parent.goPage($scope.$parent.currentPage, 'list');
+        }
+      }
+
       $scope.deleteEntity = function (type, name) {
-        type = type.toLowerCase(); //new sandbox returns uppercase type
-        Falcon.logRequest();
-        Falcon.deleteEntity(type, name)
-          .success(function (data) {
-            Falcon.logResponse('success', data, type);
-            $scope.$parent.refreshList($scope.tags);
-          })
-          .error(function (err) {
-
-            Falcon.logResponse('error', err, type);
-          });
-      };
-      $scope.cloneEntity = function (type, name) {
-        type = type.toLowerCase(); //new sandbox returns uppercase type
-
-        Falcon.logRequest();
-        Falcon.getEntityDefinition(type, name)
-          .success(function (data) {
-            Falcon.logResponse('success', data, false, true);
-            var modelName = type + "Model",
-                entityModel = X2jsService.xml_str2json(data);
-
-            if (entityModel.process && entityModel.process.tags && entityModel.process.tags.search('_falcon_mirroring_type') !== -1) {
-
-              entityModel.process.name = "";
-              EntityModel.datasetModel.toImportModel = entityModel;
-              $scope.$parent.cloningMode = true;
-              $state.go('forms.dataset.general');
-
-            } else {
-              EntityModel[modelName] = entityModel;
-              EntityModel[modelName][type]._name = "";
-              $scope.models[modelName] = angular.copy(entityModel);
-              $scope.cloningMode = true; // dont know utility of this
-              $scope.$parent.cloningMode = true;
-              $state.go('forms.' + type + ".general");
+        EntityScheduler.deleteEntity(type, name).then(function(status){
+            if(status === "DELETED"){
+              $scope.backToListing(type);
             }
-          })
-          .error(function (err) {
-            Falcon.logResponse('error', err, false, true);
-          });
+        });
       };
-      $scope.editEntity = function (type, name) {
-        type = type.toLowerCase(); //new sandbox returns uppercase type
 
-        Falcon.logRequest();
-        Falcon.getEntityDefinition(type, name)
-          .success(function (data) {
-            Falcon.logResponse('success', data, false, true);
-            var entityModel = X2jsService.xml_str2json(data);
-            var modelName = type + "Model";
-
-            if (entityModel.process && entityModel.process.tags.search('_falcon_mirroring_type') !== -1) {
-
-              EntityModel.datasetModel.toImportModel = entityModel;
-              $scope.$parent.cloningMode = false;
-              $state.go('forms.dataset.general');
-
-            } else {
-              EntityModel[modelName] = entityModel;
-              $scope.models[modelName] = angular.copy(entityModel);
-              $scope.editingMode = true;// dont know utility of this
-              $scope.$parent.cloningMode = false;
-              $state.go('forms.' + type + ".general");
-            }
-          })
-          .error(function (err) {
-            Falcon.logResponse('error', err, false, true);
-          });
-      };
       //-----------------------------------------//
       $scope.entityDefinition = function (name, type) {
 
@@ -125,37 +90,27 @@
       };
       //----------------------------------------//
       $scope.resumeEntity = function (type, name) {
-        Falcon.logRequest();
-        Falcon.postResumeEntity(type, name).success(function (data) {
-          Falcon.logResponse('success', data, type);
-          $scope.$parent.refreshList($scope.tags);
-        })
-        .error(function (err) {
-          Falcon.logResponse('error', err, type);
+        EntityScheduler.resumeEntity(type, name).then(function(status){
+          if(status === "RUNNING"){
+            $scope.backToListing(type);
+          }
         });
       };
+
       $scope.scheduleEntity = function (type, name) {
-        Falcon.logRequest();
-        Falcon.postScheduleEntity(type, name).success(function (data) {
-          Falcon.logResponse('success', data, type);
-          $scope.$parent.refreshList($scope.tags);
-        })
-        .error(function (err) {
-          Falcon.logResponse('error', err, type);
+        EntityScheduler.scheduleEntity(type, name).then(function(status){
+          if(status === "RUNNING"){
+            $scope.backToListing(type);
+          }
         });
       };
 
       $scope.suspendEntity = function (type, name) {
-        Falcon.logRequest();
-        Falcon.postSuspendEntity(type, name)
-          .success(function (message) {
-            Falcon.logResponse('success', message, type);
-              $scope.$parent.refreshList($scope.tags);
-          })
-          .error(function (err) {
-            Falcon.logResponse('error', err, type);
-
-          });
+        EntityScheduler.suspendEntity(type, name).then(function(status){
+          if(status === "SUSPENDED"){
+            $scope.backToListing(type);
+          }
+        });
       };
 
       $scope.loadTags = function(query) {
@@ -196,18 +151,21 @@
         type = type.toLowerCase(); //new sandbox returns uppercase type
 
         Falcon.logRequest();
-        Falcon.getEntityDefinition(type, name)
-            .success(function (data) {
-              Falcon.logResponse('success', data, false, true);
-              var entityModel = X2jsService.xml_str2json(data);
+        var entityDetailsPromise = Falcon.getEntityDefinition(type, name);
+        var entityStatusPromise = Falcon.getEntityStatus(type, name);
+        $q.all([entityDetailsPromise,entityStatusPromise]).then(function(responses){
+              Falcon.logResponse('success', responses[0].data, false, true);
+              Falcon.logResponse('success', responses[1].data, false, true);
+              var entityModel = X2jsService.xml_str2json(responses[0].data);
               EntityModel.type = type;
               EntityModel.name = name;
+              var status = responses[1].data.message;
+              EntityModel.status = status.substr(status.indexOf("/") + 1, status.length - 1).trim();
               EntityModel.model = entityModel;
               $state.go('entityDetails');
-            })
-            .error(function (err) {
-              Falcon.logResponse('error', err, false, true);
-            });
+        },function(err){
+              Falcon.logResponse('error', err, type);
+        });
       };
 
       $scope.clearTags = function(){
@@ -217,4 +175,4 @@
 
     }]);
 
-})();
\ No newline at end of file
+})();
diff --git a/falcon-ui/app/js/controllers/dataset/dataset-controller.js b/falcon-ui/app/js/controllers/dataset/dataset-controller.js
index a28cd77..2dafbe0 100644
--- a/falcon-ui/app/js/controllers/dataset/dataset-controller.js
+++ b/falcon-ui/app/js/controllers/dataset/dataset-controller.js
@@ -21,20 +21,47 @@
   var datasetModule = angular.module('app.controllers.dataset', [ 'app.services' ]);
 
   datasetModule.controller('DatasetCtrl', [
-    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", "DateHelper",
-    "ValidationService", "SpinnersFlag", "$timeout", "$rootScope", "clustersList", "$cookieStore",
-    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService, DateHelper,
-              validationService, SpinnersFlag, $timeout, $rootScope, clustersList, $cookieStore) {
+    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", "DateHelper", "RouteHelper",
+    "ValidationService", "SpinnersFlag", "$timeout", "$rootScope", "clustersList", "$cookieStore", "DatasetModel",
+    "ExtensionSerializer",
+    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService, DateHelper, RouteHelper,
+              validationService, SpinnersFlag, $timeout, $rootScope, clustersList, $cookieStore, datasetModel,
+              extensionSerializer) {
 
+      var stateMatrix = {
+        general : {previous : '', next : 'summary'},
+        summary : {previous : 'general', next : ''}
+      };
 
       $scope.skipUndo = false;
+      $scope.secureMode = $rootScope.secureMode;
+      $scope.clusterErrorMessage = '';
       $scope.$on('$destroy', function () {
 
         if (!$scope.skipUndo && !angular.equals($scope.UIModel, EntityModel.defaultValues.MirrorUIModel)) {
+          if($scope.clone){
+            EntityModel.datasetModel.UIModel.clone = true;
+          }
+          if($scope.editingMode){
+            EntityModel.datasetModel.UIModel.edit = true;
+          }
           $scope.$parent.cancel('dataset', $rootScope.previousState);
         }
       });
 
+      $scope.isFrequencyValid = true;
+      $scope.checkMininumFrequency = function(quantity, unit, field) {
+        $scope.isFrequencyValid = quantity ? true : false;
+        if (quantity && unit === 'minutes') {
+          $scope.isFrequencyValid = validationService.checkMininum(quantity);
+        } else if (unit !== 'minutes' && quantity && parseInt(quantity) === 0) {
+          $scope.isFrequencyValid = false;
+        }
+        if (field) {
+          field.$setValidity('required', $scope.isFrequencyValid);
+        }
+      };
+
       $scope.isActive = function (route) {
         return route === $state.current.name;
       };
@@ -43,8 +70,6 @@
         return $state.get(route).data && $state.get(route).data.completed;
       };
 
-      $scope.clone = $scope.$parent.cloningMode;
-
       if (!clustersList) {
         $scope.clustersList = [];
       } else if (clustersList.type) { // is an object
@@ -55,23 +80,33 @@
 
       $scope.switchModel = function (type) {
         $scope.model = EntityModel.datasetModel[type].process;
-        $scope.UIModel.formType = type;
+        $scope.UIModel.type = type;
         $scope.completeModel = EntityModel.datasetModel[type];
-        switchTag(type);
         checkClusters();
       };
       $scope.model = EntityModel.datasetModel.HDFS.process;
       $scope.UIModel = EntityModel.datasetModel.UIModel;
       $scope.completeModel = EntityModel.datasetModel.HDFS;
 
-      $scope.UIModel.acl.owner = $cookieStore.get('userToken').user;
+      if($scope.UIModel.clone === true || (datasetModel && datasetModel.clone === true)){
+        $scope.clone = true;
+        $scope.editingMode = false;
+      }else if($scope.UIModel.edit === true || (datasetModel && datasetModel.edit === true)){
+        $scope.editingMode = true;
+        $scope.clone = false;
+      }else{
+        $scope.editingMode = false;
+        $scope.clone = false;
+      }
+
+      $scope.UIModel.ACL.owner = $cookieStore.get('userToken').user;
 
       //-------------------------//
       function checkClusters() {
-        if ($scope.UIModel.source.cluster && $scope.UIModel.formType === 'HIVE') {
+        if ($scope.UIModel.source.cluster && $scope.UIModel.type === 'HIVE') {
           $scope.getSourceDefinition();
         }
-        if ($scope.UIModel.target.cluster && $scope.UIModel.formType === 'HIVE') {
+        if ($scope.UIModel.target.cluster && $scope.UIModel.type === 'HIVE') {
           $scope.getTargetDefinition();
         }
       }
@@ -89,51 +124,24 @@
       };
       //----------------TAGS---------------------//
       $scope.addTag = function () {
-        if ($scope.UIModel.tags.newTag.value === "_falcon_mirroring_type") {
-          return;
-        }
-        $scope.UIModel.tags.tagsArray.push($scope.UIModel.tags.newTag);
-        $scope.UIModel.tags.newTag = {value: "", key: ""};
-        $scope.convertTags();
+        $scope.UIModel.tags.push({key: null, value: null});
       };
       $scope.removeTag = function (index) {
-        $scope.UIModel.tags.tagsArray.splice(index, 1);
-        $scope.convertTags();
-      };
-      function switchTag (type) {
-        $scope.UIModel.tags.tagsArray.forEach(function (item) {
-          if (item.key === "_falcon_mirroring_type") {
-            item.value = type;
-          }
-        });
-      }
-      $scope.convertTags = function () {
-        var result = [];
-        $scope.UIModel.tags.tagsArray.forEach(function (element) {
-          if (element.key && element.value) {
-            result.push(element.key + "=" + element.value);
-          }
-        });
-        result = result.join(",");
-        $scope.UIModel.tags.tagsString = result;
-      };
-      $scope.splitTags = function () {
-        $scope.UIModel.tags.tagsArray = [];
-        $scope.UIModel.tags.tagsString.split(",").forEach(function (fieldToSplit) {
-          var splittedString = fieldToSplit.split("=");
-          $scope.UIModel.tags.tagsArray.push({key: splittedString[0], value: splittedString[1]});
-        });
+        if (index >= 0 && $scope.UIModel.tags.length > 1) {
+          $scope.UIModel.tags.splice(index, 1);
+        }
       };
       //----------- Alerts -----------//
       $scope.addAlert = function () {
-        $scope.UIModel.alerts.alertsArray.push($scope.UIModel.alerts.alert.email);
-        $scope.UIModel.alerts.alert = {email: ""};
+        $scope.UIModel.alerts.push($scope.UIModel.alert.email);
+        $scope.UIModel.alert = {email: ""};
       };
       $scope.removeAlert = function (index) {
-        $scope.UIModel.alerts.alertsArray.splice(index, 1);
+        $scope.UIModel.alerts.splice(index, 1);
       };
+
       //----------------- DATE INPUTS -------------------//
-      $scope.dateFormat = 'MM/dd/yyyy';
+      $scope.dateFormat = DateHelper.getLocaleDateFormat();
 
       $scope.openStartDatePicker = function ($event) {
         $event.preventDefault();
@@ -148,21 +156,21 @@
 
       $scope.constructDate = function () {
 
-        if ($scope.UIModel.validity.start && $scope.UIModel.validity.end && $scope.UIModel.validity.startTime && $scope.UIModel.validity.endTime) {
-          $scope.UIModel.validity.startISO = DateHelper.createISO($scope.UIModel.validity.start, $scope.UIModel.validity.startTime, $scope.UIModel.validity.tz);
-          $scope.UIModel.validity.endISO = DateHelper.createISO($scope.UIModel.validity.end, $scope.UIModel.validity.endTime, $scope.UIModel.validity.tz);
+        if ($scope.UIModel.validity.start.date && $scope.UIModel.validity.end.date && $scope.UIModel.validity.start.time && $scope.UIModel.validity.end.time) {
+          $scope.UIModel.validity.startISO = DateHelper.createISO($scope.UIModel.validity.start.date, $scope.UIModel.validity.start.time, $scope.UIModel.validity.timezone);
+          $scope.UIModel.validity.endISO = DateHelper.createISO($scope.UIModel.validity.end.date, $scope.UIModel.validity.end.time, $scope.UIModel.validity.timezone);
         }
 
       };
       $scope.$watch(function () {
-        return $scope.UIModel.validity.tz;
+        return $scope.UIModel.validity.timezone;
       }, function () {
         return $scope.constructDate();
       });
 
       //-------------------------------------//
 
-      $scope.goNext = function (formInvalid, stateName) {
+      $scope.goNext = function (formInvalid) {
         $state.current.data = $state.current.data || {};
         $state.current.data.completed = !formInvalid;
 
@@ -171,22 +179,25 @@
           validationService.displayValidations.show = true;
           validationService.displayValidations.nameShow = true;
           SpinnersFlag.show = false;
-          angular.element('body, html').animate({scrollTop: 0}, 500);
           return;
         }
+
+        if ($scope.clusterErrorMessage !== '') {
+          SpinnersFlag.show = false;
+          return;
+        }
+
         validationService.displayValidations.show = false;
         validationService.displayValidations.nameShow = false;
-        $scope.convertTags();
-        createXML();
-        $state.go(stateName);
+        $state.go(RouteHelper.getNextState($state.current.name, stateMatrix));
         angular.element('body, html').animate({scrollTop: 0}, 500);
       };
 
-      $scope.goBack = function (stateName) {
+      $scope.goBack = function () {
         SpinnersFlag.backShow = true;
         validationService.displayValidations.show = false;
         validationService.displayValidations.nameShow = false;
-        $state.go(stateName);
+        $state.go(RouteHelper.getPreviousState($state.current.name, stateMatrix));
         angular.element('body, html').animate({scrollTop: 0}, 500);
       };
 
@@ -197,34 +208,49 @@
         Falcon.getEntityDefinition("cluster", $scope.UIModel.source.cluster)
           .success(function (data) {
             $scope.sourceClusterModel = X2jsService.xml_str2json(data);
-            if (!EntityModel.datasetModel.UIModel.hiveOptions.source.stagingPath && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
-              EntityModel.datasetModel.UIModel.hiveOptions.source.stagingPath = findLocation($scope.sourceClusterModel.cluster.locations.location, 'staging');
+            if (EntityModel.datasetModel.UIModel.type === 'HIVE') {
+              EntityModel.datasetModel.UIModel.hiveOptions.source.stagingPath
+                = findLocation($scope.sourceClusterModel.cluster.locations.location, 'staging');
+              EntityModel.datasetModel.UIModel.hiveOptions.source.hiveServerToEndpoint
+                = replaceHive(findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'registry'));
             }
-            if (!EntityModel.datasetModel.UIModel.hiveOptions.source.hiveServerToEndpoint && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
-              EntityModel.datasetModel.UIModel.hiveOptions.source.hiveServerToEndpoint = replaceHive(findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'registry'));
-            }
-
           })
           .error(function (err) {
             $scope.UIModel.source.cluster = "";
             Falcon.logResponse('error', err, false, true);
           });
+
+          if ($scope.UIModel.source.cluster === $scope.UIModel.target.cluster) {
+            $scope.clusterErrorMessage = 'Target cannot be the same as the Source';
+          } else {
+            $scope.clusterErrorMessage = '';
+            return;
+          }
       };
       $scope.getTargetDefinition = function () {
         Falcon.getEntityDefinition("cluster", $scope.UIModel.target.cluster)
           .success(function (data) {
             $scope.targetClusterModel = X2jsService.xml_str2json(data);
-            if (!EntityModel.datasetModel.UIModel.hiveOptions.target.stagingPath && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
-              EntityModel.datasetModel.UIModel.hiveOptions.target.stagingPath = findLocation($scope.targetClusterModel.cluster.locations.location, 'staging');
+            if (EntityModel.datasetModel.UIModel.type === 'HIVE') {
+              EntityModel.datasetModel.UIModel.hiveOptions.target.stagingPath
+                = findLocation($scope.targetClusterModel.cluster.locations.location, 'staging');
             }
-            if (!EntityModel.datasetModel.UIModel.hiveOptions.target.hiveServerToEndpoint && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
-              EntityModel.datasetModel.UIModel.hiveOptions.target.hiveServerToEndpoint = replaceHive(findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'registry'));
+            if (EntityModel.datasetModel.UIModel.type === 'HIVE') {
+              EntityModel.datasetModel.UIModel.hiveOptions.target.hiveServerToEndpoint
+                = replaceHive(findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'registry'));
             }
           })
           .error(function (err) {
             $scope.UIModel.target.cluster = "";
             Falcon.logResponse('error', err, false, true);
           });
+
+          if ($scope.UIModel.source.cluster === $scope.UIModel.target.cluster) {
+            $scope.clusterErrorMessage = 'Target cannot be the same as the Source';
+          } else {
+            $scope.clusterErrorMessage = '';
+            return;
+          }
       };
 
       function findLocation (array, locationString) {
@@ -254,177 +280,13 @@
         }
       }
 
-      function createXML() {
-        $scope.model._name = $scope.UIModel.name;
-        $scope.model.tags = $scope.UIModel.tags.tagsString;
-        $scope.model.retry._policy = $scope.UIModel.retry.policy;
-        $scope.model.retry._delay = $scope.UIModel.retry.delay.unit + '(' + $scope.UIModel.retry.delay.number + ')';
-        $scope.model.retry._attempts = $scope.UIModel.retry.attempts;
-        $scope.model.ACL._owner = $scope.UIModel.acl.owner;
-        $scope.model.ACL._group = $scope.UIModel.acl.group;
-        $scope.model.ACL._permission = $scope.UIModel.acl.permissions;
-        $scope.model.frequency = $scope.UIModel.frequency.unit + '(' + $scope.UIModel.frequency.number + ')';
-        $scope.model.clusters.cluster[0].validity._start = $scope.UIModel.validity.startISO;
-        $scope.model.clusters.cluster[0].validity._end = $scope.UIModel.validity.endISO;
-        $scope.model.timezone = $scope.UIModel.validity.tz;
-        if ($scope.UIModel.formType === 'HDFS') {
-
-          if ($scope.UIModel.runOn === "source") {
-            $scope.model.clusters.cluster[0]._name = $scope.UIModel.source.cluster;
-          } else {
-            $scope.model.clusters.cluster[0]._name = $scope.UIModel.target.cluster;
-          }
-
-          $scope.model.workflow._name = $scope.UIModel.name + '-WF';
-
-          $scope.model.properties.property.forEach(function (item) {
-            if (item._name === 'distcpMaxMaps') {
-              item._value = $scope.UIModel.allocation.hdfs.maxMaps;
-            }
-            if (item._name === 'distcpMapBandwidth') {
-              item._value = $scope.UIModel.allocation.hdfs.maxBandwidth;
-            }
-            if (item._name === 'drSourceDir') {
-              item._value = $scope.UIModel.source.path;
-            }
-            if (item._name === 'drTargetDir') {
-              item._value = $scope.UIModel.target.path;
-            }
-            if (item._name === 'drSourceClusterFS') {
-              if ($scope.UIModel.source.location === 'HDFS') {
-                item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'write');
-              } else {
-                item._value = $scope.UIModel.source.url;
-              }
-            }
-            if (item._name === 'drTargetClusterFS') {
-              if ($scope.UIModel.target.location === 'HDFS') {
-                item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'write');
-              } else {
-                item._value = $scope.UIModel.target.url;
-              }
-            }
-            if (item._name === 'drNotificationReceivers') {
-              item._value = (function () {
-                if ($scope.UIModel.alerts.alertsArray.length === 0) {
-                  return "NA";
-                } else {
-                  return $scope.UIModel.alerts.alertsArray.join();
-                }
-              }());
-            }
-            if (item._name === 'sourceCluster') {
-              if ($scope.UIModel.source.location === 'HDFS') { item._value = $scope.UIModel.source.cluster; }
-              else { item._value = ""; }
-            }
-            if (item._name === 'targetCluster') {
-              if ($scope.UIModel.target.location === 'HDFS') { item._value = $scope.UIModel.target.cluster; }
-              else { item._value = ""; }
-            }
-          });
-
-        } else if ($scope.UIModel.formType === 'HIVE') {
-
-          $scope.model.clusters.cluster[0]._name = $scope.UIModel.source.cluster;
-          $scope.model.properties.property.forEach(function (item) {
-            if (item._name === 'distcpMaxMaps') {
-              item._value = $scope.UIModel.allocation.hive.maxMapsDistcp;
-            }
-            if (item._name === 'distcpMapBandwidth') {
-              item._value = $scope.UIModel.allocation.hive.maxBandwidth;
-            }
-            if (item._name === 'sourceCluster') {
-              item._value = $scope.UIModel.source.cluster;
-            }
-            if (item._name === 'targetCluster') {
-              item._value = $scope.UIModel.target.cluster;
-            }
-            if (item._name === 'sourceHiveServer2Uri') {
-              item._value = $scope.UIModel.hiveOptions.source.hiveServerToEndpoint;
-            }
-            if (item._name === 'targetHiveServer2Uri') {
-              item._value = $scope.UIModel.hiveOptions.target.hiveServerToEndpoint;
-            }
-            if (item._name === 'sourceStagingPath') {
-              item._value = $scope.UIModel.hiveOptions.source.stagingPath;
-            }
-            if (item._name === 'targetStagingPath') {
-              item._value = $scope.UIModel.hiveOptions.target.stagingPath;
-            }
-            if (item._name === 'sourceNN') {
-              item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'write');
-            }
-            if (item._name === 'targetNN') {
-              item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'write');
-            }
-            if (item._name === 'sourceMetastoreUri') {
-              item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'registry');
-            }
-            if (item._name === 'targetMetastoreUri') {
-              item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'registry');
-            }
-            if (item._name === 'sourceTable') {
-              if ($scope.UIModel.source.hiveDatabaseType === "databases") {
-                item._value = "*";
-              } else {
-                item._value = $scope.UIModel.source.hiveTables;
-              }
-            }
-            if (item._name === 'sourceDatabase') {
-              if ($scope.UIModel.source.hiveDatabaseType === "databases") {
-                item._value = $scope.UIModel.source.hiveDatabases;
-              } else {
-                item._value = $scope.UIModel.source.hiveDatabase;
-              }
-            }
-            if (item._name === 'maxEvents') {
-              item._value = $scope.UIModel.allocation.hive.maxMapsEvents;
-            }
-            if (item._name === 'replicationMaxMaps') {
-              item._value = $scope.UIModel.allocation.hive.maxMapsMirror;
-            }
-            if (item._name === 'clusterForJobRun') {
-              if ($scope.UIModel.runOn === "source") {
-                item._value = $scope.UIModel.source.cluster;
-              } else {
-                item._value = $scope.UIModel.target.cluster;
-              }
-            }
-            if (item._name === 'clusterForJobRunWriteEP') {
-              if ($scope.UIModel.runOn === "source") {
-                item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'write');
-              } else {
-                item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'write');
-              }
-            }
-            if (item._name === 'drJobName') {
-              item._value = $scope.UIModel.name;
-            }
-            if (item._name === 'drNotificationReceivers') {
-              item._value = (function () {
-                if ($scope.UIModel.alerts.alertsArray.length === 0) {
-                  return "NA";
-                } else {
-                  return $scope.UIModel.alerts.alertsArray.join();
-                }
-              }());
-            }
-
-          });
-
-        } else {
-          console.log('error in form type');
-        }
-
-        $scope.xmlString = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + X2jsService.json2xml_str($scope.completeModel);
-
-      }
-
       $scope.save = function () {
         SpinnersFlag.show = true;
+        var extensionData = extensionSerializer.convertObjectToString(
+          extensionSerializer.serializeExtensionProperties($scope.UIModel, $scope.UIModel.type + '-MIRROR'));
 
-        if(!$scope.$parent.cloningMode) {
-          Falcon.postUpdateEntity($scope.xmlString, 'process', $scope.model._name)
+        if($scope.editingMode) {
+          Falcon.postUpdateExtension(extensionData, $scope.UIModel.type + '-MIRRORING')
             .success(function (response) {
               $scope.skipUndo = true;
               Falcon.logResponse('success', response, false);
@@ -437,7 +299,7 @@
               angular.element('body, html').animate({scrollTop: 0}, 300);
             });
         } else {
-          Falcon.postSubmitEntity($scope.xmlString, 'process')
+            Falcon.postSubmitExtension(extensionData, $scope.UIModel.type + '-MIRRORING')
             .success(function (response) {
               $scope.skipUndo = true;
               Falcon.logResponse('success', response, false);
@@ -462,181 +324,27 @@
         }
       }
 
-      function importModel(model) {
-
-        var mirrorType;
-
-        if (model.process.tags.search('_falcon_mirroring_type=HDFS') !== -1) {
-          mirrorType = 'HDFS';
-        } else {
-          mirrorType = 'HIVE';
-        }
-        $scope.switchModel(mirrorType);
-        EntityModel.datasetModel.UIModel.formType = mirrorType;
-        EntityModel.datasetModel.UIModel.name = (function () { if (!$scope.clone) { return model.process._name; } else { return ""; } }());
-        EntityModel.datasetModel.UIModel.retry.policy = model.process.retry._policy;
-        EntityModel.datasetModel.UIModel.retry.attempts = model.process.retry._attempts;
-        EntityModel.datasetModel.UIModel.retry.delay.number = (function () {
-          return parseInt(model.process.retry._delay.split('(')[1]);
-        }());
-        EntityModel.datasetModel.UIModel.retry.delay.unit = (function () {
-          return model.process.retry._delay.split('(')[0];
-        }());
-        EntityModel.datasetModel.UIModel.frequency.number = (function () {
-          return parseInt(model.process.frequency.split('(')[1]);
-        }());
-        EntityModel.datasetModel.UIModel.frequency.unit = (function () {
-          return model.process.frequency.split('(')[0];
-        }());
-        EntityModel.datasetModel.UIModel.acl.owner = model.process.ACL._owner;
-        EntityModel.datasetModel.UIModel.acl.group = model.process.ACL._group;
-        EntityModel.datasetModel.UIModel.acl.permissions = model.process.ACL._permission;
-
-        EntityModel.datasetModel.UIModel.validity.startISO = model.process.clusters.cluster[0].validity._start;
-        EntityModel.datasetModel.UIModel.validity.endISO = model.process.clusters.cluster[0].validity._end;
-        EntityModel.datasetModel.UIModel.validity.tz = model.process.timezone;
-        EntityModel.datasetModel.UIModel.validity.start = DateHelper.importDate (model.process.clusters.cluster[0].validity._start, model.process.timezone);
-        EntityModel.datasetModel.UIModel.validity.startTime = DateHelper.importDate (model.process.clusters.cluster[0].validity._start, model.process.timezone);
-        EntityModel.datasetModel.UIModel.validity.end = DateHelper.importDate (model.process.clusters.cluster[0].validity._end, model.process.timezone);
-        EntityModel.datasetModel.UIModel.validity.endTime = DateHelper.importDate (model.process.clusters.cluster[0].validity._end, model.process.timezone);
-
-        EntityModel.datasetModel.UIModel.tags.tagsString = model.process.tags;
-        EntityModel.datasetModel.UIModel.tags.tagsArray = (function () {
-          var array = [];
-          model.process.tags.split(',').forEach(function (fieldToSplit) {
-            var splittedString = fieldToSplit.split("=");
-            array.push({key: splittedString[0], value: splittedString[1]});
-          });
-          return array;
-        }());
-
-        if (mirrorType === 'HDFS') {
-          model.process.properties.property.forEach(function (item) {
-            if (item._name === 'distcpMaxMaps') {
-              EntityModel.datasetModel.UIModel.allocation.hdfs.maxMaps = item._value;
-            }
-            if (item._name === 'distcpMapBandwidth') {
-              EntityModel.datasetModel.UIModel.allocation.hdfs.maxBandwidth = item._value;
-            }
-            if (item._name === 'drSourceDir') {
-              EntityModel.datasetModel.UIModel.source.path = item._value;
-            }
-            if (item._name === 'drTargetDir') {
-              EntityModel.datasetModel.UIModel.target.path = item._value;
-            }
-            if (item._name === 'drNotificationReceivers') {
-              EntityModel.datasetModel.UIModel.alerts.alertsArray = (function () {
-                if (item._value !== "NA") {
-                  return item._value.split(',');
-                } else {
-                  return [];
-                }
-              }());
-            }
-            if (item._name === 'targetCluster') {
-              EntityModel.datasetModel.UIModel.target.cluster = item._value;
-            }
-            if (item._name === 'sourceCluster') {
-              EntityModel.datasetModel.UIModel.source.cluster = item._value;
-            }
-            if (item._name === 'drSourceClusterFS') {
-              EntityModel.datasetModel.UIModel.source.url = item._value;
-            }
-            if (item._name === 'drTargetClusterFS') {
-              EntityModel.datasetModel.UIModel.target.url = item._value;
-            }
-          });
-
-          if (EntityModel.datasetModel.UIModel.source.cluster === model.process.clusters.cluster[0]._name) {
-            EntityModel.datasetModel.UIModel.runOn = "source";
-          }
-          if (EntityModel.datasetModel.UIModel.target.cluster === model.process.clusters.cluster[0]._name) {
-            EntityModel.datasetModel.UIModel.runOn = "target";
-          }
-
-          EntityModel.datasetModel.UIModel.source.location = identifyLocationType(EntityModel.datasetModel.UIModel.source.url);
-          EntityModel.datasetModel.UIModel.target.location = identifyLocationType(EntityModel.datasetModel.UIModel.target.url);
-
-        } else if (mirrorType === 'HIVE') {
-
-          model.process.properties.property.forEach(function (item) {
-            if (item._name === 'distcpMaxMaps') {
-              EntityModel.datasetModel.UIModel.allocation.hive.maxMapsDistcp = item._value;
-            }
-            if (item._name === 'distcpMapBandwidth') {
-              EntityModel.datasetModel.UIModel.allocation.hive.maxBandwidth = item._value;
-            }
-            if (item._name === 'sourceCluster') {
-              EntityModel.datasetModel.UIModel.source.cluster = item._value;
-            }
-            if (item._name === 'targetCluster') {
-              EntityModel.datasetModel.UIModel.target.cluster = item._value;
-            }
-            if (item._name === 'sourceStagingPath') {
-              EntityModel.datasetModel.UIModel.hiveOptions.source.stagingPath = item._value;
-            }
-            if (item._name === 'targetStagingPath') {
-              EntityModel.datasetModel.UIModel.hiveOptions.target.stagingPath = item._value;
-              if (item._value === "*") {
-                EntityModel.datasetModel.UIModel.source.hiveDatabaseType = "databases";
-              } else {
-                EntityModel.datasetModel.UIModel.source.hiveDatabaseType = "tables";
-              }
-            }
-            if (item._name === 'sourceHiveServer2Uri') {
-              EntityModel.datasetModel.UIModel.hiveOptions.source.hiveServerToEndpoint = item._value;
-            }
-            if (item._name === 'targetHiveServer2Uri') {
-              EntityModel.datasetModel.UIModel.hiveOptions.target.hiveServerToEndpoint = item._value;
-            }
-            if (item._name === 'sourceTable') {
-              EntityModel.datasetModel.UIModel.source.hiveTables = item._value;
-              if (EntityModel.datasetModel.UIModel.source.hiveDatabaseType === "databases") {
-                EntityModel.datasetModel.UIModel.source.hiveTables = "*";
-              }
-              else {
-                EntityModel.datasetModel.UIModel.source.hiveTables = item._value;
-              }
-            }
-            if (item._name === 'sourceDatabase') {
-              if (EntityModel.datasetModel.UIModel.source.hiveDatabaseType === "databases") {
-                EntityModel.datasetModel.UIModel.source.hiveDatabases = item._value;
-              } else {
-                EntityModel.datasetModel.UIModel.source.hiveDatabase = item._value;
-              }
-            }
-            if (item._name === 'maxEvents') {
-              EntityModel.datasetModel.UIModel.allocation.hive.maxMapsEvents = item._value;
-            }
-            if (item._name === 'replicationMaxMaps') {
-              EntityModel.datasetModel.UIModel.allocation.hive.maxMapsMirror = item._value;
-            }
-            if (item._name === 'clusterForJobRun') {
-              if (EntityModel.datasetModel.UIModel.source.cluster === item._value) {
-                EntityModel.datasetModel.UIModel.runOn = "source";
-              } else {
-                EntityModel.datasetModel.UIModel.runOn = "target";
-              }
-            }
-            if (item._name === 'drNotificationReceivers') {
-              EntityModel.datasetModel.UIModel.alerts.alertsArray = (function () {
-                if (item._value !== "NA") {
-                  return item._value.split(',');
-                } else {
-                  return [];
-                }
-              }());
-            }
-
-          });
-        }
-
-        if(EntityModel.datasetModel.UIModel.source.cluster) { $scope.getSourceDefinition(); }
-        if(EntityModel.datasetModel.UIModel.target.cluster) { $scope.getTargetDefinition(); }
-
+      var extensionModel;
+      if (datasetModel) {
+        extensionModel = datasetModel;
+      } else if (EntityModel.datasetModel.toImportModel) {
+        extensionModel = EntityModel.datasetModel.toImportModel;
       }
-      if (EntityModel.datasetModel.toImportModel) {
-        importModel(EntityModel.datasetModel.toImportModel);
+      if (extensionModel && extensionModel.process.tags) {
+        var datasetType;
+        if (extensionModel.process.tags.indexOf('_falcon_extension_name=HDFS-MIRRORING') !== -1) {
+          datasetType = 'hdfs-mirror';
+          $scope.UIModel = extensionSerializer.serializeExtensionModel(extensionModel, datasetType, $scope.secureMode);
+        } else if (extensionModel.process.tags.indexOf('_falcon_extension_name=HIVE-MIRRORING') !== -1) {
+          datasetType = 'hive-mirror';
+          $scope.UIModel = extensionSerializer.serializeExtensionModel(extensionModel, datasetType, $scope.secureMode);
+        }
+      }
+      if ($scope.clone) {
+        $scope.UIModel.name = "";
+      }
+      if($state.current.name !== "forms.dataset.general"){
+        $state.go("forms.dataset.general");
       }
     }]);
 }());
diff --git a/falcon-ui/app/js/controllers/datasource/datasource-advanced-controller.js b/falcon-ui/app/js/controllers/datasource/datasource-advanced-controller.js
new file mode 100644
index 0000000..a9f975b
--- /dev/null
+++ b/falcon-ui/app/js/controllers/datasource/datasource-advanced-controller.js
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.datasource.DatasourceGeneralInformationController
+   * @requires EntityModel the entity model to copy the datasource entity from
+   * @requires Falcon the falcon entity service
+   */
+  var datasourceModule = angular.module('app.controllers.datasource');
+
+  datasourceModule.controller('DatasourceAdvancedController', [ "$scope", function ($scope) {
+
+  }]);
+
+
+}());
diff --git a/falcon-ui/app/js/controllers/datasource/datasource-general-information-controller.js b/falcon-ui/app/js/controllers/datasource/datasource-general-information-controller.js
new file mode 100644
index 0000000..1299b15
--- /dev/null
+++ b/falcon-ui/app/js/controllers/datasource/datasource-general-information-controller.js
@@ -0,0 +1,141 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.datasource.DatasourceGeneralInformationController
+   * @requires EntityModel the entity model to copy the datasource entity from
+   * @requires Falcon the falcon entity service
+   */
+  var datasourceModule = angular.module('app.controllers.datasource');
+
+  datasourceModule.controller('DatasourceGeneralInformationController', [ "$scope", function ($scope) {
+    $scope.addTag = function () {
+      $scope.datasource.tags.push({key: null, value: null});
+    };
+
+    $scope.removeTag = function (index) {
+      if (index >= 0 && $scope.datasource.tags.length > 1) {
+        $scope.datasource.tags.splice(index, 1);
+      }
+    };
+
+    $scope.addParameter = function () {
+      $scope.datasource.parameters.push({name: null, value: null});
+    };
+
+    $scope.removeParameter = function (index) {
+      if (index >= 0 && $scope.datasource.parameters.length > 0) {
+        $scope.datasource.parameters.splice(index, 1);
+      }
+    };
+
+    $scope.addProperty = function () {
+      $scope.datasource.customProperties.push({name: null, value: null});
+    };
+
+    $scope.removeProperty = function (index) {
+      if (index >= 0 && $scope.datasource.customProperties.length > 0) {
+        $scope.datasource.customProperties.splice(index, 1);
+      }
+    };
+
+    $scope.addDriverJar = function () {
+      var lastOne = $scope.datasource.driver.jar.length - 1;
+      if($scope.datasource.driver.jar[lastOne].value) {
+        $scope.datasource.driver.jar.push({value:""});
+      }
+    };
+
+    $scope.removeDriverJar = function(index) {
+      if(index !== null && $scope.datasource.driver.jar[index]) {
+        $scope.datasource.driver.jar.splice(index, 1);
+      }
+    };
+
+    $scope.getDatabaseDefaultDetails = function() {
+      switch ($scope.datasource.type) {
+        case "postgres":
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:postgresql://db_host:5433/test";
+          $scope.datasource.driver.clazz = "org.postgresql.Driver";
+          return;
+        case "mysql":
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:mysql://db_host:3306";
+          $scope.datasource.driver.clazz = "com.mysql.jdbc.Driver";
+          return;
+        case "hsql":
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:hsqldb:hsql://db_host:9001";
+          $scope.datasource.driver.clazz = "org.hsqldb.jdbcDriver";
+          return;
+        case "oracle":
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:oracle:thin@db_host:1526:oracle_sid";
+          $scope.datasource.driver.clazz = "oracle.jdbc.driver.OracleDriver";
+          return;
+        case "teradata":
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:teradata://db_host";
+          $scope.datasource.driver.clazz = "com.teradata.jdbc.TeraDriver";
+          return;
+        case "db2":
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:db2://db_host:50000/SAMPLE";
+          $scope.datasource.driver.clazz = "com.ibm.db2.jcc.DB2Driver";
+          return;
+        case "netezza":
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:netezza://db_host:5480/test";
+          $scope.datasource.driver.clazz = "org.netezza.Driver";
+          return;
+        default:
+          $scope.datasource.interfaces.interfaces[0].endpoint = "jdbc:"
+          $scope.datasource.driver.clazz = "org.apache.sqoop.connector.jdbc.GenericJdbcConnector";
+          return;
+      }
+    }
+
+  //   $scope.datasource.interfaces.interfaces[0].endpoint = $scope.datasource.type;
+
+  //   $scope.$watchCollection(
+  //     "[datasource.type, datasource.host, datasource.port, datasource.databaseName]", function() {
+  //     var connectionString;
+  //     switch ($scope.datasource.type) {
+  //       case "sqlserver":
+  //         connectionString = "jdbc:jtds:sqlserver://";
+  //       case "mysql":
+  //         connectionString = "jdbc:mysql://";
+  //       case "postgresql":
+  //         connectionString = "jdbc:postgresql://";
+  //       case "oracle":
+  //         connectionString = "jdbc:oracle:thin:@//";
+  //       case "teradata":
+  //         connectionString = "jdbc:teradata://";
+  //       case "db2":
+  //         connectionString = "jdbc:db2://";
+  //       default:
+  //         connectionString = "jdbc://";
+  //     };
+  //     $scope.datasource.interfaces.interfaces[0].endpoint = connectionString
+  //         + $scope.datasource.host + ":"
+  //         + $scope.datasource.port + "/"
+  //         + $scope.datasource.databaseName;
+  //
+  //   });
+  //
+  }]);
+
+
+}());
diff --git a/falcon-ui/app/js/controllers/datasource/datasource-module.js b/falcon-ui/app/js/controllers/datasource/datasource-module.js
new file mode 100644
index 0000000..c8b40f3
--- /dev/null
+++ b/falcon-ui/app/js/controllers/datasource/datasource-module.js
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.datasouurce.DatasourceController
+   * @requires EntityModel the entity model to copy the datasource entity from
+   * @requires Falcon the falcon entity service
+   */
+  angular.module('app.controllers.datasource',
+    [
+     'app.controllers.entity',
+     'app.services'
+    ]);
+
+})();
diff --git a/falcon-ui/app/js/controllers/datasource/datasource-root-ctrl.js b/falcon-ui/app/js/controllers/datasource/datasource-root-ctrl.js
new file mode 100644
index 0000000..2d38208
--- /dev/null
+++ b/falcon-ui/app/js/controllers/datasource/datasource-root-ctrl.js
@@ -0,0 +1,249 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.datasource.DatasourceController
+   * @requires EntityModel the entity model to copy the datasource entity from
+   * @requires Falcon the falcon entity service
+   */
+  var datasourceModule = angular.module('app.controllers.datasource');
+
+  datasourceModule.controller('DatasourceController',
+    [ '$scope', '$state', '$timeout', "RouteHelper",
+      'Falcon', 'X2jsService',
+      'JsonTransformerFactory', 'EntityFactory',
+      'EntitySerializer', '$interval',
+      '$controller', "ValidationService",
+      "SpinnersFlag", "$rootScope", "DatasourceModel",
+      function($scope, $state, $timeout, RouteHelper, Falcon,
+               X2jsService, transformerFactory, entityFactory,
+               serializer, $interval, $controller,
+               validationService, SpinnersFlag, $rootScope, datasourceModel) {
+
+         $scope.entityType = 'datasource';
+         var stateMatrix = {
+                 general : {previous : '', next : 'summary'},
+                 summary : {previous : 'general', next : ''}
+         };
+         //extending root controller
+         $controller('EntityRootCtrl', {
+           $scope: $scope
+         });
+
+         $scope.skipUndo = false;
+         $scope.secureMode = $rootScope.secureMode;
+
+         $scope.$on('$destroy', function () {
+
+          //  if (!$scope.skipUndo && !angular.equals($scope.UIModel, EntityModel.defaultValues.datasourceModel)) {
+          //    if($scope.clone){
+          //      EntityModel.datasourceModel.UIModel.clone = true;
+          //    }
+          //    if($scope.editingMode){
+          //      EntityModel.datasourceModel.UIModel.edit = true;
+          //    }
+          //    $scope.$parent.cancel('datasource', $rootScope.previousState);
+          //  }
+         });
+
+         $scope.loadOrCreateEntity = function() {
+           var type = $scope.entityType;
+           if(!datasourceModel && $scope.$parent.models.datasourceModel){
+             datasourceModel = $scope.$parent.models.datasourceModel;
+           }
+           $scope.$parent.models.datasourceModel = null;
+           return datasourceModel ? serializer.preDeserialize(datasourceModel, type) : entityFactory.newEntity(type);
+         };
+
+         $scope.init = function() {
+           $scope.baseInit();
+           var type = $scope.entityType;
+           $scope[type] = $scope.loadOrCreateEntity();
+           if(datasourceModel && datasourceModel.clone === true){
+             $scope.cloningMode = true;
+             $scope.editingMode = false;
+             $scope[type].name = "";
+           }else if(datasourceModel && datasourceModel.edit === true){
+             $scope.editingMode = true;
+             $scope.cloningMode = false;
+           }else{
+             $scope.editingMode = false;
+             $scope.cloningMode = false;
+           }
+         }
+
+         $scope.init();
+
+         $scope.transform = function() {
+           var type = $scope.entityType;
+           var xml = serializer.serialize($scope[type], $scope.entityType);
+           $scope.prettyXml = X2jsService.prettifyXml(xml);
+           $scope.xml = xml;
+           return xml;
+         };
+
+         var xmlPreviewCallback = function() {
+           var type = $scope.entityType;
+           if($scope.editXmlDisabled) {
+             try {
+               $scope.transform();
+             } catch (exception) {
+               console.log('error when transforming xml');
+               console.log(exception);
+             }
+           } else {
+             try {
+               $scope[type] = serializer.deserialize($scope.prettyXml, type);
+               $scope.invalidXml = false;
+             } catch (exception) {
+               $scope.invalidXml = true;
+               console.log('user entered xml incorrect format');
+               console.log(exception);
+             }
+           }
+         };
+
+         $scope.$watch('datasource', xmlPreviewCallback, true);
+         $scope.$watch('prettyXml', xmlPreviewCallback, true);
+         $scope.$watch('datasource.interfaces', function() {
+           if ($scope.datasource.interfaces.interfaces[0]
+             && $scope.datasource.interfaces.interfaces[0].credential) {
+            $scope.datasource.interfaces.credential = $scope.datasource.interfaces.interfaces[0].credential;
+           }
+         }, true);
+
+         $scope.toggleclick = function () {
+              $('.formBoxContainer').toggleClass('col-xs-14 ');
+              $('.xmlPreviewContainer ').toggleClass('col-xs-10 hide');
+              $('.preview').toggleClass('pullOver pullOverXml');
+              ($('.preview').hasClass('pullOver')) ? $('.preview').find('button').html('Preview XML') : $('.preview').find('button').html('Hide XML');
+              ($($("textarea")[0]).attr("ng-model") == "prettyXml" ) ? $($("textarea")[0]).css("min-height", $(".formBoxContainer").height() - 40 ) : '';
+          };
+
+          $scope.isActive = function (route) {
+              return route === $state.current.name;
+          };
+
+          $scope.isCompleted = function (route) {
+              return $state.get(route).data && $state.get(route).data.completed;
+          };
+
+          $scope.goNext = function (formInvalid) {
+            $state.current.data = $state.current.data || {};
+            $state.current.data.completed = !formInvalid;
+
+            SpinnersFlag.show = true;
+            if (!validationService.nameAvailable || formInvalid) {
+              validationService.displayValidations.show = true;
+              validationService.displayValidations.nameShow = true;
+              SpinnersFlag.show = false;
+              return;
+            }
+            validationService.displayValidations.show = false;
+            validationService.displayValidations.nameShow = false;
+            $state.go(RouteHelper.getNextState($state.current.name, stateMatrix));
+            angular.element('body, html').animate({scrollTop: 0}, 500);
+          };
+
+          $scope.goBack = function () {
+            SpinnersFlag.backShow = true;
+            validationService.displayValidations.show = false;
+            validationService.displayValidations.nameShow = false;
+            $state.go(RouteHelper.getPreviousState($state.current.name, stateMatrix));
+            angular.element('body, html').animate({scrollTop: 0}, 500);
+          };
+
+          function cleanXml (xml) {
+            var obj = X2jsService.xml_str2json(xml);
+            //feed properties
+            // if (obj.datasource.properties.property.length === 1 && obj.feed.properties.property[0] === "") {
+            //   delete obj.datasource.properties;
+            // }
+
+            return X2jsService.json2xml_str(obj);
+          }
+
+          $scope.validate = function() {
+            var type = $scope.entityType;
+            var cleanedXml = cleanXml($scope.xml);
+            SpinnersFlag.validateShow = true;
+            Falcon.logRequest();
+
+            Falcon.postValidateEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + cleanedXml, $scope.entityType, $scope[type].name)
+              .success(function (response) {
+                Falcon.logResponse('success', response, false);
+                SpinnersFlag.validateShow = false;
+                angular.element('body, html').animate({scrollTop: 0}, 300);
+              })
+              .error(function(err) {
+                Falcon.logResponse('error', err, false);
+                SpinnersFlag.validateShow = false;
+                angular.element('body, html').animate({scrollTop: 0}, 300);
+              });
+          }
+
+          $scope.saveEntity = function() {
+            var type = $scope.entityType;
+            var cleanedXml = cleanXml($scope.xml);
+            SpinnersFlag.show = true;
+
+            if($scope.editingMode) {
+              Falcon.logRequest();
+
+              Falcon.postUpdateEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + cleanedXml, $scope.entityType, $scope[type].name)
+                .success(function (response) {
+                  $scope.skipUndo = true;
+                  Falcon.logResponse('success', response, false);
+                  $state.go('main');
+                })
+                .error(function(err) {
+                  Falcon.logResponse('error', err, false);
+                  SpinnersFlag.show = false;
+                  angular.element('body, html').animate({scrollTop: 0}, 300);
+                });
+            } else {
+              Falcon.logRequest();
+              Falcon.postSubmitEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + cleanedXml, $scope.entityType)
+                .success(function (response) {
+                  $scope.skipUndo = true;
+                  Falcon.logResponse('success', response, false);
+                  $state.go('main');
+                })
+                .error(function(err) {
+                  Falcon.logResponse('error', err, false);
+                  SpinnersFlag.show = false;
+                  angular.element('body, html').animate({scrollTop: 0}, 300);
+                });
+            }
+
+            $scope.editingMode = false;
+            $scope.cloningMode = false;
+          };
+
+          if($state.current.name !== "forms.datasource.general"){
+            $state.go("forms.datasource.general");
+          }
+
+      }
+    ]);
+
+
+})();
diff --git a/falcon-ui/app/js/controllers/datasource/datasource-summary-controller.js b/falcon-ui/app/js/controllers/datasource/datasource-summary-controller.js
new file mode 100644
index 0000000..8440f13
--- /dev/null
+++ b/falcon-ui/app/js/controllers/datasource/datasource-summary-controller.js
@@ -0,0 +1,39 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.datasource.DatasourceSummaryController
+   * @requires EntityModel the entity model to copy the datasource entity from
+   * @requires Falcon the falcon entity service
+   */
+  var datasourceModule = angular.module('app.controllers.datasource');
+
+  datasourceModule.controller('DatasourceSummaryController', [ "$scope", "$timeout",
+                                                function($scope, $timeout) {
+
+    if($scope.transform) {
+      $scope.transform();
+    }
+
+  }]);
+
+
+})();
diff --git a/falcon-ui/app/js/controllers/entity/entity-details.js b/falcon-ui/app/js/controllers/entity/entity-details.js
index 217bb9b..6670dbb 100644
--- a/falcon-ui/app/js/controllers/entity/entity-details.js
+++ b/falcon-ui/app/js/controllers/entity/entity-details.js
@@ -27,10 +27,12 @@
   var clusterModule = angular.module('app.controllers.view', [ 'app.services' ]);
 
   clusterModule.controller('EntityDetailsCtrl', [
-    "$scope", "$timeout", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", 'EntitySerializer', 'InstanceFalcon',
-    function ($scope, $timeout, $interval, Falcon, EntityModel, $state, X2jsService, serializer, InstanceFalcon) {
+    "$scope", "$timeout","$window", "$interval", "Falcon", "EntityModel","EntityScheduler", "$state",
+    "X2jsService", 'EntitySerializer', 'InstanceFalcon', 'entity', 'ExtensionSerializer', '$rootScope',
+    function ($scope, $timeout, $window, $interval, Falcon, EntityModel, EntityScheduler,
+      $state, X2jsService, serializer, InstanceFalcon, entity, extensionSerializer, $rootScope) {
 
-      $scope.entity = EntityModel;
+      $scope.entity = entity;
 
       var resultsPerPage = 10;
       var visiblePages = 3;
@@ -39,7 +41,15 @@
 
       $scope.pages = [];
       $scope.nextPages = false;
-      $scope.mirrorTag = "_falcon_mirroring_type";
+      $scope.mirrorTag = "_falcon_extension_name";
+
+      $scope.isSafeMode = function() {
+        return $rootScope.safeMode;
+      };
+
+      $scope.isSuperUser = function() {
+        return $rootScope.superUser;
+      };
 
       $scope.isMirror = function(tags){
         var flag = false;
@@ -49,22 +59,49 @@
         return flag;
       };
 
+      $scope.getMirrorType = function(tags) {
+        if (tags.search('_falcon_extension_name=HDFS-MIRRORING') !== -1) {
+          return "hdfs-mirror";
+        } else if (tags.search('_falcon_extension_name=HDFS-SNAPSHOT-MIRRORING') !== -1) {
+          return "snapshot";
+        } else if (tags.search('_falcon_extension_name=HIVE-MIRRORING') !== -1) {
+          return "hive-mirror";
+        }
+      };
+
       if($scope.entity.type === "feed"){
+        $scope.entityTypeLabel = "Feed";
         $scope.feed = serializer.preDeserialize($scope.entity.model, "feed");
         $scope.feed.name = $scope.entity.name;
         $scope.feed.type = $scope.entity.type;
         $scope.entity.start = $scope.entity.model.feed.clusters.cluster[0].validity._start;
         $scope.entity.end = $scope.entity.model.feed.clusters.cluster[0].validity._end;
-      }else{
+      } else if($scope.entity.type === "cluster"){
+        $scope.entityTypeLabel = "Cluster";
+        $scope.cluster = serializer.preDeserialize($scope.entity.model, "cluster");
+        $scope.cluster.name = $scope.entity.name;
+        $scope.cluster.type = $scope.entity.type;
+      }else if($scope.entity.type === "process"){
         var tags = $scope.entity.model.process.tags;
         if($scope.isMirror(tags)){
-          $scope.entityTypeLabel = "Mirror";
+          var mirrorType = $scope.getMirrorType(tags);
+          if (mirrorType === "snapshot") {
+            $scope.entityTypeLabel = "Snapshot";
+          } if (mirrorType === "hdfs-mirror") {
+            $scope.entityTypeLabel = "HDFS Mirror";
+          } else if (mirrorType === "hive-mirror") {
+            $scope.entityTypeLabel = "Hive Mirror";
+          }
+          $scope.extension = extensionSerializer.serializeExtensionModel(
+            $scope.entity.model, mirrorType, $rootScope.secureMode);
+        } else {
+          $scope.entityTypeLabel = "Process";
+          $scope.process = serializer.preDeserialize($scope.entity.model, "process");
+          $scope.process.name = $scope.entity.name;
+          $scope.process.type = $scope.entity.type;
+          $scope.entity.start = $scope.entity.model.process.clusters.cluster[0].validity._start;
+          $scope.entity.end = $scope.entity.model.process.clusters.cluster[0].validity._end;
         }
-        $scope.process = serializer.preDeserialize($scope.entity.model, "process");
-        $scope.process.name = $scope.entity.name;
-        $scope.process.type = $scope.entity.type;
-        $scope.entity.start = $scope.entity.model.process.clusters.cluster[0].validity._start;
-        $scope.entity.end = $scope.entity.model.process.clusters.cluster[0].validity._end;
       }
 
       $scope.capitalize = function(input) {
@@ -141,7 +178,10 @@
         if(type === "FEED"){
           $scope.entityTypeLabel = "Feed";
           return "entypo download";
-        }else if(type === "PROCESS"){
+        } else if(type === "CLUSTER"){
+          $scope.entityTypeLabel = "Cluster";
+          return "entypo archive";
+        } else if(type === "PROCESS"){
           var tags = model.process.tags;
           if($scope.isMirror(tags)){
             $scope.entityTypeLabel = "Mirror";
@@ -156,6 +196,62 @@
         }
       };
 
+      $scope.deleteEntity = function () {
+        EntityScheduler.deleteEntity($scope.entity.type, $scope.entity.name).then(function(status){
+            if(status === "DELETED"){
+                $state.go("main");
+            }
+        });
+      };
+      $scope.cloneEntity = function () {
+        var type = $scope.entity.type.toLowerCase();
+        if(type === 'process' && $scope.isMirror($scope.entity.model.process.tags)){
+            type = $scope.getMirrorType($scope.entity.model.process.tags);
+            if (type === 'hdfs-mirror' || type === 'hive-mirror') {
+              type = 'dataset';
+            }
+        }
+        var state = 'forms.' + type;
+        $state.go(state, {'name' : $scope.entity.name, 'action' : 'clone'});
+      };
+
+      $scope.editEntity = function () {
+        var type = $scope.entity.type.toLowerCase();
+        if (type === 'cluster' && (!$rootScope.safeMode || !$rootScope.superUser)) {
+          return;
+        }
+        if(type === 'process' && $scope.isMirror($scope.entity.model.process.tags)){
+            type = $scope.getMirrorType($scope.entity.model.process.tags);
+            if (type === 'hdfs-mirror' || type === 'hive-mirror') {
+              type = 'dataset';
+            }
+        }
+        var state = 'forms.' + type;
+        $state.go(state, {'name' : $scope.entity.name, 'action' : 'edit'});
+      };
+
+      $scope.resumeEntity = function () {
+        EntityScheduler.resumeEntity($scope.entity.type, $scope.entity.name).then(function(status){
+            $scope.entity.status = status;
+        });
+      };
+
+      $scope.scheduleEntity = function () {
+        EntityScheduler.scheduleEntity($scope.entity.type, $scope.entity.name).then(function(status){
+            $scope.entity.status = status;
+        });
+      };
+
+      $scope.suspendEntity = function () {
+        EntityScheduler.suspendEntity($scope.entity.type, $scope.entity.name).then(function(status){
+            $scope.entity.status = status;
+        });
+      };
+
+      $scope.downloadEntity = function () {
+        EntityScheduler.downloadEntity($scope.entity.type, $scope.entity.name);
+      };
+
     }
   ]);
 
diff --git a/falcon-ui/app/js/controllers/entity/entity-module.js b/falcon-ui/app/js/controllers/entity/entity-module.js
index cb36b45..aa5a4fd 100644
--- a/falcon-ui/app/js/controllers/entity/entity-module.js
+++ b/falcon-ui/app/js/controllers/entity/entity-module.js
@@ -21,8 +21,21 @@
   var entityModule = angular.module('app.controllers.entity',[ 'app.services' ]);
 
   entityModule.controller('EntityRootCtrl',
-    [ '$scope',
-      function($scope) {
+    [ '$scope', 'ValidationService',
+      function($scope, validationService) {
+
+        $scope.invalidXml = false;
+        $scope.isFrequencyValid = true;
+
+        $scope.checkMininumFrequency = function(quantity, unit, field){
+          $scope.isFrequencyValid = quantity ? true : false;
+          if (quantity && unit === 'minutes') {
+            $scope.isFrequencyValid = validationService.checkMininum(quantity);
+          } else if (unit !== 'minutes' && quantity && parseInt(quantity) === 0) {
+            $scope.isFrequencyValid = false;
+          }
+          field.$setValidity('required', $scope.isFrequencyValid);
+        };
 
         $scope.baseInit = function() {
           $scope.editXmlDisabled = true;
@@ -32,6 +45,11 @@
           $scope.editXmlDisabled = !$scope.editXmlDisabled;
         };
 
+        $scope.revertXml = function() {
+          $scope.transform();
+          $scope.invalidXml = false;
+        };
+
         $scope.capitalize = function(input) {
             return input.charAt(0).toUpperCase() + input.slice(1);
         };
diff --git a/falcon-ui/app/js/controllers/entity/instance-details.js b/falcon-ui/app/js/controllers/entity/instance-details.js
index 0775d61..5800aba 100644
--- a/falcon-ui/app/js/controllers/entity/instance-details.js
+++ b/falcon-ui/app/js/controllers/entity/instance-details.js
@@ -27,12 +27,13 @@
   var clusterModule = angular.module('app.controllers.instance', ['app.services']);
 
   clusterModule.controller('InstanceDetailsCtrl', [
-    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", 'EntitySerializer',
-    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService) {
+    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", 'DateHelper',
+    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService, DateHelper) {
 
       $scope.instance = EntityModel.model;
       $scope.instance.type = EntityModel.type;
       $scope.instance.name = EntityModel.name;
+      $scope.dateFormat = DateHelper.getLocaleDateFormat() +'HH:mm';
 
       $scope.backToEntity = function () {
         var type = $scope.instance.type.toLowerCase();
@@ -45,7 +46,7 @@
             EntityModel.type = type;
             EntityModel.name = name;
             EntityModel.model = entityModel;
-            $state.go('entityDetails');
+            $state.go('entityDetails',{'name' : name, 'type' : type});
           })
           .error(function (err) {
             Falcon.logResponse('error', err, false, true);
diff --git a/falcon-ui/app/js/controllers/feed/feed-advanced-controller.js b/falcon-ui/app/js/controllers/feed/feed-advanced-controller.js
new file mode 100644
index 0000000..4d80cc7
--- /dev/null
+++ b/falcon-ui/app/js/controllers/feed/feed-advanced-controller.js
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.feed.FeedAdvancedController
+   * @requires clusters the list of clusters to display for selection of source
+   * @requires EntityModel the entity model to copy the feed entity from
+   * @requires Falcon the falcon entity service
+   */
+  var feedModule = angular.module('app.controllers.feed');
+
+  feedModule.controller('FeedAdvancedController', [ "$scope",function($scope) {
+
+  }]);
+
+})();
diff --git a/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js b/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js
index 64c6892..6d829b9 100644
--- a/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js
@@ -30,14 +30,38 @@
   feedModule.controller('FeedClustersController', [ "$scope", "clustersList", "EntityFactory", "$timeout",
                                             function($scope, clustersList, entityFactory, $timeout) {
 
-      function focusOnElement () {
-        $timeout(function () {
-          angular.element('#clusterNameSelect').trigger('focus');
-        }, 500);
-      }
-      focusOnElement();
-
       unwrapClusters(clustersList);
+      $scope.sourceClusterName;
+      $scope.sourceClusterNotSelected = false;
+      $scope.sourceClusterExists = false;
+      $scope.targetClusterName;
+      $scope.targetClusterNotSelected = false;
+      $scope.targetClusterExists = false;
+
+      function preparePartitionString() {
+        $scope.feedPartitions = "";
+        $scope.feed.partitions.forEach(function(partition, index){
+          $scope.feedPartitions = $scope.feedPartitions.concat(partition.name);
+          if (index < $scope.feed.partitions.length - 1) {
+            $scope.feedPartitions = $scope.feedPartitions.concat(",");
+          }
+        });
+      }
+
+      $scope.$watch("feed.partitions",function(){
+        preparePartitionString();
+        $scope.$broadcast("createClusterPartitions");
+      }, true);
+
+      $scope.createFeedClusterPartitions = function() {
+        if ($scope.feedPartitions != undefined) {
+          var currentPartitions = ($scope.feedPartitions.trim() === "") ? [] : $scope.feedPartitions.split(",");
+          $scope.feed.partitions = [];
+          currentPartitions.forEach(function(element) {
+            $scope.feed.partitions.push(entityFactory.newPartition(element));
+          });
+        }
+      };
 
       $scope.updateRetention = function() {
         if($scope.selectedCluster.retention.action === 'archive' && $scope.selectedCluster.type === 'source') {
@@ -64,15 +88,75 @@
         }
       };
 
-      $scope.addCluster = function() {
-        $scope.selectedCluster.selected = false;
-        var cluster = $scope.newCluster(true);
-        $scope.feed.clusters.push(cluster);
-        $scope.selectedCluster = cluster;
+      function openClusterInAccordion(object, flagValue) {
+        object.isAccordionOpened = flagValue;
+      }
+
+      $scope.feed.clusters.forEach(function(cluster) {
+        openClusterInAccordion(cluster, false);
+      });
+
+      function findClusterExists(clusterList, newClusterName, newClusterType) {
+        var clusterExists = false;
+        clusterList.forEach(function (cluster) {
+          if (cluster.name === newClusterName && cluster.type === newClusterType) {
+            clusterExists = true;
+            return;
+          }
+        });
+        return clusterExists;
+      }
+
+      $scope.clearSourceClusterFlags = function() {
+        $scope.sourceClusterNotSelected = false;
+        $scope.sourceClusterExists = false;
+      }
+
+      $scope.clearTargetClusterFlags = function() {
+        $scope.targetClusterNotSelected = false;
+        $scope.targetClusterExists = false;
+      }
+
+      $scope.addSourceCluster = function() {
+        $scope.clearSourceClusterFlags();
+        if ($scope.sourceClusterName == undefined) {
+          $scope.sourceClusterNotSelected = true;
+        } else if (!findClusterExists($scope.feed.clusters, $scope.sourceClusterName, 'source')) {
+          $scope.addCluster('source', $scope.sourceClusterName);
+        } else {
+          $scope.sourceClusterExists = true;
+        }
       };
 
-      $scope.newCluster = function(selected) {
-        return entityFactory.newCluster('target', selected);
+      $scope.addTargetCluster = function() {
+        if ($scope.targetClusterName == undefined) {
+          $scope.targetClusterNotSelected = true;
+        } else if (!findClusterExists($scope.feed.clusters, $scope.targetClusterName, 'target')) {
+          $scope.addCluster('target', $scope.targetClusterName);
+        } else {
+          $scope.targetClusterExists = true;
+        }
+      };
+
+      $scope.addCluster = function(clusterType, clusterName) {
+        var cluster = $scope.newCluster(clusterType, true, clusterName);
+        if($scope.feed.storage.catalog.active){
+          cluster.storage.catalog.catalogTable.uri = $scope.feed.storage.catalog.catalogTable.uri
+        }
+        cluster.storage.fileSystem.locations.forEach(function (location) {
+          if (location.type === 'data') {
+            var dataLocation = $scope.feed.storage.fileSystem.locations.filter(function(obj) {
+              return obj.type == 'data';
+            })[0];
+            location.path = (dataLocation != undefined) ? dataLocation.path : '';
+          }
+        });
+        openClusterInAccordion(cluster, true);
+        $scope.feed.clusters.push(cluster);
+      };
+
+      $scope.newCluster = function(clusterType, selected, clusterName, partition) {
+        return entityFactory.newCluster(clusterType, selected, clusterName, partition);
       };
 
       $scope.handleCluster = function(cluster, index) {
@@ -89,12 +173,27 @@
         $scope.selectedCluster = cluster;
       };
 
-      $scope.removeCluster = function(index) {
-        if(index >= 0 && $scope.feed.clusters.length > 1 &&
-          $scope.feed.clusters[index].type !== 'source' &&
-          !$scope.archiveCluster.active) {
-          $scope.feed.clusters.splice(index, 1);
-          $scope.selectCluster($scope.sourceCluster);
+      function findClusterIndex(atIndex, ofType) {
+        var index = -1;
+        for (var i=0,len=$scope.feed.clusters.length;i<len;i++){
+          var cluster=$scope.feed.clusters[i];
+          if (cluster.type === ofType) {
+            index++;
+            if (index === atIndex) {
+              return i;
+            }
+          }
+        }
+        return -1;
+      };
+
+      $scope.removeCluster = function(clusterIndex, clusterType) {
+        if (clusterIndex >= 0 && $scope.feed.clusters.length > 0
+          && !$scope.archiveCluster.active) {
+          var clusterTypeIndex = findClusterIndex(clusterIndex, clusterType);
+          if (clusterTypeIndex > -1) {
+            $scope.feed.clusters.splice(clusterTypeIndex, 1);
+          }
         }
       };
 
diff --git a/falcon-ui/app/js/controllers/feed/feed-general-information-controller.js b/falcon-ui/app/js/controllers/feed/feed-general-information-controller.js
index 40dbdbc..bb45bbd 100644
--- a/falcon-ui/app/js/controllers/feed/feed-general-information-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-general-information-controller.js
@@ -28,8 +28,18 @@
   var feedModule = angular.module('app.controllers.feed');
 
 
-  feedModule.controller('FeedGeneralInformationController', [ "$scope", function ($scope) {
+  feedModule.controller('FeedGeneralInformationController', [ "$scope","clustersList",'EntityFactory',
+    function ($scope, clustersList, entityFactory) {
 
+    $scope.propPlaceholders = {
+      queueName: 'default',
+      jobPriority: '',
+      parallel: 3,
+      maxMaps: 8,
+      mapBandwidthKB: 1024
+    };
+
+    unwrapClusters(clustersList);
     $scope.nameValid = false;
 
     $scope.addTag = function () {
@@ -42,7 +52,120 @@
       }
     };
 
+    function unwrapClusters(clusters) {
+      if(clusters !== undefined && clusters !== null && clusters !== "null"){
+        $scope.clustersList = [];
+        var typeOfData = Object.prototype.toString.call(clusters.entity);
+        if(typeOfData === "[object Array]") {
+          $scope.clustersList = clusters.entity;
+        } else if(typeOfData === "[object Object]") {
+          $scope.clustersList = [clusters.entity];
+        } else {
+          //console.log("type of data not recognized");
+        }
+      }
+    }
+
+    function findClusterExists(clusterList, newClusterName, newClusterType) {
+      var clusterExists = false;
+      clusterList.forEach(function (cluster) {
+        if (cluster.name === newClusterName && cluster.type === newClusterType) {
+          clusterExists = true;
+          return;
+        }
+      });
+      return clusterExists;
+    }
+
+    $scope.onTypeChange = function(value){
+      $scope.feed.clusters = [];
+      if (value === 'hive' || value ==='hdfs') {
+        $scope.feed.sourceClusterLocationType = value;
+        $scope.feed.targetClusterLocationType = value;
+        $scope.feed.clusters.push(
+          entityFactory.newCluster('source', $scope.feed.sourceClusterLocationType, "", null));
+        $scope.feed.clusters.push(
+            entityFactory.newCluster('target', $scope.feed.targetClusterLocationType, "", null));
+      } else if (value === 'import') {
+        $scope.feed.targetClusterLocationType = "hdfs";
+        $scope.feed.clusters.push(
+            entityFactory.newCluster('source', $scope.feed.targetClusterLocationType, "", null))
+      } else if (value === 'export') {
+          $scope.feed.sourceClusterLocationType = "hdfs";
+        $scope.feed.clusters.push(
+          entityFactory.newCluster('source', $scope.feed.sourceClusterLocationType, "", null));
+      }
+    };
+
+    $scope.addClusterStorage = function(clusterDetails){
+      var cluster = entityFactory.newCluster(clusterDetails.type, clusterDetails.dataTransferType, "", null);
+      if($scope.feed.clusters.length > 1
+        && findClusterExists($scope.feed.clusters,cluster.name,cluster.type)){
+        if(cluster.type === 'source'){
+          $scope.sourceClusterExists = true;
+        }else{
+          $scope.targetClusterExists = true;
+        }
+        return;
+      }else{
+          $scope.sourceClusterExists = false;
+          $scope.targetClusterExists = false;
+      }
+      if(cluster.storage.fileSystem) {
+        cluster.storage.fileSystem.locations = [];
+        cluster.storage.fileSystem.locations.push({'type':'data','path':''});
+        cluster.storage.fileSystem.locations.push({'type':'stats','path':'/'});
+      }
+      $scope.feed.clusters.unshift(cluster);
+    };
+
+    $scope.toggleClusterStorage = function(type){
+      if(type === 'source'){
+        $scope.showSourceClusterStorage = !$scope.showSourceClusterStorage;
+      }else if(type === 'target'){
+        $scope.showTargetClusterStorage = !$scope.showTargetClusterStorage;
+      }
+    };
+
+    $scope.$watch("feed.import.source.includesCSV",function(){
+      if($scope.feed.dataTransferType === 'import' && $scope.feed.import.source.includesCSV){
+        $scope.feed.import.source.fields = { 'includes' : $scope.feed.import.source.includesCSV.split(",") };
+      }
+    }, true);
+    $scope.$watch("feed.import.source.excludesCSV",function(){
+      if($scope.feed.dataTransferType === 'import' && $scope.feed.import.source.excludesCSV){
+        $scope.feed.import.source.fields = { 'excludes' : $scope.feed.import.source.excludesCSV.split(",") };
+      }
+    }, true);
+    $scope.$watch("feed.export.target.includesCSV",function(){
+      if($scope.feed.dataTransferType === 'export' && $scope.feed.export.target.includesCSV){
+        $scope.feed.export.target.fields = { 'includes' : $scope.feed.export.target.includesCSV.split(",") };
+      }
+    }, true);
+    $scope.$watch("feed.export.target.excludesCSV",function(){
+      if($scope.feed.dataTransferType === 'export' && $scope.feed.export.target.excludesCSV){
+        $scope.feed.export.target.fields = { 'excludes' : $scope.feed.export.target.excludesCSV.split(",") };
+      }
+    }, true);
+
+    $scope.$watch("feed.sourceClusterLocationType", function(){
+      var sourceClusters = $scope.feed.clusters.filter(function(obj) {
+        return obj.type == 'source';
+      });
+      if(sourceClusters.length < 1){
+        var cluster = entityFactory.newCluster('source', $scope.feed.sourceClusterLocationType, "", null);
+        $scope.feed.clusters.push(cluster)
+      }
+    });
+
+    $scope.$watch("feed.targetClusterLocationType", function(){
+      var targetClusters = $scope.feed.clusters.filter(function(obj) {
+        return obj.type == 'target';
+      });
+      if(targetClusters.length < 1 && $scope.feed.dataTransferType !== 'import'){
+        var cluster = entityFactory.newCluster('target', $scope.feed.targetClusterLocationType, "", null);
+        $scope.feed.clusters.push(cluster)
+      }
+    });
   }]);
-
-
 }());
diff --git a/falcon-ui/app/js/controllers/feed/feed-location-controller.js b/falcon-ui/app/js/controllers/feed/feed-location-controller.js
index 055436d..7030be4 100644
--- a/falcon-ui/app/js/controllers/feed/feed-location-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-location-controller.js
@@ -29,22 +29,9 @@
 
   feedModule.controller('FeedLocationController', [ "$scope", "$timeout", function ($scope, $timeout) {
 
-    function focusOnElement () {
-      $timeout(function () {
-        if ($scope.feed.storage.catalog.active) {
-          angular.element('.catalogStorageInput').trigger('focus');
-        }
-        else {
-          angular.element('.firstInput').trigger('focus');
-        }
-      }, 500);
-    }
-    focusOnElement();
-
     $scope.toggleStorage = function() {
       toggle($scope.feed.storage.fileSystem);
       toggle($scope.feed.storage.catalog);
-      focusOnElement();
     };
 
     function toggle(storage) {
diff --git a/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js b/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js
index 9282ea4..4be1360 100644
--- a/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js
+++ b/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js
@@ -28,36 +28,63 @@
   var feedModule = angular.module('app.controllers.feed');
 
   feedModule.controller('FeedController',
-    [ '$scope', '$state', '$timeout',
+    [ '$scope', '$state', '$timeout', "RouteHelper", "DateHelper",
       'Falcon', 'X2jsService',
       'JsonTransformerFactory', 'EntityFactory',
       'EntitySerializer', '$interval',
       '$controller', "ValidationService",
-      "SpinnersFlag", "$rootScope",
-      function($scope, $state, $timeout, Falcon,
+      "SpinnersFlag", "$rootScope", "FeedModel", "datasourcesList",
+      function($scope, $state, $timeout, RouteHelper, DateHelper, Falcon,
                X2jsService, transformerFactory, entityFactory,
                serializer, $interval, $controller,
-               validationService, SpinnersFlag, $rootScope) {
+               validationService, SpinnersFlag, $rootScope, feedModel, datasourcesList) {
 
         $scope.entityType = 'feed';
-
+        var stateMatrix = {
+                general : {previous : '', next : 'summary'},
+                summary : {previous : 'general', next : ''}
+        };
         //extending root controller
         $controller('EntityRootCtrl', {
           $scope: $scope
         });
+        unwrapDatasources(datasourcesList);
 
         $scope.loadOrCreateEntity = function() {
           var type = $scope.entityType;
-          var model = $scope.models[type + 'Model'];
-          $scope.models[type + 'Model'] = null;
-          return model ? serializer.preDeserialize(model, type) : entityFactory.newEntity(type);
+          if(!feedModel && $scope.$parent.models.feedModel){
+            feedModel = $scope.$parent.models.feedModel;
+          }
+          $scope.$parent.models.feedModel = null;
+          if (feedModel) {
+            var feedEntity = serializer.preDeserialize(feedModel, type);
+            // if (feedEntity && feedEntity.clusters) {
+            //   feedEntity.clusters.forEach(function (feedCluster) {
+            //     feedCluster.storage = feedEntity.storage;
+            //   });
+            // }
+            return feedEntity;
+          } else {
+            return entityFactory.newEntity(type)
+          }
         };
 
         $scope.init = function() {
           $scope.baseInit();
           var type = $scope.entityType;
           $scope[type] = $scope.loadOrCreateEntity();
-          $scope.dateFormat ='MM/dd/yyyy';
+          if(feedModel && feedModel.clone === true){
+            $scope.cloningMode = true;
+            $scope.editingMode = false;
+            $scope[type].name = "";
+          }else if(feedModel && feedModel.edit === true){
+            $scope.editingMode = true;
+            $scope.cloningMode = false;
+          }else{
+            $scope.editingMode = false;
+            $scope.cloningMode = false;
+          }
+          $scope.dateFormat = DateHelper.getLocaleDateFormat();
         };
 
         $scope.openDatePicker = function($event, container) {
@@ -68,6 +95,19 @@
 
         $scope.init();
 
+        // $scope.$watch("feed.storage.fileSystem.locations",function(){
+        //   $scope.feed.clusters.forEach(function (feedCluster) {
+        //     feedCluster.storage.fileSystem.locations.forEach(function (location) {
+        //       if (location.type === 'data') {
+        //         var dataLocation = $scope.feed.storage.fileSystem.locations.filter(function(obj) {
+        //           return obj.type == 'data';
+        //         })[0];
+        //         location.path = (dataLocation != undefined) ? dataLocation.path : '';
+        //       }
+        //     });
+        //   });
+        // }, true);
+
         $scope.transform = function() {
           var type = $scope.entityType;
           var xml = serializer.serialize($scope[type], $scope.entityType);
@@ -76,23 +116,28 @@
           return xml;
         };
 
-        $scope.saveEntity = function() {
+        $scope.saveEntity = function(formInvalid) {
           var type = $scope.entityType;
           var cleanedXml = cleanXml($scope.xml);
-          SpinnersFlag.show = true;
+          SpinnersFlag.saveShow = true;
+          if (!validateFeedForm(formInvalid)) {
+            SpinnersFlag.saveShow = false;
+            return;
+          }
 
-          if(!$scope.$parent.cloningMode) {
+          if($scope.editingMode) {
             Falcon.logRequest();
 
             Falcon.postUpdateEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + cleanedXml, $scope.entityType, $scope[type].name)
               .success(function (response) {
                 $scope.skipUndo = true;
                 Falcon.logResponse('success', response, false);
+                SpinnersFlag.saveShow = false;
                 $state.go('main');
               })
               .error(function(err) {
                 Falcon.logResponse('error', err, false);
-                SpinnersFlag.show = false;
+                SpinnersFlag.saveShow = false;
                 angular.element('body, html').animate({scrollTop: 0}, 300);
               });
           } else {
@@ -101,21 +146,23 @@
               .success(function (response) {
                 $scope.skipUndo = true;
                 Falcon.logResponse('success', response, false);
+                SpinnersFlag.saveShow = false;
                 $state.go('main');
               })
               .error(function(err) {
                 Falcon.logResponse('error', err, false);
-                SpinnersFlag.show = false;
+                SpinnersFlag.saveShow = false;
                 angular.element('body, html').animate({scrollTop: 0}, 300);
               });
           }
-
-          $scope.editingMode = false;
-          $scope.cloningMode = false;
         };
 
         $scope.isActive = function (route) {
-          return route === $state.$current.name;
+          return route === $state.current.name;
+        };
+
+        $scope.isCompleted = function (route) {
+          return $state.get(route).data && $state.get(route).data.completed;
         };
 
         $scope.parseDate = function(input) {
@@ -141,6 +188,7 @@
           if($scope.editXmlDisabled) {
             try {
               $scope.transform();
+              $scope.feed.storage = $scope.feed.clusters[0].storage;
             } catch (exception) {
               console.log('error when transforming xml');
               console.log(exception);
@@ -148,7 +196,10 @@
           } else {
             try {
               $scope[type] = serializer.deserialize($scope.prettyXml, type);
+              $scope.invalidXml = false;
+              joinIncludesExcludes();
             } catch (exception) {
+              $scope.invalidXml = true;
               console.log('user entered xml incorrect format');
               console.log(exception);
             }
@@ -156,7 +207,38 @@
 
         };
 
-        var xmlPreviewWorker = $interval(xmlPreviewCallback, 1000);
+        var joinIncludesExcludes = function(){
+          if($scope.feed.dataTransferType === 'import'){
+            $scope.dataSourceType = 'source';
+            if($scope.feed.import.source.includesCSV){
+              $scope.feed.import.source.columnsType = 'include';
+            } else if($scope.feed.import.source.excludesCSV){
+              $scope.feed.import.source.columnsType = 'exclude';
+            } else {
+              $scope.feed.import.source.columnsType = 'all';
+            }
+          }
+          if($scope.feed.dataTransferType === 'export'){
+            $scope.dataSourceType = 'target';
+            if($scope.feed.export.target.includesCSV){
+              $scope.feed.export.target.columnsType = 'include';
+            } else if($scope.export.import.target.excludesCSV){
+              $scope.feed.export.target.columnsType = 'exclude';
+            } else {
+              $scope.feed.export.target.columnsType = 'all';
+            }
+          }
+        };
+        $scope.$watch('feed', function(){
+          if($scope.editXmlDisabled) {
+            xmlPreviewCallback();
+          }
+        }, true);
+       $scope.$watch('prettyXml', function(){
+         if(!$scope.editXmlDisabled) {
+           xmlPreviewCallback();
+         }
+        }, true);
         $scope.skipUndo = false;
         $scope.$on('$destroy', function () {
 
@@ -168,38 +250,72 @@
               ACLIsEqual = angular.equals($scope.feed.ACL, defaultFeed.ACL),
               schemaIsEqual = angular.equals($scope.feed.schema, defaultFeed.schema);
 
-          $interval.cancel(xmlPreviewWorker);
-
           if (!$scope.skipUndo && (!nameIsEqual || !groupsIsEqual || !descriptionIsEqual || !ACLIsEqual || !schemaIsEqual)) {
             $scope.$parent.models.feedModel = angular.copy(X2jsService.xml_str2json($scope.xml));
+            if($scope.cloningMode){
+              $scope.$parent.models.feedModel.clone = true;
+            }
+            if($scope.editingMode){
+              $scope.$parent.models.feedModel.edit = true;
+            }
             $scope.$parent.cancel('feed', $rootScope.previousState);
           }
         });
-        $scope.goNext = function (formInvalid, stateName) {
-
-          SpinnersFlag.show = true;
+        function validateFeedForm(formInvalid) {
+          $state.current.data = $state.current.data || {};
+          $state.current.data.completed = !formInvalid;
 
           if (!validationService.nameAvailable || formInvalid) {
             validationService.displayValidations.show = true;
             validationService.displayValidations.nameShow = true;
-            SpinnersFlag.show = false;
-            return;
+            if ($scope.currentState == 'forms.feed.clusters') {
+              $scope.$broadcast('forms.feed.clusters:submit');
+            }
+            return false;
+          }
+
+          // Duplicate Cluster Check
+          if ($scope.feed.clusters) {
+            var clusterNames = $scope.feed.clusters.map(function(item){ return item.name });
+            var isDuplicateClusterExists = clusterNames.some(function(item, index){
+                return clusterNames.indexOf(item) != index
+            });
+            if(isDuplicateClusterExists) {
+              return false;
+            }
           }
           validationService.displayValidations.show = false;
           validationService.displayValidations.nameShow = false;
-
-          $state.go(stateName);
-
-
+          return true;
+        }
+        $scope.goNext = function (formInvalid) {
+          SpinnersFlag.show = true;
+          if (validateFeedForm(formInvalid)) {
+            SpinnersFlag.show = false;
+            $state.go(RouteHelper.getNextState($state.current.name, stateMatrix));
+          }
+          SpinnersFlag.show = false;
         };
-        $scope.goBack = function (stateName) {
+        $scope.goBack = function () {
           SpinnersFlag.backShow = true;
           validationService.displayValidations.show = false;
           validationService.displayValidations.nameShow = false;
-          $state.go(stateName);
+          $state.go(RouteHelper.getPreviousState($state.current.name, stateMatrix));
         };
 
-
+        function unwrapDatasources(datasources) {
+		if(datasources !== undefined && datasources !== null && datasources !== "null"){
+			$scope.datasourceList = [];
+            var typeOfData = Object.prototype.toString.call(datasources.entity);
+            if(typeOfData === "[object Array]") {
+              $scope.datasourceList = datasources.entity;
+            } else if(typeOfData === "[object Object]") {
+              $scope.datasourceList = [datasources.entity];
+            } else {
+              //console.log("type of data not recognized");
+            }
+		}
+        }
 
         function cleanXml (xml) {
 
@@ -208,11 +324,13 @@
               feedLocationsArray = [];
 
           // cluster locations
-          obj.feed.clusters.cluster[0].locations.location.forEach(function (item) {
-            if (item._path) {
-              clusterLocationsArray.push(item);
-            }
-          });
+          if(obj.feed.clusters.cluster[0].locations){
+            obj.feed.clusters.cluster[0].locations.location.forEach(function (item) {
+              if (item._path) {
+                clusterLocationsArray.push(item);
+              }
+            });
+          }
 
           if (clusterLocationsArray.length === 0) {
             delete obj.feed.clusters.cluster[0].locations;
@@ -221,11 +339,13 @@
           }
 
           // feed locations
-          obj.feed.locations.location.forEach(function (item) {
-            if (item._path) {
-              feedLocationsArray.push(item);
-            }
-          });
+          if(obj.feed.locations){
+            obj.feed.locations.location.forEach(function (item) {
+              if (item._path) {
+                feedLocationsArray.push(item);
+              }
+            });
+          }
 
           if (feedLocationsArray.length === 0) {
             delete obj.feed.locations;
@@ -234,7 +354,8 @@
           }
 
           //feed properties
-          if (obj.feed.properties.property.length === 1 && obj.feed.properties.property[0] === "") {
+          if (obj.feed.properties && obj.feed.properties.property.length === 1
+              && obj.feed.properties.property[0] === "") {
             delete obj.feed.properties;
           }
 
@@ -242,6 +363,21 @@
 
         }
 
+         $scope.toggleclick = function () {
+              $('.formBoxContainer').toggleClass('col-xs-14 ');
+              $('.xmlPreviewContainer ').toggleClass('col-xs-10 hide');
+              $('.preview').toggleClass('pullOver pullOverXml');
+              ($('.preview').hasClass('pullOver')) ? $('.preview').find('button').html('Preview XML') : $('.preview').find('button').html('Hide XML');
+              ($($("textarea")[0]).attr("ng-model") == "prettyXml" ) ? $($("textarea")[0]).css("min-height", $(".formBoxContainer").height() - 40 ) : '';
+          };
+
+          $scope.emptyClusterName = function (cluster) {
+            return !(cluster.name === null || cluster.name.trim().length === 0);
+          };
+
+          if($state.current.name !== "forms.feed.general"){
+            $state.go("forms.feed.general");
+          }
       }]);
 
 
diff --git a/falcon-ui/app/js/controllers/feed/feed-summary-controller.js b/falcon-ui/app/js/controllers/feed/feed-summary-controller.js
index 249b8da..1eb6c90 100644
--- a/falcon-ui/app/js/controllers/feed/feed-summary-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-summary-controller.js
@@ -27,12 +27,8 @@
    */
   var feedModule = angular.module('app.controllers.feed');
 
-  feedModule.controller('FeedSummaryController', [ "$scope", "$filter", "$timeout",
-                                                function($scope, $filter, $timeout) {
-
-    $timeout(function () {
-      angular.element('.nextBtn').trigger('focus');
-    }, 500);
+  feedModule.controller('FeedSummaryController', [ "$scope", "$filter", "$timeout", "DateHelper",
+                                                function($scope, $filter, $timeout, DateHelper) {
 
     if($scope.transform) {
       $scope.transform();
@@ -47,6 +43,10 @@
       return input ? (output || input) : 'Not specified';
     };
 
+    $scope.getDateTimeString = function (date,time) {
+      return DateHelper.getDateTimeString(date,time);
+    };
+
   }]);
 
 
diff --git a/falcon-ui/app/js/controllers/header-controller.js b/falcon-ui/app/js/controllers/header-controller.js
index b2dcaea..a0a0a20 100644
--- a/falcon-ui/app/js/controllers/header-controller.js
+++ b/falcon-ui/app/js/controllers/header-controller.js
@@ -41,36 +41,67 @@
       };
 
       $scope.resetCluster = function () {
+        $scope.clearTags();
         validationService.displayValidations = {show: false, nameShow: false};
         angular.copy(EntityModel.defaultValues.cluster, EntityModel.clusterModel);
-        $state.go("forms.cluster.general");
+        $state.go("forms.cluster");
       };
 
       $scope.resetProcess = function () {
+        $scope.clearTags();
         validationService.displayValidations = {show: false, nameShow: false};
         $scope.cloningMode = true;
         $scope.models.processModel = null;
-        $state.go("forms.process.general");
+        $state.go("forms.process");
       };
 
       $scope.resetFeed = function () {
+        $scope.clearTags();
         validationService.displayValidations = {show: false, nameShow: false};
         $scope.cloningMode = true;
         $scope.models.feedModel = null;
-        $state.go("forms.feed.general");
+        $state.go("forms.feed");
       };
 
-      $scope.resetDataset = function () {
+      $scope.resetDataset = function (mirrorType) {
+        $scope.clearTags();
         validationService.displayValidations = {show: false, nameShow: false};
         EntityModel.datasetModel.toImportModel = undefined;
         angular.copy(EntityModel.defaultValues.MirrorUIModel, EntityModel.datasetModel.UIModel);
+        EntityModel.datasetModel.UIModel.type = mirrorType;
         $scope.cloningMode = true;
-        $scope.models.feedModel = null;
-        $state.go("forms.dataset.general");
+        if($rootScope.currentState === 'forms.dataset.general') {
+          $state.reload("forms.dataset");
+        } else if($rootScope.currentState === 'forms.dataset.summary') {
+          EntityModel.datasetModel.UIModel.ACL.owner = $cookieStore.get('userToken').user;
+          $state.go("forms.dataset.general");
+        } else {
+          $state.go("forms.dataset");
+        }
+      };
+
+      $scope.resetSnapshot = function () {
+        $scope.clearTags();
+        validationService.displayValidations = {show: false, nameShow: false};
+        $scope.cloningMode = true;
+        $scope.models.snapshotModel = null;
+        $state.go("forms.snapshot");
+      };
+
+      $scope.isMirror = function(mirrorType) {
+        return EntityModel.datasetModel.UIModel && EntityModel.datasetModel.UIModel.type === mirrorType;
+      };
+
+      $scope.resetDatasource = function () {
+        $scope.clearTags();
+        validationService.displayValidations = {show: false, nameShow: false};
+        $scope.cloningMode = true;
+        $scope.models.dataSource = null;
+        $state.go("forms.datasource");
       };
 
       $scope.userLogged = function () {
-        if($rootScope.isSecureMode()){
+        if($rootScope.isSecureMode() || $rootScope.ambariView()){
           return true;
         }else if($rootScope.userLogged()){
 		if(angular.isDefined($cookieStore.get('userToken')) && $cookieStore.get('userToken') !== null){
@@ -94,7 +125,7 @@
       };
 
       $scope.restore = function(state) {
-        $state.go(state);
+        $state.go(state, {name : null, action : null});
       };
 
       $scope.notify = function() {
diff --git a/falcon-ui/app/js/controllers/process/process-advanced-ctrl.js b/falcon-ui/app/js/controllers/process/process-advanced-ctrl.js
new file mode 100644
index 0000000..a5c871b
--- /dev/null
+++ b/falcon-ui/app/js/controllers/process/process-advanced-ctrl.js
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.process.ProcessAdvancedCtrl
+   * @requires EntityModel the entity model to copy the process entity from
+   * @requires Falcon the falcon entity service
+   */
+  var processModule = angular.module('app.controllers.process');
+
+  processModule.controller('ProcessAdvancedCtrl', ['$scope', 'EntityFactory', '$timeout', 'DateHelper',
+                                              function($scope, entityFactory, $timeout, DateHelper) {
+
+  }]);
+
+})();
diff --git a/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js b/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js
index 5605268..4f93dc8 100644
--- a/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js
@@ -27,15 +27,15 @@
    */
   var feedModule = angular.module('app.controllers.process');
 
-  feedModule.controller('ProcessClustersCtrl', ['$scope', 'clustersList', 'EntityFactory', '$timeout',
-                                              function($scope, clustersList, entityFactory, $timeout) {
+  feedModule.controller('ProcessClustersCtrl', ['$scope', 'clustersList', 'EntityFactory', '$timeout', 'DateHelper',
+                                              function($scope, clustersList, entityFactory, $timeout, DateHelper) {
 
     $timeout(function () {
       angular.element('.firstSelectClusterStep').trigger('focus');
     }, 500);
 
     $scope.init = function() {
-      $scope.dateFormat = 'MM/dd/yyyy';
+      $scope.dateFormat = DateHelper.getLocaleDateFormat();
     };
 
     $scope.openDatePicker = function($event, container) {
diff --git a/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js b/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js
index bda465d..9ded878 100644
--- a/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js
@@ -27,18 +27,46 @@
    */
   var feedModule = angular.module('app.controllers.process');
 
-  feedModule.controller('ProcessGeneralInformationCtrl', [ '$scope', function($scope) {
-    var availableVerions = {
-      oozie: ['3.1.3-incubating', '3.2.0-incubating', '3.3.0', '3.3.1', '3.3.2', '4.0.0', '4.0.1'],
-      pig: ['pig-0.10.0', 'pig-0.10.1', 'pig-0.11.0', 'pig-0.11.1', 'pig-0.12.0', 'pig-0.12.1', 'pig-0.13.0', 'pig-0.8.0', 'pig-0.8.1', ' pig-0.9.0', ' pig-0.9.1', 'pig-0.9.2'],
-      hive: ['hive-0.10.0', 'hive-0.11.0', 'hive-0.12.0', 'hive-0.13.0', 'hive-0.13.1', 'hive-0.6.0', 'hive-0.7.0', 'hive-0.8.0', 'hive-0.8.1', 'hive-0.9.0']
-    };
+  feedModule.controller('ProcessGeneralInformationCtrl', [
+    '$scope', 'clustersList', 'feedsList', 'EntityFactory', 'Falcon', 'X2jsService','DateHelper',
+    function($scope, clustersList, feedsList, entityFactory, Falcon, X2jsService, DateHelper) {
+
     $scope.nameValid = false;
-    
+
+    $scope.$watch('process.workflow.spark.jar',function(){
+      if($scope.process.workflow.spark.jar && $scope.process.workflow.spark.jar.endsWith('.py')){
+        $scope.isPython = true;
+      }else{
+        $scope.isPython = false;
+      }
+    },true);
+
     $scope.init = function() {
-      $scope.versions = [];
+      unwrapClusters(clustersList);
+      unwrapFeeds(feedsList);
+      $scope.dateFormat = DateHelper.getLocaleDateFormat();
     };
 
+    $scope.openDatePicker = function($event, container) {
+      $event.preventDefault();
+      $event.stopPropagation();
+      container.opened = true;
+    };
+
+    $scope.validateStartEndDate = function () {
+      delete $scope.invalidEndDate;
+      if (this.input.start && this.input.end) {
+        var startDate = new Date(this.input.start),
+          endDate = new Date(this.input.end);
+        if (endDate.toString !== 'Invalid Date' && startDate.toString !== 'Invalid Date') {
+          if (startDate > endDate) {
+            $scope.invalidEndDate = "ng-dirty ng-invalid";
+          }
+        }
+      }
+    };
+
+    // TAGS
     $scope.addTag = function() {
       $scope.process.tags.push({key: null, value: null});
     };
@@ -49,16 +77,101 @@
       }
     };
 
-    $scope.selectWorkflow = function() {
-      if($scope.process.workflow) {        
-        var engine = $scope.process.workflow.engine;
-        $scope.process.workflow.version = "";
-        $scope.versions = availableVerions[engine];
+    // inputs
+    $scope.addInput = function () {
+      $scope.process.inputs.push(entityFactory.newInput());
+    };
+
+    $scope.removeInput = function (index) {
+      if (index >= 0) {
+        $scope.process.inputs.splice(index, 1);
+      }
+    };
+
+    // OUTPUTS
+    $scope.addOutput = function () {
+      $scope.process.outputs.push(entityFactory.newOutput());
+    };
+
+    $scope.removeOutput = function (index) {
+      if (index >= 0) {
+        $scope.process.outputs.splice(index, 1);
       }
     };
 
     $scope.init();
-    $scope.selectWorkflow();
+
+    $scope.getSourceDefinition = function (clusterName) {
+      Falcon.getEntityDefinition("cluster", clusterName)
+        .success(function (data) {
+          $scope.sourceClusterModel = X2jsService.xml_str2json(data);
+          var sparkInterface = $scope.sourceClusterModel.cluster.interfaces.interface.filter(
+            function(clusterInterface) { return clusterInterface._type === 'spark'; }
+          )[0];
+          if (sparkInterface) {
+            var sparkEndpoint = sparkInterface._endpoint.trim();
+            if (sparkEndpoint.indexOf('yarn') != '-1') {
+              $scope.process.workflow.spark.master = 'yarn';
+              $scope.process.workflow.spark.mode = sparkEndpoint.substring(5);
+            } else if (sparkEndpoint === 'local') {
+              $scope.process.workflow.spark.master = 'local';
+            }
+          }
+        })
+        .error(function (err) {
+          Falcon.logResponse('error', err, false, true);
+        });
+    };
+
+    //-----------PROPERTIES----------------//
+    $scope.addProperty = function () {
+      var lastOne = $scope.process.properties.length - 1;
+      if($scope.process.properties[lastOne].name && $scope.process.properties[lastOne].value) {
+        $scope.process.properties.push(entityFactory.newProperty("", ""));
+      }
+    };
+
+    $scope.removeProperty = function(index) {
+      if(index !== null && $scope.process.properties[index]) {
+        $scope.process.properties.splice(index, 1);
+      }
+    };
+
+    $scope.policyChange = function(){
+      if($scope.process.retry.policy === 'final'){
+       $scope.process.retry.delay.quantity = '0';
+       $scope.process.retry.delay.unit = 'minutes';
+       $scope.process.retry.attempts = '0';
+      }else{
+        $scope.process.retry.delay.quantity = '30';
+        $scope.process.retry.delay.unit = 'minutes';
+        $scope.process.retry.attempts = '3';
+      }
+    }
+
+    function unwrapClusters(clusters) {
+      $scope.clusterList = [];
+      var typeOfData = Object.prototype.toString.call(clusters.entity);
+      if(typeOfData === "[object Array]") {
+        $scope.clusterList = clusters.entity;
+      } else if(typeOfData === "[object Object]") {
+        $scope.clusterList = [clusters.entity];
+      } else {
+        //console.log("type of data not recognized");
+      }
+    }
+
+    function unwrapFeeds(feeds) {
+      $scope.feedsList = [];
+      var typeOfData = Object.prototype.toString.call(feeds.entity);
+      if (typeOfData === "[object Array]") {
+        $scope.feedsList = feeds.entity;
+      } else if (typeOfData === "[object Object]") {
+        $scope.feedsList = [feeds.entity];
+      } else {
+        //console.log("type of data not recognized");
+      }
+    }
 
   }]);
 
diff --git a/falcon-ui/app/js/controllers/process/process-root-ctrl.js b/falcon-ui/app/js/controllers/process/process-root-ctrl.js
index 7d461ba..f527383 100644
--- a/falcon-ui/app/js/controllers/process/process-root-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-root-ctrl.js
@@ -28,13 +28,18 @@
   var processModule = angular.module('app.controllers.process');
 
   processModule.controller('ProcessRootCtrl', [
-    '$scope', '$state', '$interval', '$controller', 'EntityFactory',
-    'EntitySerializer', 'X2jsService', 'ValidationService', 'SpinnersFlag', '$rootScope',
-    function ($scope, $state, $interval, $controller, entityFactory,
-              serializer, X2jsService, validationService, SpinnersFlag, $rootScope) {
+    '$scope', '$state', '$interval', '$controller', 'EntityFactory', 'RouteHelper',
+    'EntitySerializer', 'X2jsService', 'ValidationService', 'SpinnersFlag', '$rootScope', 'ProcessModel', 'Falcon',
+    function ($scope, $state, $interval, $controller, entityFactory, RouteHelper,
+              serializer, X2jsService, validationService, SpinnersFlag, $rootScope, processModel, Falcon) {
 
       $scope.entityType = 'process';
 
+      var stateMatrix = {
+              general : {previous : '', next : 'summary'},
+              summary : {previous : 'general', next : ''}
+      };
+
         //extending root controller
       $controller('EntityRootCtrl', {
         $scope: $scope
@@ -44,20 +49,34 @@
         $scope.baseInit();
         var type = $scope.entityType;
         $scope[type] = $scope.loadOrCreateEntity();
+        if(processModel && processModel.clone === true){
+          $scope.cloningMode = true;
+          $scope.editingMode = false;
+          $scope[type].name = "";
+        }else if(processModel && processModel.edit === true){
+          $scope.editingMode = true;
+          $scope.cloningMode = false;
+        }else{
+          $scope.editingMode = false;
+          $scope.cloningMode = false;
+        }
       };
 
       $scope.isActive = function (route) {
-        return route === $state.$current.name;
+        return route === $state.current.name;
+      };
+
+      $scope.isCompleted = function (route) {
+        return $state.get(route).data && $state.get(route).data.completed;
       };
 
       $scope.loadOrCreateEntity = function() {
         var type = $scope.entityType;
-        var model = $scope.models[type + 'Model'];
-        $scope.models[type + 'Model'] = null;
-        if(model) {
-          return serializer.preDeserialize(model, type);
+        if(!processModel && $scope.$parent.models.processModel){
+          processModel = $scope.$parent.models.processModel;
         }
-        return entityFactory.newEntity(type);
+        $scope.$parent.models.processModel = null;
+        return processModel ? serializer.preDeserialize(processModel, type) : entityFactory.newEntity(type);
       };
 
       $scope.init();
@@ -82,7 +101,9 @@
         } else {
           try {
             $scope[type] = serializer.deserialize($scope.prettyXml, type);
+            $scope.invalidXml = false;
           } catch (exception) {
+            $scope.invalidXml = true;
             console.log('user entered xml incorrect format');
             console.log(exception);
           }
@@ -90,7 +111,17 @@
 
       };
 
-      var xmlPreviewWorker = $interval(xmlPreviewCallback, 1000);
+      $scope.$watch('process', function(){
+        if($scope.editXmlDisabled) {
+          xmlPreviewCallback();
+        }
+      }, true);
+     $scope.$watch('prettyXml', function(){
+       if(!$scope.editXmlDisabled) {
+         xmlPreviewCallback();
+       }
+      }, true);
+
       $scope.skipUndo = false;
       $scope.$on('$destroy', function() {
 
@@ -100,16 +131,22 @@
           ACLIsEqual = angular.equals($scope.process.ACL, defaultProcess.ACL),
           workflowIsEqual = angular.equals($scope.process.workflow, defaultProcess.workflow);
 
-        $interval.cancel(xmlPreviewWorker);
-
         if (!$scope.skipUndo && (!nameIsEqual || !ACLIsEqual || !workflowIsEqual)) {
           $scope.$parent.models.processModel = angular.copy(X2jsService.xml_str2json($scope.xml));
+          if($scope.cloningMode){
+            $scope.$parent.models.processModel.clone = true;
+          }
+          if($scope.editingMode){
+            $scope.$parent.models.processModel.edit = true;
+          }
           $scope.$parent.cancel('process', $rootScope.previousState);
         }
       });
 
       //---------------------------------//
-      $scope.goNext = function (formInvalid, stateName) {
+      $scope.goNext = function (formInvalid) {
+        $state.current.data = $state.current.data || {};
+        $state.current.data.completed = !formInvalid;
         SpinnersFlag.show = true;
         if (!validationService.nameAvailable || formInvalid) {
           validationService.displayValidations.show = true;
@@ -119,20 +156,69 @@
         }
         validationService.displayValidations.show = false;
         validationService.displayValidations.nameShow = false;
-        $state.go(stateName);
+        $state.go(RouteHelper.getNextState($state.current.name, stateMatrix));
       };
 
-      $scope.goBack = function (stateName) {
+      $scope.goBack = function () {
         SpinnersFlag.backShow = true;
         validationService.displayValidations.show = false;
         validationService.displayValidations.nameShow = false;
-        $state.go(stateName);
+        $state.go(RouteHelper.getPreviousState($state.current.name, stateMatrix));
       };
 
       $scope.goTest = function (formInvalid) {
         console.log(formInvalid);
       };
 
+      $scope.toggleclick = function () {
+        $('.formBoxContainer').toggleClass('col-xs-14 ');
+        $('.xmlPreviewContainer ').toggleClass('col-xs-10 hide');
+        $('.preview').toggleClass('pullOver pullOverXml');
+        ($('.preview').hasClass('pullOver')) ? $('.preview').find('button').html('Preview XML') : $('.preview').find('button').html('Hide XML');
+        ($($("textarea")[0]).attr("ng-model") == "prettyXml" ) ? $($("textarea")[0]).css("min-height", $(".formBoxContainer").height() - 40 ) : '';
+      };
+
+      $scope.saveEntity = function() {
+        var type = $scope.entityType;
+        SpinnersFlag.saveShow = true;
+
+        if($scope.editingMode) {
+          Falcon.logRequest();
+          Falcon.postUpdateEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'  + $scope.xml, $scope.entityType, $scope[type].name)
+            .success(function (response) {
+               $scope.skipUndo = true;
+               Falcon.logResponse('success', response, false);
+               SpinnersFlag.saveShow = false;
+               $state.go('main');
+
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, false);
+              SpinnersFlag.saveShow = false;
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        }
+        else {
+          Falcon.logRequest();
+          Falcon.postSubmitEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + $scope.xml, $scope.entityType)
+            .success(function (response) {
+               $scope.skipUndo = true;
+               Falcon.logResponse('success', response, false);
+               SpinnersFlag.saveShow = false;
+               $state.go('main');
+
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, false);
+              SpinnersFlag.saveShow = false;
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        }
+      };
+
+      if($state.current.name !== "forms.process.general"){
+        $state.go("forms.process.general");
+      }
     }
   ]);
 
diff --git a/falcon-ui/app/js/controllers/process/process-summary-ctrl.js b/falcon-ui/app/js/controllers/process/process-summary-ctrl.js
index 494c249..b68b055 100644
--- a/falcon-ui/app/js/controllers/process/process-summary-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-summary-ctrl.js
@@ -49,45 +49,6 @@
       return input ? (output || input) : 'Not specified';
     };
 
-    $scope.saveEntity = function() {
-      var type = $scope.entityType;
-      SpinnersFlag.show = true;
-
-      if(!$scope.$parent.cloningMode) {
-        Falcon.logRequest();
-        Falcon.postUpdateEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'  + $scope.xml, $scope.entityType, $scope[type].name)
-          .success(function (response) {
-             $scope.$parent.skipUndo = true;
-             Falcon.logResponse('success', response, false);
-             $state.go('main');
-
-          })
-          .error(function (err) {
-            SpinnersFlag.show = false;
-            Falcon.logResponse('error', err, false);
-            angular.element('body, html').animate({scrollTop: 0}, 300);
-          });
-      }
-      else {
-        Falcon.logRequest();
-        Falcon.postSubmitEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + $scope.xml, $scope.entityType)
-          .success(function (response) {
-             $scope.$parent.skipUndo = true;
-             Falcon.logResponse('success', response, false);
-             $state.go('main');
-
-          })
-          .error(function (err) {
-            Falcon.logResponse('error', err, false);
-            SpinnersFlag.show = false;
-            angular.element('body, html').animate({scrollTop: 0}, 300);
-          });
-      }
-
-      $scope.editingMode = false;
-      $scope.cloningMode = false;
-    };
-
     $scope.init();
 
   }]);
diff --git a/falcon-ui/app/js/controllers/root-controller.js b/falcon-ui/app/js/controllers/root-controller.js
index 709f6b2..b5dadaa 100644
--- a/falcon-ui/app/js/controllers/root-controller.js
+++ b/falcon-ui/app/js/controllers/root-controller.js
@@ -22,11 +22,11 @@
 
   app.controller('RootCtrl', [
     "$scope", "$timeout", "Falcon", "FileApi", "EntityModel",
-    "$state", "X2jsService", "ValidationService", "SpinnersFlag", "EntityFalcon",
+    "$state", "X2jsService", "ValidationService", "SpinnersFlag", "EntityFalcon", '$localStorage',
     function ($scope, $timeout, Falcon, FileApi,
-              EntityModel, $state, X2jsService, validationService, SpinnersFlag, EntityFalcon) {
+              EntityModel, $state, X2jsService, validationService, SpinnersFlag, EntityFalcon, $localStorage) {
 
-      var resultsPerPage = 10;
+      var resultsPerPage = 20;
 
       $scope.server = Falcon;
       $scope.validations = validationService;
@@ -35,28 +35,28 @@
 
       $scope.pages = [];
       $scope.nextPages = false;
+      $scope.hasClusters = true;
 
       $scope.handleFile = function (evt) {
         Falcon.logRequest();
         FileApi.loadFile(evt).then(function () {
           if (EntityModel.type === 'Type not recognized') {
-            Falcon.logResponse('error', {status: 'ERROR', message:'Invalid xml. File not uploaded'}, false);
+            Falcon.logResponse('error', {status: 'ERROR', message:"Entity type not recognized"}, false);
           } else {
-            Falcon.postSubmitEntity(FileApi.fileRaw, EntityModel.type).success(function (response) {
-              Falcon.logResponse('success', response, false);
-              $scope.refreshList($scope.tags);
-            }).error(function (err) {
-              Falcon.logResponse('error', err, false);
-            });
+            var entityType = EntityModel.type;
+            $state.go("forms." + entityType + ".general", {'action':'import'}, {reload: true});
           }
-
         });
       };
 
-      $scope.goPage = function(page){
-        $scope.loading = true;
+      $scope.goPage = function(page, type){
+        $scope.currentPage = page;
+        if (!(type && type == 'list')) {
+          $scope.loading = true;
+        }
+
         var offset = (page-1) * resultsPerPage;
-        EntityFalcon.searchEntities($scope.entityName, $scope.entityTags, $scope.entityType, offset).then(function() {
+        return EntityFalcon.searchEntities($scope.entityName, $scope.entityTags, $scope.entityType, offset).then(function() {
           if (EntityFalcon.data !== null) {
             $scope.actualPage = page;
             $scope.searchList = EntityFalcon.data.entity;
@@ -72,14 +72,16 @@
                 $scope.pages[i].enabled = true;
               }
             }
-            if($scope.searchList.length === 0){
+            if($scope.searchList.length === 0 && !(type && type == 'list')){
               Falcon.warningMessage("No results matched the search criteria.");
             }
             $timeout(function() {
               angular.element('#tagsInput').focus();
             }, 0, false);
             Falcon.responses.listLoaded = true;
-            $scope.loading = false;
+            if (!(type && type == 'list')) {
+              $scope.loading = false;
+            }
           }
         });
       };
@@ -128,13 +130,134 @@
       };
 
       $scope.cancel = function (type, state) {
+        var message = type + ' edition cancelled';
+        if(type === 'cluster'){
+          message = 'Create New Cluster operation cancelled'
+        }
         var cancelInfo = {
           state: state || $state.current.name,
-          message: type + ' edition canceled '
+          message: message
         };
         Falcon.logResponse('cancel', cancelInfo, type, false);
       };
 
+      $scope.displayResults = function (remove) {
+        $state.go("main");
+        $scope.refreshList($scope.tags);
+        (!remove) ? $scope.persistSearch($scope.tags) : '';
+
+      };
+
+      $scope.persistSearch = function(newTag){
+        var storedTags = $localStorage['SearchedTag'],
+            flagExit = false,
+            newval = newTag[newTag.length -1].text;
+
+
+        if(storedTags !== undefined && newTag !== undefined && newTag.length > 0){
+
+          for(var t=0; t<storedTags.length; t++){
+            if(storedTags[t].toLowerCase() === newval.toLowerCase()) {
+              flagExit = true;
+              break;
+            }
+          }
+          if(!flagExit ) {
+            storedTags.push(newval);
+            $localStorage['SearchedTag'] = storedTags;
+          }
+
+          if(storedTags.length > 5) { storedTags.splice(0,1); $localStorage['SearchedTag'] = storedTags; }
+
+        } else if(newTag !== undefined && newTag.length > 0) {
+          $localStorage['SearchedTag'] = [newval];
+        }
+
+      };
+
+      $scope.clearTags = function(){
+        $scope.tags = [];
+        $scope.refreshList($scope.tags);
+      };
+
+$scope.loadTags = function(query) {
+        var tags = new Array(), storedTags = $localStorage['SearchedTag'], tagAdded = false, tempTags = [];
+        if(!$scope.$parent.nameFounded){
+          tags.push({ text: 'Name:' + query });
+          tempTags.push('Name:' + query);
+        }
+
+        if(storedTags != undefined && storedTags.length > 0){
+          for(var e=0; e < storedTags.length; e++){
+              if(storedTags[e].toLowerCase().indexOf(query.toLowerCase()) != -1){
+                 if(tempTags.indexOf(storedTags[e]) == -1) {
+                    tags.push({ text: storedTags[e] });
+                    tempTags.push('Name:' + query);
+                    tagAdded = true;
+               }
+              }
+          }
+        }
+
+
+        if(!$scope.$parent.typeFounded && !tagAdded){
+          var queryAux = query.toUpperCase();
+          if(queryAux === "F" || queryAux === "FE" || queryAux === "FEE" || queryAux === "FEED"){
+            tags.push({ text: 'Type:feed'});
+          }
+          if(queryAux === "P" || queryAux === "PR" || queryAux === "PRO" || queryAux === "PROC" || queryAux === "PROCE"
+              || queryAux === "PROCES" || queryAux === "PROCESS"){
+            tags.push({ text: 'Type:process'});
+          }
+          if(queryAux === "M" || queryAux === "MI" || queryAux === "MIR" || queryAux === "MIRR" || queryAux === "MIRRO"
+              || queryAux === "MIRROR"){
+            tags.push({ text: 'Type:mirror'});
+          }
+        }
+        if(query !== "*"){
+          tags.push({ text: 'Tag:' + query });
+        }
+        return tags;
+      };
+
+      $scope.clusterInterfaceLabels = function(interfaceType) {
+        switch (interfaceType) {
+          case "readonly":
+            return "File System Read Endpoint Address";
+          case "write":
+            return "File System Default Address";
+          case "execute":
+            return "Yarn Resource Manager Address";
+          case "workflow":
+            return "Workflow Address";
+          case "messaging":
+            return "Message Broker Address";
+          case "registry":
+            return "Metadata Catalog Registry";
+          case "spark":
+            return "Spark";
+          default:
+            return "";
+        }
+      };
+
+      $scope.displayEntities = function (type) {
+        $state.go("main", { 'fromAction' : 'listEntities'});
+        $scope.entityType = type;
+        $scope.entityName = '';
+        $scope.entityTags = '';
+        $scope.goPage(1, 'list');
+      };
+
+      $scope.feedPropertiesLabels = {
+        queueName: 'Queue Name',
+        jobPriority: 'Job Priority',
+        timeout: 'Timeout',
+        parallel: 'Parallel',
+        maxMaps: 'Max Maps',
+        mapBandwidthKB: 'Map Bandwidth KB'
+      };
+
     }]);
 
 }());
\ No newline at end of file
diff --git a/falcon-ui/app/js/controllers/snapshot/snapshot-controller.js b/falcon-ui/app/js/controllers/snapshot/snapshot-controller.js
new file mode 100644
index 0000000..3f047ce
--- /dev/null
+++ b/falcon-ui/app/js/controllers/snapshot/snapshot-controller.js
@@ -0,0 +1,262 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  var snapshotModule = angular.module('app.controllers.snapshot', [ 'app.services' ]);
+
+  snapshotModule.controller('SnapshotController', [
+    "$scope", "$interval", "$controller", "Falcon", "EntityModel", "$state", "X2jsService", "DateHelper",
+    "RouteHelper", "ValidationService", "SpinnersFlag", "$timeout", "$rootScope", "clustersList",
+    "$cookieStore", "SnapshotModel", "EntityFactory", "ExtensionSerializer",
+    function ($scope, $interval, $controller, Falcon, EntityModel, $state, X2jsService, DateHelper,
+       RouteHelper, validationService, SpinnersFlag, $timeout, $rootScope, clustersList,
+       $cookieStore, snapshotModel, entityFactory, extensionSerializer) {
+
+      var stateMatrix = {
+        general : {previous : '', next : 'summary'},
+        summary : {previous : 'general', next : ''}
+      };
+
+      $scope.entityType = 'snapshot';
+      $scope.skipUndo = false;
+      $scope.clusterErrorMessage = '';
+      unwrapClusters(clustersList);
+
+      //extending root controller
+      $controller('EntityRootCtrl', {
+        $scope: $scope
+      });
+
+      $scope.$on('$destroy', function() {
+        var defaultProcess = entityFactory.newEntity('snapshot'),
+          nameIsEqual = ($scope.snapshot.name == null || $scope.snapshot.name === ""),
+          ACLIsEqual = angular.equals($scope.snapshot.ACL, defaultProcess.ACL);
+
+        if (!$scope.skipUndo && (!nameIsEqual || !ACLIsEqual)) {
+          $scope.$parent.models.snapshotModel = $scope.snapshot;
+          if ($scope.cloningMode) {
+            $scope.$parent.models.snapshotModel.clone = true;
+          }
+          if ($scope.editingMode) {
+            $scope.$parent.models.snapshotModel.edit = true;
+          }
+          $scope.$parent.cancel('snapshot', $rootScope.previousState);
+        }
+      });
+
+       $scope.isActive = function (route) {
+        return route === $state.current.name;
+      };
+
+      $scope.isCompleted = function (route) {
+        return $state.get(route).data && $state.get(route).data.completed;
+      };
+
+      $scope.loadOrCreateEntity = function() {
+        var type = $scope.entityType;
+
+        if(!snapshotModel && $scope.$parent.models.snapshotModel) {
+          var snapshotObj = $scope.$parent.models.snapshotModel;
+          $scope.$parent.models.snapshotModel = null;
+          return snapshotObj;
+        }
+        $scope.$parent.models.snapshotModel = null;
+        return snapshotModel ? extensionSerializer.serializeExtensionModel(snapshotModel, 'snapshot')
+          : entityFactory.newEntity(type);
+      };
+
+      $scope.init = function() {
+        $scope.baseInit();
+        var type = $scope.entityType;
+        $scope[type] = $scope.loadOrCreateEntity();
+        if(snapshotModel && snapshotModel.clone === true) {
+          $scope.cloningMode = true;
+          $scope.editingMode = false;
+          $scope[type].name = "";
+        } else if(snapshotModel && snapshotModel.edit === true) {
+          $scope.editingMode = true;
+          $scope.cloningMode = false;
+        } else{
+          $scope.editingMode = false;
+          $scope.cloningMode = false;
+        }
+        console.log($scope.editingMode);
+      }
+
+      $scope.init();
+
+      //----------------TAGS---------------------//
+      $scope.addTag = function () {
+        $scope.snapshot.tags.push({key: null, value: null});
+      };
+
+      $scope.removeTag = function (index) {
+        if (index >= 0 && $scope.snapshot.tags.length > 1) {
+          $scope.snapshot.tags.splice(index, 1);
+        }
+      };
+
+      //----------- Alerts -----------//
+      $scope.addAlert = function () {
+        $scope.snapshot.alerts.push($scope.snapshot.alert.email);
+        $scope.snapshot.alert = {email: ""};
+      };
+      $scope.removeAlert = function (index) {
+        $scope.snapshot.alerts.splice(index, 1);
+      };
+
+      //----------------- DATE INPUTS -------------------//
+      $scope.dateFormat = 'MM/dd/yyyy';
+
+      $scope.openStartDatePicker = function ($event) {
+        $event.preventDefault();
+        $event.stopPropagation();
+        $scope.startOpened = true;
+      };
+
+      $scope.openEndDatePicker = function ($event) {
+        $event.preventDefault();
+        $event.stopPropagation();
+        $scope.endOpened = true;
+      };
+
+      $scope.constructDate = function () {
+        if ($scope.snapshot.validity.start && $scope.snapshot.validity.end
+          && $scope.snapshot.validity.startTime && $scope.snapshot.validity.endTime) {
+          $scope.snapshot.validity.startISO = DateHelper.createISO(
+            $scope.snapshot.validity.start, $scope.snapshot.validity.startTime, $scope.snapshot.validity.timezone);
+          $scope.snapshot.validity.endISO = DateHelper.createISO(
+            $scope.snapshot.validity.end, $scope.snapshot.validity.endTime, $scope.snapshot.validity.timezone);
+        }
+      };
+
+      $scope.$watch(function () {
+        return $scope.snapshot.validity.timezone;
+      }, function () {
+        return $scope.constructDate();
+      });
+
+      $scope.validateCluster = function() {
+        if ($scope.snapshot.source.cluster === $scope.snapshot.target.cluster) {
+          $scope.clusterErrorMessage = 'Target cannot be the same as the Source';
+        } else {
+          $scope.clusterErrorMessage = '';
+        }
+      };
+
+      $scope.goNext = function (formInvalid) {
+        $state.current.data = $state.current.data || {};
+        $state.current.data.completed = !formInvalid;
+
+        SpinnersFlag.show = true;
+        if (!validationService.nameAvailable || formInvalid) {
+          validationService.displayValidations.show = true;
+          validationService.displayValidations.nameShow = true;
+          SpinnersFlag.show = false;
+          return;
+        }
+        if ($scope.clusterErrorMessage !== '') {
+          SpinnersFlag.show = false;
+          return;
+        }
+        validationService.displayValidations.show = false;
+        validationService.displayValidations.nameShow = false;
+        $state.go(RouteHelper.getNextState($state.current.name, stateMatrix));
+        angular.element('body, html').animate({scrollTop: 0}, 500);
+      };
+
+      $scope.goBack = function () {
+        SpinnersFlag.backShow = true;
+        validationService.displayValidations.show = false;
+        validationService.displayValidations.nameShow = false;
+        $state.go(RouteHelper.getPreviousState($state.current.name, stateMatrix));
+        angular.element('body, html').animate({scrollTop: 0}, 500);
+      };
+
+      $scope.save = function (formInvalid) {
+        SpinnersFlag.saveShow = true;
+
+        $state.current.data = $state.current.data || {};
+        $state.current.data.completed = !formInvalid;
+        if (!validationService.nameAvailable || formInvalid) {
+          validationService.displayValidations.show = true;
+          validationService.displayValidations.nameShow = true;
+          SpinnersFlag.saveShow = false;
+          return;
+        }
+        if ($scope.clusterErrorMessage !== '') {
+          SpinnersFlag.saveShow = false;
+          return;
+        }
+        validationService.displayValidations.show = false;
+        validationService.displayValidations.nameShow = false;
+
+        var snapshotData = extensionSerializer.convertObjectToString(
+          extensionSerializer.serializeExtensionProperties($scope.snapshot, 'snapshot'));
+
+        if($scope.editingMode) {
+          Falcon.postUpdateExtension(snapshotData, 'HDFS-SNAPSHOT-MIRRORING')
+            .success(function (response) {
+              $scope.skipUndo = true;
+              Falcon.logResponse('success', response, false);
+              SpinnersFlag.saveShow = false;
+              $state.go('main');
+
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, false);
+              SpinnersFlag.saveShow = false;
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        } else {
+          Falcon.postSubmitExtension(snapshotData, 'HDFS-SNAPSHOT-MIRRORING')
+            .success(function (response) {
+              $scope.skipUndo = true;
+              Falcon.logResponse('success', response, false);
+              SpinnersFlag.saveShow = false;
+              $state.go('main');
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, false);
+              SpinnersFlag.saveShow = false;
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        }
+      };
+
+      function unwrapClusters(clusters) {
+	if(clusters !== undefined && clusters !== null && clusters !== "null"){
+		$scope.clusterList = [];
+          var typeOfData = Object.prototype.toString.call(clusters.entity);
+          if(typeOfData === "[object Array]") {
+            $scope.clusterList = clusters.entity;
+          } else if(typeOfData === "[object Object]") {
+            $scope.clusterList = [clusters.entity];
+          } else {
+            console.log("type of data not recognized");
+          }
+	}
+      }
+
+      if($state.current.name !== "forms.snapshot.general"){
+        $state.go("forms.snapshot.general");
+      }
+
+    }]);
+}());
diff --git a/falcon-ui/app/js/controllers/themeController.js b/falcon-ui/app/js/controllers/themeController.js
new file mode 100644
index 0000000..513b19e
--- /dev/null
+++ b/falcon-ui/app/js/controllers/themeController.js
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function() {
+    'use strict';
+
+    var app = angular.module('app.controllers.theme', []);
+
+    app.controller('ThemeController', ["$scope", function($scope) {
+
+        $scope.theme = 'default';
+        $scope.themeChange = function(theme) {
+            $scope.theme = theme;
+        };
+    }]);
+
+}());
diff --git a/falcon-ui/app/js/directives/acl-permissions.js b/falcon-ui/app/js/directives/acl-permissions.js
new file mode 100644
index 0000000..98ef508
--- /dev/null
+++ b/falcon-ui/app/js/directives/acl-permissions.js
@@ -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.
+ */
+(function () {
+  'use strict';
+
+  var aclPermissionsModule = angular.module('app.directives.acl-permissions',[]);
+
+  aclPermissionsModule.directive('aclPermissions', ['$timeout',function ($timeout) {
+      return {
+          restrict : 'EA',
+          templateUrl: 'html/directives/aclPermissions.html',
+          link: function ($scope, element, attrs) {
+
+            var permission = {
+              'owner' : 0,
+              'groups' : 0,
+              'others' : 0
+            }
+
+            function getNestedProperty(obj, path) {
+              var paths = path.split('.'),
+              current = obj;
+              for (var i = 0; i < paths.length; i++) {
+                if (current[paths[i]] == undefined) {
+                  return undefined;
+                } else {
+                  current = current[paths[i]];
+                }
+              }
+              return current;
+            };
+
+            function setNestedProperty(obj, path, value) {
+              var paths = path.split('.'),
+              current = obj;
+              for (var i = 0; i < paths.length -1; i++) {
+                  current = current[paths[i]];
+              }
+              current[paths[paths.length - 1]] = value;
+            };
+
+            var defaultPermission = getNestedProperty($scope, attrs.aclModel);
+
+            function setPermission() {
+              if(defaultPermission){
+                var permissionArray = defaultPermission.substring(2).split("");
+                permissionArray.forEach(function(value, index){
+                  var permissionValue = parseInt(value);
+                  var type = Object.keys(permission)[index];
+                  permission[type] = value;
+                  var checked = element.find('input[name=' + type + ']');
+                  var readPermission = 4,
+                      writePermission = 2,
+                      executePermission = 1;
+                  if(permissionValue & readPermission){
+                    angular.element(checked[0]).attr('checked','checked');
+                  }
+                  if(permissionValue & writePermission){
+                    angular.element(checked[1]).attr('checked','checked');
+                  }
+                  if(permissionValue & executePermission){
+                    angular.element(checked[2]).attr('checked','checked');
+                  }
+                });
+              }
+            };
+
+            $scope.calculatePermission = function(type){
+              var checked = element.find('input[name=' + type + ']:checked');
+              var total = 0;
+              angular.forEach(checked,function(element){
+                total += parseInt(element.value);
+              });
+              permission[type] = total;
+              var effectivePermission = '0x';
+              angular.forEach(permission, function(value,key){
+                effectivePermission = effectivePermission + value;
+              });
+              setNestedProperty($scope, attrs.aclModel, effectivePermission);
+            };
+
+            $timeout(function () {
+              setPermission();
+            }, 0);
+          }
+      };
+  }]);
+})();
diff --git a/falcon-ui/app/js/directives/chart.js b/falcon-ui/app/js/directives/chart.js
index f9d6983..f630a9f 100644
--- a/falcon-ui/app/js/directives/chart.js
+++ b/falcon-ui/app/js/directives/chart.js
@@ -453,7 +453,7 @@
   });
 
 
-  d3Module.controller('chartCtrl', [ "$scope", "Falcon", function($scope, Falcon) {
+  d3Module.controller('chartCtrl', [ "$scope", "Falcon", "DateHelper", function($scope, Falcon, DateHelper) {
 
     var formatFL = d3.time.format.utc("%A %d"),
         formatSL = d3.time.format.utc("%b %Y"),
@@ -500,7 +500,7 @@
 
     };
 
-    $scope.dateFormat ='MM/dd/yyyy';
+    $scope.dateFormat = DateHelper.getLocaleDateFormat();
     $scope.openDatePicker = function($event) {
       $event.preventDefault();
       $event.stopPropagation();
diff --git a/falcon-ui/app/js/directives/check-name.js b/falcon-ui/app/js/directives/check-name.js
index bea0e22..edb3697 100644
--- a/falcon-ui/app/js/directives/check-name.js
+++ b/falcon-ui/app/js/directives/check-name.js
@@ -20,24 +20,28 @@
 
   var checkNameModule = angular.module('app.directives.check-name', ['app.services.falcon', 'app.services.validation']);
 
-  checkNameModule.directive('checkName', [ "ValidationService", "$timeout", "Falcon", "EntityFalcon", function (validationService, $timeout, Falcon, EntityFalcon) {
+  checkNameModule.directive('checkName', [ "ValidationService", "$timeout", "Falcon", "EntityFalcon","$q", function (validationService, $timeout, Falcon, EntityFalcon,$q) {
     return {
-      replace: false,
       scope: {
         checkName: "="
       },
-      restrict: 'A',
-      link: function (scope, element) {
-
-        var options = scope.checkName,
-          //entities = scope.$parent.lists[options.type + 'List'],
-          type = options.type,
-          name = element[0].value;
-
+    require: ['ngModel','^form'],
+    link: function(scope, element, attrs, ctrls) {
+      var options = scope.checkName,
+        //entities = scope.$parent.lists[options.type + 'List'],
+        type = options.type,
+        name = element[0].value,
+        errorMsg,
+        ngModelCtrl = ctrls[0],
+        formCtrl = ctrls[1];
         if (!options.check) {
           return;
         }
 
+        element.parent()
+          .append("<div class='nameInputDisplay hidden'>" +
+              "</div><label class='custom-danger nameValidationMessage'></label>");
+
         scope.$watch(function () {
           return element[0].value;
         }, function () {
@@ -45,121 +49,81 @@
             if (element[0].value.length === 0) {
               element.addClass('empty');
             }
-            getNameAvailability(function() {
-              getMessage();
-              if (element.hasClass('ng-valid') && validationService.nameAvailable) {
-                angular.element('.nameValidationMessage').addClass('hidden');
-              } else {
-                element.parent().addClass("showValidationStyle");
-                angular.element('.nameValidationMessage').removeClass('hidden');
-                element.removeClass('empty');
-              }
-            });
           }
-
-
         });
 
-        function getLabels() {
-          element.parent()
-            .append("<div class='nameInputDisplay hidden'>" +
-                "</div><label class='custom-danger nameValidationMessage'></label>");
-        }
-
-        function getNameAvailability(fn) {
-          name = element[0].value;
-          if (name.length === 0) {
-            angular.element('.nameInputDisplay').addClass('hidden');
-          }else{
-            Falcon.logRequest();
-            Falcon.getEntityDefinition(type, name).success(function (data) {
-              Falcon.logResponse('success', data, false, true);
-              validationService.nameAvailable = false;
-              if (name.length === 0) {
-                angular.element('.nameInputDisplay').addClass('hidden');
-              } else if (!validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
-                angular.element('.nameInputDisplay').html('Name unavailable')
-                    .removeClass('custom-success hidden').addClass('custom-danger');
-              } else if (validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
-                angular.element('.nameInputDisplay').html('Name available')
-                    .removeClass('custom-danger hidden').addClass('custom-success');
-              } else if (element.hasClass('ng-invalid-pattern') && name.length > 0) {
-                angular.element('.nameInputDisplay').addClass('hidden');
+        scope.$watch(function(){
+          return ngModelCtrl.$valid;
+        }, function(newValue, oldValue){
+          if(ngModelCtrl.$dirty && newValue){
+            errorMsg = "Name available";
+            validationService.nameAvailable = true;
+          }else {
+              if(ngModelCtrl.$error.uniqueName){
+                  errorMsg = validationService.messages.name.unavailable;
+                  validationService.nameAvailable = false;
+              }else if(ngModelCtrl.$error.required){
+                  errorMsg = validationService.messages.name.empty;
+              }else if(ngModelCtrl.$error.pattern){
+                  errorMsg = validationService.messages.name.patternInvalid;
               }
-              if (fn) { fn(); } //>callback
-            }).error(function (err) {
-              Falcon.logResponse('error', err, false, true);
-              validationService.nameAvailable = true;
-              if (name.length === 0) {
-                angular.element('.nameInputDisplay').addClass('hidden');
-              } else if (!validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
-                angular.element('.nameInputDisplay').html('Name unavailable')
-                    .removeClass('custom-success hidden').addClass('custom-danger');
-              } else if (validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
-                angular.element('.nameInputDisplay').html('Name available')
-                    .removeClass('custom-danger hidden').addClass('custom-success');
-              } else if (element.hasClass('ng-invalid-pattern') && name.length > 0) {
-                angular.element('.nameInputDisplay').addClass('hidden');
-              }
-              if (fn) { fn(); } //>callback
-            });
           }
+        });
 
-        }
-
-        function getMessage() {
-          if (name.length === 0) {
-            element.addClass('empty');
-            angular.element('.nameValidationMessage').html(validationService.messages.name.empty).addClass('hidden');
-
-          } else if (!validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
-            element.addClass('empty');
-            angular.element('.nameValidationMessage')
-              .html(validationService.messages.name.unavailable).addClass('hidden');
-
-          } else if (element.hasClass('ng-invalid-pattern') && name.length > 0) {
-            element.removeClass('empty');
+        scope.$watch(function(){
+          return errorMsg;
+        },function(newValue, oldValue){
+          if(newValue && newValue.length > 0){
             element.parent().addClass("showValidationStyle");
-            angular.element('.nameValidationMessage')
-              .html(validationService.messages.name.patternInvalid).removeClass('hidden');
-
-          } else if (element.hasClass('ng-valid') && name.length > 0) {
-            element.parent().removeClass("showValidationStyle");
-            angular.element('.nameValidationMessage').addClass('hidden');
-          }
-        }
-        function addListeners() {
-          element.bind('keyup', function () {
-            getNameAvailability();
-            getMessage();
-          });
-          element.bind('focus', function () {
             element.removeClass('empty');
-          });
-          element.bind('blur', function () {
-            if (element.hasClass('ng-valid') && validationService.nameAvailable) {
-              angular.element('.nameValidationMessage').addClass('hidden');
-
-            } else {
-              element.parent().addClass("showValidationStyle");
-              angular.element('.nameValidationMessage').removeClass('hidden');
-              element.removeClass('empty');
+            if(errorMsg ==='Name available'){
+              angular.element('.nameInputDisplay').removeClass('custom-danger hidden').addClass('custom-success');
+              angular.element('.nameInputDisplay').text(newValue);
+              angular.element('.nameValidationMessage').addClass("hidden");
+            }else{
+              angular.element('.nameValidationMessage').text(newValue);
+              angular.element('.nameValidationMessage').removeClass('hidden').addClass('custom custom-danger');
+              angular.element('.nameInputDisplay').addClass("hidden");
             }
+          }else{
+            element.parent().removeClass("showValidationStyle");
+          }
+        });
+
+        ngModelCtrl.$asyncValidators.uniqueName = function isNameAvailable(modelValue,viewValue) {
+          Falcon.logRequest();
+          var def = $q.defer();
+          Falcon.getEntityDefinition(type, modelValue).success(function (data) {
+            Falcon.logResponse('success', data, false, true);
+            def.reject();
+          }).error(function (err) {
+            Falcon.logResponse('error', err, false, true);
+            def.resolve();
           });
+          return def.promise;
         }
 
-        function init() {
-          getLabels();
-          addListeners();
-          getNameAvailability();
-          getMessage();
+        element.bind('blur',function(event){
+            if(ngModelCtrl.$valid){
+              angular.element('.nameValidationMessage').addClass('hidden');
+            }else{
+              angular.element('.nameValidationMessage').removeClass('hidden');
+            }
+        });
 
-          $timeout(function () { element.trigger('focus'); }, 20);
-        }
+        element.bind('focus',function(event){
+            if(formCtrl.$submitted && ngModelCtrl.$pristine && ngModelCtrl.$error.required){
+              angular.element('.nameValidationMessage').removeClass('hidden');
+              element.parent().addClass('showValidationStyle');
+            }else{
+              angular.element('.nameValidationMessage').addClass('hidden');
+              element.parent().removeClass('showValidationStyle');
+            }
+        });
 
-        init();
+        $timeout(function () { element.trigger('focus'); }, 0);
       }
-    };
+    }
   }]);
 
-}());
\ No newline at end of file
+}());
diff --git a/falcon-ui/app/js/directives/dependencies-graph.js b/falcon-ui/app/js/directives/dependencies-graph.js
index c8faa74..bd37358 100644
--- a/falcon-ui/app/js/directives/dependencies-graph.js
+++ b/falcon-ui/app/js/directives/dependencies-graph.js
@@ -18,17 +18,16 @@
 (function () {
   'use strict';
 
-	var entitiesListModule = angular.module('app.directives.dependencies-graph', ['app.services' ]);
+  var entitiesListModule = angular.module('app.directives.dependencies-graph', ['app.services' ]);
 
-  entitiesListModule.controller('DependenciesGraphCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService', 'EntityModel',
-                                      function($scope, Falcon, X2jsService, $window, encodeService, EntityModel) {
+  entitiesListModule.controller('DependenciesGraphCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService',
+    function($scope, Falcon, X2jsService, $window, encodeService) {
 
 
 
-  }]);
+    }]);
 
-  entitiesListModule.directive('dependenciesGraph', ["$timeout", 'Falcon', '$filter', '$state', 'X2jsService', 'EntityModel',
-                                              function($timeout, Falcon, $filter, $state, X2jsService, EntityModel) {
+  entitiesListModule.directive('dependenciesGraph', ["$timeout", 'Falcon', '$filter', function($timeout, Falcon, $filter) {
     return {
       scope: {
         type: "=",
@@ -49,16 +48,17 @@
             return type + '/' + name;
           }
 
-          function getOrCreateNode(type, name) {
+          function getOrCreateNode(type, name, tag) {
             var k = key(type, name);
             if (nodes[k] !== undefined)
               return nodes[k];
 
             var n = {
-              "id": next_node_id++,
+              "guid": next_node_id++,
               "type": type,
               "name": name,
-              "dependency": []
+              "arrowDirections": tag,
+              "children": []
             };
             nodes[k] = n;
             return n;
@@ -81,7 +81,8 @@
                   var l = data.entity.length;
                   for (var i = 0; i < l; ++i) {
                     var e = data.entity[i];
-                    var d = getOrCreateNode(e.type, e.name);
+                    var tag = e.hasOwnProperty('tags') && e.tags !== null ? e.tags.tag : "Input";
+                    var d = getOrCreateNode(e.type, e.name, tag);
                     var src = null, dst = null;
                     if (d.type === "cluster") {
                       src = node; dst = d;
@@ -94,11 +95,10 @@
                         src = node; dst = d;
                       }
                     }
-                    //console.log(src.name + '->' + dst.name);
-                    src.dependency.push(dst.id);
+                    src.children.push(d);
                   }
 
-                  done_callback(nodes);
+                  done_callback(node);
                 })
                 .error(function (err) {
                   Falcon.logResponse('error', err, false, true);
@@ -106,181 +106,141 @@
           }
 
           function load() {
-            var n = getOrCreateNode(entity_type, entity_name);
+            var n = getOrCreateNode(entity_type, entity_name, "Input");
             loadEntry(n);
           }
           load();
         };
 
-        var plotDependencyGraph = function(nodes, element) {
-          var NODE_WIDTH  = 150;
-          var NODE_HEIGHT = 50;
-          var RECT_ROUND  = 10;
-          var SEPARATION  = 40;
-          var UNIVERSAL_SEP = 80;
+        var plotDependencyGraph = function(nodes, container) {
+          var element = d3.select(container.element),
+              width = Math.max(container.width, 960),
+              height = Math.max(container.height, 300);
 
-          var svg = d3.select(element).append("svg");
-
+          var margin = {
+            top: 30,
+            right: 30,
+            bottom: 30,
+            left: 80
+          };
+          width = width - margin.right - margin.left;
+          height = height - margin.top - margin.bottom;
           // Function to draw the lines of the edge
-          var LINE_FUNCTION = d3.svg.line()
-              .x(function(d) { return d.x; })
-              .y(function(d) { return d.y; })
-              .interpolate('basis');
-
-          // Mappining from id to a node
-          var node_by_id = {};
-
-          var layout = null;
-
-          /**
-           * Calculate the intersection point between the point p and the edges of the rectangle rect
-           **/
-          function intersectRect(rect, p) {
-            var cx = rect.x, cy = rect.y, dx = p.x - cx, dy = p.y - cy, w = rect.width / 2, h = rect.height / 2;
-
-            if (dx == 0)
-              return { "x": p.x, "y": rect.y + (dy > 0 ? h : -h) };
-
-            var slope = dy / dx;
-
-            var x0 = null, y0 = null;
-            if (Math.abs(slope) < rect.height / rect.width) {
-              // intersect with the left or right edges of the rect
-              x0 = rect.x + (dx > 0 ? w : -w);
-              y0 = cy + slope * (x0 - cx);
-            } else {
-              y0 = rect.y + (dy > 0 ? h : -h);
-              x0 = cx + (y0 - cy) / slope;
-            }
-
-            return { "x": x0, "y": y0 };
-          }
-
-          function drawNode(u, value) {
-            var root = svg.append('g').classed('node', true)
-                .attr('transform', 'translate(' + -value.width/2 + ',' + -value.height/2 + ')');
-
-            var node = node_by_id[u];
+          var i = 0;
 
 
+          var tree = d3.layout.tree()
+              .size([height, width]);
 
-
-            var fo = root.append('foreignObject')
-                .attr('x', value.x)
-                .attr('y', value.y)
-                .attr('width', value.width)
-                .attr('height', value.height)
-                .attr('class', 'foreignObject');
-
-
-            var txt = fo.append('xhtml:div')
-                .text(node.name)
-                .classed('node-name', true)
-                .classed('node-name-' + node.type, true);
-
-            var rect = root.append('rect')
-              .attr('width', value.width)
-              .attr('height', value.height)
-              .attr('x', value.x)
-              .attr('y', value.y)
-              .attr('rx', RECT_ROUND)
-              .attr('ry', RECT_ROUND)
-
-              .on('click', function () {
-
-                Falcon.logRequest();
-                Falcon.getEntityDefinition(node.type.toLowerCase(), node.name)
-                  .success(function (data) {
-                    Falcon.logResponse('success', data, false, true);
-                    var entityModel = X2jsService.xml_str2json(data);
-                    EntityModel.type = node.type.toLowerCase();
-                    EntityModel.name = node.name;
-                    EntityModel.model = entityModel;
-                    $state.go('entityDetails');
-                  })
-                  .error(function (err) {
-                    Falcon.logResponse('error', err, false, false);
-                  });
-
-
+          var diagonal = d3.svg.diagonal()
+              .projection(function(d) {
+                return [d.y, d.x];
               });
 
-          }
+          var svg = element.select('svg')
+              .attr('width', width + margin.right + margin.left)
+              .attr('height', height + margin.top + margin.bottom)
+              .select('g')
+              .attr('transform',
+              'translate(' + margin.left + ',' + margin.right + ')');
 
-          function drawEdge(e, u, v, value) {
-            var root = svg.append('g').classed('edge', true);
+          svg.append("svg:defs").append("svg:marker").attr("id", "output-arrow").attr("viewBox", "0 0 10 10")
+              .attr("refX", 20).attr("refY", 5).attr("markerUnits", "strokeWidth").attr("markerWidth", 6)
+              .attr("markerHeight", 9).attr("orient", "auto").append("svg:path").attr("d", "M 0 0 L 10 5 L 0 10 z");
 
-            root.append('path')
-                .attr('marker-end', 'url(#arrowhead)')
-                .attr('d', function() {
-                  var points = value.points;
+          //marker for input type graph
+          svg.append("svg:defs")
+              .append("svg:marker")
+              .attr("id", "input-arrow")
+              .attr("viewBox", "0 0 10 10")
+              .attr("refX", -7)
+              .attr("refY", 5)
+              .attr("markerUnits", "strokeWidth")
+              .attr("markerWidth", 6)
+              .attr("markerHeight", 9)
+              .attr("orient", "auto")
+              .append("svg:path")
+              .attr("d", "M -2 5 L 8 0 L 8 10 z");
 
-                  var source = layout.node(u);
-                  var target = layout.node(v);
+          var root = nodes;
+          function update(source) {
 
-                  var p0 = points.length === 0 ? target : points[0];
-                  var p1 = points.length === 0 ? source : points[points.length - 1];
+            // Compute the new tree layout.
+            var nodes1 = tree.nodes(source).reverse(),
+                links = tree.links(nodes1);
+            // Normalize for fixed-depth.
+            nodes1.forEach(function(d) {
+              d.y = d.depth * 180;
+            });
 
-                  points.unshift(intersectRect(source, p0));
-                  points.push(intersectRect(target, p1));
+            // Declare the nodes�
+            var node = svg.selectAll('g.node')
+                .data(nodes1, function(d) {
 
-                  return LINE_FUNCTION(points);
+                  return d.id || (d.id = ++i);
                 });
+            // Enter the nodes.
+            var nodeEnter = node.enter().append('g')
+                .attr('class', 'node')
+                .attr('transform', function(d) {
+                  return 'translate(' + d.y + ',' + d.x + ')';
+                });
+
+            nodeEnter.append("image")
+                .attr("xlink:href", function(d) {
+                  //return d.icon;
+                  return d.type === 'cluster' ? 'css/img/cloud.png' : 'css/img/feed.png';
+                })
+                .attr("x", "-18px")
+                .attr("y", "-18px")
+                .attr("width", "34px")
+                .attr("height", "34px");
+
+            nodeEnter.append('text')
+                .attr('x', function(d) {
+                  return d.children || d._children ?
+                  (5) * -1 : +15;
+                })
+                .attr('dy', '-1.75em')
+                .attr('text-anchor', function(d) {
+                  return d.children || d._children ? 'middle' : 'middle';
+                })
+                .text(function(d) {
+                  return d.name;
+                })
+
+                .style('fill-opacity', 1);
+
+            // Declare the links�
+            var link = svg.selectAll('path.link')
+                .data(links, function(d) {
+                  return d.target.id;
+                });
+
+            link.enter().insert('path', 'g')
+                .attr('class', 'link')
+              //.style('stroke', function(d) { return d.target.level; })
+                .style('stroke', 'green')
+                .attr('d', diagonal);
+            link.attr("marker-start", function (d) {
+              if(d.target.arrowDirections==="Input")
+                return "url(#input-arrow)";
+            }); //if input
+            link.attr("marker-end", function (d) {
+              if(d.target.arrowDirections==="Output")
+                return "url(#output-arrow)";
+            }); //if outPut
+
           }
 
-          function postRender() {
-            svg
-                .append('svg:defs')
-                .append('svg:marker')
-                .attr('id', 'arrowhead')
-                .attr('viewBox', '0 0 10 10')
-                .attr('refX', 8)
-                .attr('refY', 5)
-                .attr('markerUnits', 'strokewidth')
-                .attr('markerWidth', 8)
-                .attr('markerHeight', 5)
-                .attr('orient', 'auto')
-                .attr('style', 'fill: #333')
-                .append('svg:path')
-                .attr('d', 'M 0 0 L 10 5 L 0 10 z');
-          }
+          update(root);
 
-          function plot() {
-            var g = new dagre.Digraph();
 
-            for (var key in nodes) {
-              var n = nodes[key];
-              node_by_id[n.id] = n;
-              g.addNode(n.id, { "width": NODE_WIDTH, "height": NODE_HEIGHT });
-            }
-
-            for (var key in nodes) {
-              var n = nodes[key];
-              for (var i = 0, l = n.dependency.length; i < l; ++i) {
-                var d = n.dependency[i];
-                g.addEdge(null, n.id, d);
-              }
-            }
-
-            layout = dagre.layout()
-                .universalSep(UNIVERSAL_SEP).rankSep(SEPARATION)
-                .run(g);
-            layout.eachEdge(drawEdge);
-            layout.eachNode(drawNode);
-
-            var graph = layout.graph();
-
-            svg.attr("width", graph.width);
-            svg.attr("height", graph.height);
-
-            postRender();
-          }
-          plot();
         };
 
         var visualizeDependencyGraph = function(type, name) {
           loadDependencyGraph(type, name, function(nodes) {
-            plotDependencyGraph(nodes, element[0]);
+            plotDependencyGraph(nodes, {element:element[0], height:element[0].offsetHeight,width:element[0].offsetWidth});
           });
         };
 
diff --git a/falcon-ui/app/js/directives/directives.js b/falcon-ui/app/js/directives/directives.js
index 9c388ea..e1366b6 100644
--- a/falcon-ui/app/js/directives/directives.js
+++ b/falcon-ui/app/js/directives/directives.js
@@ -29,9 +29,21 @@
     'app.directives.validation-message',
     'chart-module',
     'app.directives.dependencies-graph',
-    'app.directives.lineage-graph'
+    'app.directives.lineage-graph',
+    'tooltip',
+    'app.directives.feed-cluster-partitions',
+    'app.directives.acl-permissions',
+    'app.directives.interface-endpoint'
   ]);
 
+  directivesModule.directive('errorNav', function () {
+    return {
+      replace: false,
+      restrict: 'A',
+      templateUrl: 'html/error.html'
+    };
+  });
+
   directivesModule.directive('navHeader', function () {
     return {
       replace: false,
@@ -74,7 +86,7 @@
       template: '{{output}}',
       link: function (scope) {
         if (scope.value.quantity) {
-          scope.output = scope.prefix + ' ' + scope.value.quantity + ' ' + scope.value.unit;
+          scope.output = (scope.prefix ? scope.prefix + ' ' : '') + scope.value.quantity + ' ' + scope.value.unit;
         } else {
           scope.output = 'Not specified';
         }
@@ -87,16 +99,21 @@
       restrict: 'E',
       replace: false,
       scope: {
-        ngModel: '='
+        ngModel: '=',
+        required: '='
       },
       templateUrl: 'html/directives/timeZoneSelectDv.html'
     };
   });
 
-  directivesModule.directive('simpleDate', ['$filter', function ($filter) {
+  directivesModule.directive('simpleDate', ['$filter','DateHelper', function ($filter, DateHelper) {
     return {
       require: 'ngModel',
       link: function (scope, element, attrs, ngModelController) {
+        var dateFormat = DateHelper.getLocaleDateFormat();
+
+        element.attr('title','Date should be entered in '+ dateFormat.toLowerCase() + ' format.');
+
         ngModelController.$parsers.push(function (data) {
           //convert data from view format to model format
           return data;
@@ -104,7 +121,7 @@
         ngModelController.$formatters.push(function (date) {
           //convert data from model format to view format
           if (date !== "") {
-            date = $filter('date')(date, 'MM/dd/yyyy');
+            date = $filter('date')(date, dateFormat);
           }
           return date;
         });
@@ -135,6 +152,7 @@
           resize();
         });
         var resize = function () {
+          element[0].style.resize = "vertical";
           element[0].style.height = "250px";
           return element[0].style.height = "" + element[0].scrollHeight + "px";
         };
@@ -179,4 +197,259 @@
     };
   }]);
 
-}());
\ No newline at end of file
+  directivesModule.directive('scrollToError', ['$timeout',function ($timeout) {
+      return {
+          require : "^form",
+          restrict : 'A',
+          link: function (scope, element,attrs,form) {
+              element.on('mousedown',function(event){
+                event.preventDefault();
+              });
+              element.on('click', function () {
+                  var formElement = angular.element('form[name="' + form.$name + '"]');
+                  var firstInvalid = formElement[0].querySelector('.ng-invalid');
+                  $timeout(function() {
+                    if (firstInvalid) {
+                      firstInvalid.blur();
+                      firstInvalid.focus();
+                    }
+                  },0)
+              });
+          }
+      };
+  }]);
+
+  directivesModule.directive('feedFormClusterDetails', function () {
+    return {
+      replace: false,
+      restrict: 'EA',
+      templateUrl: 'html/feed/feedFormClusterDetailsTpl.html',
+      link: function ($scope, $element) {
+        $scope.$on('forms.feed.clusters:submit', function() {
+          $scope.cluster.isAccordionOpened = $element.find('.ng-invalid').length > 0;
+        });
+      }
+    };
+  });
+
+  directivesModule.directive('feedFormDataSource', function () {
+    return {
+      replace: false,
+      restrict: 'EA',
+      templateUrl: 'html/feed/feedFormDataSourceTpl.html',
+      link: function ($scope, $element) {
+        if($scope.feed.dataTransferType === 'import'){
+          $scope.dataSourceType = 'source';
+          $scope.dataTransferAction = 'extract';
+          if ($scope.feed.import === undefined) {
+            $scope.feed.import = { 'source' : {
+              'extract' : {'type' : 'full', 'mergepolicy' : 'snapshot'}, 'columnsType' : 'all', 'fields' : {} } };
+          } else {
+            if ($scope.feed.import.source.fields && $scope.feed.import.source.fields.exlcudes) {
+              $scope.feed.import.source.columnsType = 'exclude';
+            } else if ($scope.feed.import.source.fields && $scope.feed.import.source.fields.includes) {
+              $scope.feed.import.source.columnsType = 'include';
+            } else {
+              $scope.feed.import.source.columnsType = 'all';
+            }
+          }
+        } else {
+          $scope.dataSourceType = 'target';
+          $scope.dataTransferAction = 'load';
+          if ($scope.feed.export === undefined) {
+            $scope.feed.export = { 'target' : {
+              'load' : {'type' : 'updateonly' }, 'columnsType' : 'all', 'fields' : {} } };
+          } else {
+            if ($scope.feed.export.target.fields && $scope.feed.export.target.fields.exlcudes) {
+              $scope.feed.export.target.columnsType = 'exclude';
+            } else if ($scope.feed.export.target.fields && $scope.feed.export.target.fields.includes) {
+              $scope.feed.export.target.columnsType = 'include';
+            } else {
+              $scope.feed.export.target.columnsType = 'all';
+            }
+          }
+        }
+      }
+    };
+  });
+
+  directivesModule.directive('feedFormHiveStorage', ['EntityFactory',function (entityFactory) {
+    return {
+      replace: false,
+      scope: {
+        storageInfo:"=",
+        add:"&",
+        show:'&',
+        toggleAdvancedOptions:'&',
+        openDatePicker:'&',
+        constructDate:'&',
+        reset:'&',
+        validations:'=',
+        required:'='
+      },
+      restrict: 'EA',
+      templateUrl: 'html/directives/feedFormHiveStorage.html',
+      link: function ($scope) {
+        $scope.valiationMessage= JSON.stringify($scope.validations.messages.number);
+        if($scope.storageInfo.type ==='target'){
+          $scope.buttonText = 'Destination';
+        }else{
+          $scope.buttonText = 'Source'
+        }
+        if(!$scope.storageInfo.clusterStorage){
+          $scope.cluster = entityFactory.newCluster($scope.storageInfo.type, 'hive', "", null);
+        }else{
+          $scope.cluster = $scope.storageInfo.clusterStorage;
+        }
+        $scope.toggleAdvancedOptions = function(){
+          $scope.showingAdvancedOptions = !$scope.showingAdvancedOptions;
+        };
+        $scope.reset = function(){
+          $scope.storageInfo.feedClusters.forEach(function (cluster, index) {
+            if (cluster.name === $scope.cluster.name && cluster.type === $scope.cluster.type) {
+              $scope.storageInfo.feedClusters[index]
+                = entityFactory.newCluster($scope.storageInfo.type, 'hive', '', null);
+            }
+          });
+        };
+        $scope.checkDuplicateClusterOnTarget = function() {
+          if ($scope.cluster.type === 'target'
+            && $scope.cluster.name !== ''
+            && $scope.storageInfo.feedClusters.filter(function (cluster) {
+            return cluster.name === $scope.cluster.name && cluster.type === 'source';
+          }).length > 0) {
+            return true;
+          }
+          return false;
+        };
+        $scope.findClusterExists = function(newClusterName, newClusterType, clusterList) {
+          $scope.clusterExists = clusterList.filter(function (cluster) {
+            return cluster.name === newClusterName && cluster.type === newClusterType;
+          }).length > 1;
+        };
+        $scope.addCluster = function(clusterDetails){
+          var cluster = entityFactory.newCluster(clusterDetails.type, clusterDetails.dataTransferType, "", null);
+          $scope.storageInfo.feedClusters.unshift(cluster);
+          //$scope.add({value : clusterDetails});
+          //$scope.reset();
+        };
+        $scope.deleteCluster = function() {
+          $scope.storageInfo.feedClusters.forEach(function (cluster, index) {
+            if (cluster.name === $scope.cluster.name && cluster.type === $scope.cluster.type) {
+              $scope.storageInfo.feedClusters.splice(index, 1);
+            }
+          });
+        };
+      }
+    };
+  }]);
+
+  directivesModule.directive('feedFormHdfsStorage', ['EntityFactory',function (entityFactory) {
+    return {
+      replace: false,
+      scope: {
+        storageInfo:"=",
+        add:"&",
+        show:'&',
+        toggleAdvancedOptions:'&',
+        openDatePicker:'&',
+        constructDate:'&',
+        reset:'&',
+        validations:'=',
+        required:'='
+      },
+      restrict: 'EA',
+      templateUrl: 'html/directives/feedFormHdfsStorage.html',
+      require:"^form",
+      link: function ($scope, $element, $attrs, $form) {
+        $scope.valiationMessage= JSON.stringify($scope.validations.messages.number);
+        if($scope.storageInfo.type ==='target'){
+          $scope.buttonText = 'Destination';
+        }else{
+          $scope.buttonText = 'Source'
+        }
+        if(!$scope.storageInfo.clusterStorage){
+          $scope.cluster = entityFactory.newCluster($scope.storageInfo.type, 'hdfs', "", null);
+        }else{
+          $scope.cluster = $scope.storageInfo.clusterStorage;
+          if (!$scope.cluster.storage.fileSystem) {
+            $scope.cluster.storage = { 'fileSystem' : entityFactory.newClusterFileSystem() };
+          }
+        }
+        $scope.toggleAdvancedOptions = function(){
+          $scope.showingAdvancedOptions = !$scope.showingAdvancedOptions;
+        };
+        $scope.reset = function(){
+          $scope.storageInfo.feedClusters.forEach(function (cluster, index) {
+            if (cluster.name === $scope.cluster.name && cluster.type === $scope.cluster.type) {
+              $scope.storageInfo.feedClusters[index]
+                = entityFactory.newCluster($scope.storageInfo.type, 'hdfs', '', null);
+            }
+          });
+        };
+        $scope.checkDuplicateClusterOnTarget = function() {
+          if ($scope.cluster.type === 'target'
+            && $scope.cluster.name !== ''
+            && $scope.storageInfo.feedClusters.filter(function (cluster) {
+            return cluster.name === $scope.cluster.name && cluster.type === 'source';
+          }).length > 0) {
+            return true;
+          }
+          return false;
+        };
+        $scope.findClusterExists = function(newClusterName, newClusterType, clusterList) {
+          $scope.clusterExists = clusterList.filter(function (cluster) {
+            return cluster.name === newClusterName && cluster.type === newClusterType;
+          }).length > 1;
+        };
+        $scope.addCluster = function(clusterDetails, feedForm){
+          var cluster = entityFactory.newCluster(clusterDetails.type, clusterDetails.dataTransferType, "", null);
+          $scope.storageInfo.feedClusters.unshift(cluster);
+          //$scope.add({value : clusterDetails});
+          //$scope.reset();
+        };
+        $scope.deleteCluster = function() {
+          $scope.storageInfo.feedClusters.forEach(function (cluster, index) {
+            if (cluster.name === $scope.cluster.name && cluster.type === $scope.cluster.type) {
+              $scope.storageInfo.feedClusters.splice(index, 1);
+            }
+          });
+        };
+      }
+    };
+  }]);
+
+  directivesModule.directive('simpleDatePicker', ['$filter','DateHelper', function ($filter, DateHelper) {
+    return {
+      require: 'ngModel',
+      link: function ($scope, $element, $attrs, ngModelController) {
+        $element.datepicker();
+
+        var dateFormat = DateHelper.getLocaleDateFormat();
+
+        $element.attr('title','Date should be entered in '+ dateFormat.toLowerCase() + ' format.');
+
+        ngModelController.$parsers.push(function (date) {
+          //convert data from view format to model format
+          return new Date(date);
+        });
+        ngModelController.$formatters.push(function (date) {
+          //convert data from model format to view format
+          if (date !== "") {
+            date = $filter('date')(date, dateFormat);
+          }
+          return date;
+        });
+      }
+    };
+  }]);
+
+  directivesModule.directive('mandatoryField', function () {
+    return {
+      replace: false,
+      restrict: 'E',
+      template: '<span>*</span>'
+    };
+  });
+
+}());
diff --git a/falcon-ui/app/js/directives/entities-search-list.js b/falcon-ui/app/js/directives/entities-search-list.js
index 3e76f63..9171fbd 100644
--- a/falcon-ui/app/js/directives/entities-search-list.js
+++ b/falcon-ui/app/js/directives/entities-search-list.js
@@ -20,8 +20,16 @@
 
 	var entitiesListModule = angular.module('app.directives.entities-search-list', ['app.services' ]);
 
-  entitiesListModule.controller('EntitiesSearchListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService',
-                                      function($scope, Falcon, X2jsService, $window, encodeService) {
+  entitiesListModule.controller('EntitiesSearchListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService', '$rootScope',
+                                      function($scope, Falcon, X2jsService, $window, encodeService, $rootScope) {
+
+    $scope.isSafeMode = function() {
+      return $rootScope.safeMode;
+    };
+
+    $scope.isSuperUser = function() {
+      return $rootScope.superUser;
+    };
 
     $scope.downloadEntity = function(type, name) {
       Falcon.logRequest();
@@ -47,7 +55,7 @@
     };
   });
 
-  entitiesListModule.directive('entitiesSearchList', ["$timeout", 'Falcon', function($timeout, Falcon) {
+  entitiesListModule.directive('entitiesSearchList', ["$timeout", 'Falcon', "$state", "$rootScope", function($timeout, Falcon, $state, $rootScope) {
     return {
       scope: {
         input: "=",
@@ -78,7 +86,7 @@
         }, true);
 
         scope.selectedRows = [];
-        scope.mirrorTag = "_falcon_mirroring_type";
+        scope.mirrorTag = "_falcon_extension_name";
 
         scope.checkedRow = function (name) {
           var isInArray = false;
@@ -159,6 +167,17 @@
               scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true };
             }
 
+            var selectedClusterRows = scope.selectedRows.filter(function(entity) {
+              return entity.type == 'cluster' || entity.type == 'CLUSTER';
+            });
+            if (selectedClusterRows && selectedClusterRows.length > 0) {
+              scope.selectedDisabledButtons = {
+                schedule:true,
+                suspend:true,
+                resume:true
+              };
+            }
+
             if(scope.selectedRows.length === 0) {
               scope.selectedDisabledButtons = {
                 schedule:true,
@@ -166,6 +185,7 @@
                 resume:true
               };
             }
+
           }, 50);
         };
 
@@ -209,16 +229,48 @@
         };
 
         scope.scopeEdit = function () {
-          scope.edit(scope.selectedRows[0].type, scope.selectedRows[0].name);
+          var selectedRow = scope.selectedRows[0];
+          if (selectedRow.type.toLowerCase() === 'cluster' && (!$rootScope.safeMode || !$rootScope.superUser)) {
+            return;
+          }
+          var state = 'forms.' + selectedRow.type.toLowerCase();
+          var selectedEntity = scope.input.filter(function(value){
+            return value.name === selectedRow.name;
+          });
+          if(selectedRow.type.toLowerCase() === 'process' && selectedEntity[0].tags
+            && scope.isMirror(selectedEntity[0].tags.tag)){
+            var mirrorType = scope.getMirrorType(selectedEntity[0].tags.tag);
+            if (mirrorType === 'hdfs-mirror' || mirrorType === 'hive-mirror') {
+              state = 'forms.dataset';
+            } else {
+              state = 'forms.snapshot';
+            }
+          }
+          $state.go(state, {'name' : selectedRow.name, 'action' : 'edit'});
         };
+
         scope.scopeClone = function () {
-          scope.clone(scope.selectedRows[0].type, scope.selectedRows[0].name);
+          var selectedRow = scope.selectedRows[0];
+          var state = 'forms.' + selectedRow.type.toLowerCase();
+          var selectedEntity = scope.input.filter(function(value){
+            return value.name === selectedRow.name;
+          });
+          if(selectedRow.type.toLowerCase() === 'process' && selectedEntity[0].tags
+            && scope.isMirror(selectedEntity[0].tags.tag)){
+            var mirrorType = scope.getMirrorType(selectedEntity[0].tags.tag);
+            if (mirrorType === 'hdfs-mirror' || mirrorType === 'hive-mirror') {
+              state = 'forms.dataset';
+            } else {
+              state = 'forms.snapshot';
+            }
+          }
+          $state.go(state, {'name' : selectedRow.name, 'action' : 'clone'});
         };
         scope.goEntityDefinition = function(name, type) {
           scope.entityDefinition(name, type);
         };
         scope.goEntityDetails = function(name, type) {
-          scope.entityDetails(name, type);
+          $state.go('entityDetails',{'name' : name, 'type' : type});
         };
 
         scope.scopeRemove = function () {
@@ -279,19 +331,31 @@
           return flag;
         };
 
+        scope.getMirrorType = function(tags) {
+          if (tags.indexOf('_falcon_extension_name=HDFS-MIRRORING') !== -1) {
+            return "hdfs-mirror";
+          } else if (tags.indexOf('_falcon_extension_name=HDFS-SNAPSHOT-MIRRORING') !== -1) {
+            return "snapshot";
+          } else if (tags.indexOf('_falcon_extension_name=HIVE-MIRRORING') !== -1) {
+            return "hive-mirror";
+          }
+        };
+
         scope.displayIcon = function (type, tags) {
           if(type === "FEED"){
             return "entypo download";
-          }else if(type === "PROCESS" && scope.isMirror(tags)){
+          } else if(type === "CLUSTER"){
+            return "entypo archive";
+          } else if(type === "PROCESS" && scope.isMirror(tags)){
             return "glyphicon glyphicon-duplicate";
-          }else{
+          } else{
             return "entypo cycle";
           }
         };
 
         scope.displayType = function (tag) {
           var tagKeyVal = tag.split("=");
-          if(tagKeyVal[0] === "_falcon_mirroring_type"){
+          if(tagKeyVal[0] === "_falcon_extension_name"){
             return tagKeyVal[1];
           }else{
             return "";
@@ -302,4 +366,4 @@
     };
   }]);
 
-})();
\ No newline at end of file
+})();
diff --git a/falcon-ui/app/js/directives/feed-cluster-partitions.js b/falcon-ui/app/js/directives/feed-cluster-partitions.js
new file mode 100644
index 0000000..8fadb90
--- /dev/null
+++ b/falcon-ui/app/js/directives/feed-cluster-partitions.js
@@ -0,0 +1,119 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+  'use strict';
+
+  var module = angular.module('app.directives.feed-cluster-partitions', []);
+
+  module.directive('feedFormClusterPartitions', function () {
+    return {
+      replace: false,
+      restrict: 'EA',
+      templateUrl: 'html/feed/feedFormClusterPartitionsTpl.html',
+      link: function ($scope, $element) {
+        function addFeedPartitionsIfNotExists(partitions, existingPartitions) {
+          var runningPartition;
+          for (var i=0;i<partitions.length;i++) {
+            runningPartition = partitions[i];
+            if (runningPartition.trim() != "") {
+              var matchedPartitions = existingPartitions.filter(function(element) {
+                return element.partitionName === runningPartition;
+              });
+              if (matchedPartitions.length < 1) {
+                existingPartitions.splice(i, 0, {"partitionName" : runningPartition,
+                  "partitionText" : "",
+                  "mapping" : "any"});
+              }
+            }
+          }
+        }
+
+        function removeClusterPartitionsIfNotExists(existingPartitions, partitions) {
+          var runningPartition;
+          var updatedExistingParititons = [];
+          for (var i=0;i<existingPartitions.length;i++) {
+            runningPartition = existingPartitions[i];
+            var matchedPartitions = partitions.filter(function(element) {
+              return element === runningPartition.partitionName;
+            });
+            if (matchedPartitions.length > 0) {
+              updatedExistingParititons.push(runningPartition);
+            }
+          }
+          return updatedExistingParititons;
+        }
+
+        function createDefaultClusterPartitions() {
+          var currentPartitions = ($scope.feedPartitions.trim() === "") ? [] : $scope.feedPartitions.split(",");
+          addFeedPartitionsIfNotExists(currentPartitions, $scope.partitionList);
+          $scope.partitionList = removeClusterPartitionsIfNotExists($scope.partitionList, currentPartitions);
+        }
+
+        function createSpecificClusterPartitions() {
+          var partitionExpressions = $scope.cluster.partition.split("/");
+          var currentPartitions = ($scope.feedPartitions.trim() === "") ? [] : $scope.feedPartitions.split(",");
+          partitionExpressions.forEach(function(partitionExpression, index) {
+            $scope.partitionList.push({"partitionName" : currentPartitions[index],
+              "partitionText" : (partitionExpression == "*") ? "" : partitionExpression,
+              "mapping" : (partitionExpression == "*") ? "any" : "mappedPartition"
+            });
+          });
+        }
+
+        $scope.preparePartitionExpression = function(partitionList) {
+          var partitionExpression = "";
+          for(var i=0;i<partitionList.length;i++) {
+            var partition = partitionList[i];
+            if (partition.mapping === 'any') {
+              partitionExpression = partitionExpression.concat("*");
+            } else if (partition.mapping === 'mappedPartition') {
+              partitionExpression = partitionExpression.concat(partition.partitionText);
+            }
+            if (i < partitionList.length-1) {
+              partitionExpression = partitionExpression.concat("/");
+            }
+          }
+          $scope.cluster.partition = partitionExpression;
+        }
+
+        $scope.partitionList = [];
+        if ($scope.cluster.partition != undefined) {
+          $scope.selectPartition = true;
+          createSpecificClusterPartitions()
+        } else {
+          $scope.selectPartition = false;
+          createDefaultClusterPartitions();
+        }
+
+        $scope.$watch('selectPartition', function() {
+          if ($scope.selectPartition) {
+            $scope.preparePartitionExpression($scope.partitionList);
+          } else {
+            delete $scope.cluster.partition;
+          }
+        });
+
+        $scope.$on('feed:createClusterPartitions', function() {
+          createDefaultClusterPartitions();
+          $scope.preparePartitionExpression($scope.partitionList);
+        });
+      }
+    };
+  });
+
+})();
diff --git a/falcon-ui/app/js/directives/instances-list.js b/falcon-ui/app/js/directives/instances-list.js
index 269c7c1..a984f53 100644
--- a/falcon-ui/app/js/directives/instances-list.js
+++ b/falcon-ui/app/js/directives/instances-list.js
@@ -20,8 +20,8 @@
 
 	var entitiesListModule = angular.module('app.directives.instances-list', ['app.services' ]);
 
-  entitiesListModule.controller('InstancesListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService',
-                                      function($scope, Falcon, X2jsService, $window, encodeService) {
+  entitiesListModule.controller('InstancesListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService', "DateHelper",
+                                      function($scope, Falcon, X2jsService, $window, encodeService, DateHelper) {
 
     //$scope.downloadEntity = function(logURL) {
     //  Falcon.logRequest();
@@ -51,7 +51,7 @@
     };
   });
 
-  entitiesListModule.directive('instancesList', ["$timeout", 'Falcon', '$filter', function($timeout, Falcon, $filter) {
+  entitiesListModule.directive('instancesList', ["$timeout", 'Falcon', '$filter', 'DateHelper', function($timeout, Falcon, $filter, DateHelper) {
     return {
       scope: {
         input: "=",
@@ -70,7 +70,7 @@
       controller: 'InstancesListCtrl',
       restrict: "EA",
       templateUrl: 'html/directives/instancesListDv.html',
-      link: function (scope) {
+      link: function (scope, element) {
         scope.server = Falcon;
         scope.$watch(function () { return scope.input; }, function() {
           scope.selectedRows = [];
@@ -86,6 +86,36 @@
         scope.endSortOrder = "desc";
         scope.statusSortOrder = "desc";
 
+        var dateFormat = DateHelper.getLocaleDateFormat().toLowerCase();
+        scope.dateFormat = DateHelper.getLocaleDateFormat() + ' HH:mm';
+        var dateSeperator;
+        if(dateFormat.indexOf('.') >=0){
+          dateSeperator = '.';
+        }else if (dateFormat.indexOf('-') >=0) {
+          dateSeperator='-'
+        }else {
+          dateSeperator = '/';
+        }
+
+        var splitDate = dateFormat.split(dateSeperator);
+        var mask ='';
+        splitDate.forEach(function(value, index){
+          if(value.indexOf('d')>=0){
+            mask = mask + dateSeperator +'00'
+          }else if (value.indexOf('m')>=0) {
+            mask =  mask + dateSeperator +'00'
+          }else if (value.indexOf('y')>=0) {
+            if(value.length > 2){
+              mask =  mask + dateSeperator +'0000'
+            }else{
+              mask =  mask + dateSeperator +'00'
+            }
+          }
+        });
+        mask = mask + ' 00:00';
+        console.log(mask);
+        element.find('.dateInput').mask(mask.substr(1));
+
         scope.checkedRow = function (name) {
           var isInArray = false;
           scope.selectedRows.forEach(function(item) {
@@ -201,6 +231,16 @@
           }, 50);
         };
 
+        var CountDown = function(countParam){
+		this.count=countParam;
+		this.down=function(){
+			this.count--;
+		}
+		this.isDone=function(){
+			return this.count<1;
+		}
+        };
+
         var isSelected = function(item){
           var selected = false;
           scope.selectedRows.forEach(function(entity) {
@@ -230,107 +270,119 @@
           scope.instanceDetails(instance);
         };
 
-        var resumeInstance = function (type, name, start, end, refresh) {
+        var resumeInstance = function (type, name, start, end, countDown) {
           Falcon.logRequest();
           Falcon.postResumeInstance(type, name, start, end)
             .success(function (message) {
+              countDown.down();
               Falcon.logResponse('success', message, type);
-              if(refresh){
+              if(countDown.isDone()){
                 scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
               }
             })
             .error(function (err) {
+              countDown.down();
               Falcon.logResponse('error', err, type);
 
             });
         };
 
-        var suspendInstance = function (type, name, start, end, refresh) {
+        var suspendInstance = function (type, name, start, end, countDown) {
           Falcon.logRequest();
           Falcon.postSuspendInstance(type, name, start, end)
             .success(function (message) {
+              countDown.down();
               Falcon.logResponse('success', message, type);
-              if(refresh){
+              if(countDown.isDone()){
                 scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
               }
             })
             .error(function (err) {
+              countDown.down();
               Falcon.logResponse('error', err, type);
 
             });
         };
 
-        var reRunInstance = function (type, name, start, end, refresh) {
+        var reRunInstance = function (type, name, start, end, countDown) {
           Falcon.logRequest();
           Falcon.postReRunInstance(type, name, start, end)
             .success(function (message) {
-              Falcon.logResponse('success', message, type);
-              if(refresh){
-                scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
+              countDown.down();
+              if(countDown.isDone()){
+                $timeout(function () {
+                  Falcon.logResponse('success', message, type);
+                  scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
+                }, 10000);
+              } else {
+                Falcon.logResponse('success', message, type);
               }
             })
             .error(function (err) {
+              countDown.down();
               Falcon.logResponse('error', err, type);
 
             });
         };
 
-        var killInstance = function (type, name, start, end, refresh) {
+        var killInstance = function (type, name, start, end, countDown) {
           Falcon.logRequest();
           Falcon.postKillInstance(type, name, start, end)
             .success(function (message) {
+              countDown.down();
               Falcon.logResponse('success', message, type);
-              if(refresh){
+              if(countDown.isDone()){
                 scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
               }
             })
             .error(function (err) {
+              countDown.down();
               Falcon.logResponse('error', err, type);
 
             });
         };
 
         scope.scopeResume = function () {
+          var countDown=new CountDown(scope.selectedRows.length);
           for(var i = 0; i < scope.selectedRows.length; i++) {
             var multiRequestType = scope.selectedRows[i].type.toLowerCase();
             Falcon.responses.multiRequest[multiRequestType] += 1;
             var start = scope.selectedRows[i].instance;
             var end = addOneMin(start);
-            var refresh = i === scope.selectedRows.length-1 ? true : false;
-            resumeInstance(scope.type, scope.name, start, end, refresh);
+            resumeInstance(scope.type, scope.name, start, end, countDown);
           }
         };
 
         scope.scopeSuspend = function () {
+          var countDown=new CountDown(scope.selectedRows.length);
           for(var i = 0; i < scope.selectedRows.length; i++) {
             var multiRequestType = scope.selectedRows[i].type.toLowerCase();
             Falcon.responses.multiRequest[multiRequestType] += 1;
             var start = scope.selectedRows[i].instance;
             var end = addOneMin(start);
-            var refresh = i === scope.selectedRows.length-1 ? true : false;
-            suspendInstance(scope.type, scope.name, start, end, refresh);
+            suspendInstance(scope.type, scope.name, start, end, countDown);
           }
         };
 
         scope.scopeRerun = function () {
+          var countDown=new CountDown(scope.selectedRows.length);
           for(var i = 0; i < scope.selectedRows.length; i++) {
             var multiRequestType = scope.selectedRows[i].type.toLowerCase();
             Falcon.responses.multiRequest[multiRequestType] += 1;
             var start = scope.selectedRows[i].instance;
             var end = addOneMin(start);
-            var refresh = i === scope.selectedRows.length-1 ? true : false;
-            reRunInstance(scope.type, scope.name, start, end, refresh);
+            reRunInstance(scope.type, scope.name, start, end, countDown);
           }
         };
 
         scope.scopeKill = function () {
+          var countDown=new CountDown(scope.selectedRows.length);
           for(var i = 0; i < scope.selectedRows.length; i++) {
             var multiRequestType = scope.selectedRows[i].type.toLowerCase();
             Falcon.responses.multiRequest[multiRequestType] += 1;
             var start = scope.selectedRows[i].instance;
             var end = addOneMin(start);
-            var refresh = i === scope.selectedRows.length-1 ? true : false;
-            killInstance(scope.type, scope.name, start, end, refresh);
+            killInstance(scope.type, scope.name, start, end, countDown);
           }
         };
 
@@ -355,319 +407,135 @@
           scope.changePagesSet(offset, page, visiblePages-1, scope.start, scope.end);
         };
 
+        scope.startDateValid = true;
+        scope.endDateValid = true;
+
         scope.validateDate = function(event, type){
           var which = event.which || event.keyCode;
           var charStr = String.fromCharCode(which);
-          event.preventDefault();
-          if (
-            which == 8 || which == 46 || which == 37 || which == 39 ||
-            (which >= 48 && which <= 57)
-          ) {
-            if(type == "start"){
-              if(scope.startFilter){
-                if(scope.startFilter.length == 1){
-                  //mm
-                  var prevChar = scope.startFilter.substring(scope.startFilter.length-1);
-                  prevChar = parseInt(prevChar);
-                  if(prevChar < 1){
-                    if(prevChar == 0 && charStr == 0){
+          var valueEntered = event.target.value + charStr;
+          var dateSeperator;
+          if(dateFormat.indexOf('.') >=0){
+            dateSeperator = '.';
+          }else if (dateFormat.indexOf('-') >=0) {
+            dateSeperator='-'
+          }else {
+            dateSeperator = '/';
+          }
 
-                    }else if(charStr <= 9){
-                      scope.startFilter += charStr + "/";
-                    }
-                  }else{
-                    if(charStr <= 2){
-                      scope.startFilter += charStr + "/";
-                    }
-                  }
-                }else if(scope.startFilter.length == 2){
-                  //mm/
-                  if(charStr <= 3){
-                    scope.startFilter += "/" + charStr;
-                  }
-                }else if(scope.startFilter.length == 3){
-                  //mm/d
-                  if(charStr <= 3){
-                    scope.startFilter += charStr;
-                  }
-                }else if(scope.startFilter.length == 4){
-                  //mm/dd
-                  var prevChar = scope.startFilter.substring(scope.startFilter.length-1);
-                  prevChar = parseInt(prevChar);
-                  if(prevChar < 3){
-                    if(prevChar == 0 && charStr == 0){
+          var splitDateFormat = dateFormat.split(dateSeperator);
+          var dateArr = [];
 
-                    }else if(charStr <= 9){
-                      scope.startFilter += charStr + "/";
-                    }
-                  }else{
-                    if(charStr <= 1){
-                      scope.startFilter += charStr + "/";
-                    }
-                  }
-                }else if(scope.startFilter.length == 5){
-                  //mm/dd/
-                  if(charStr <= 2){
-                    scope.startFilter += "/" + charStr;
-                  }
-                }else if(scope.startFilter.length == 6){
-                  //mm/dd/y
-                  if(charStr <= 2){
-                    scope.startFilter += charStr;
-                  }
-                }else if(scope.startFilter.length == 7){
-                  //mm/dd/yy
-                  if(charStr <= 9){
-                    scope.startFilter += charStr;
-                  }
-                }else if(scope.startFilter.length == 8){
-                  //mm/dd/yyy
-                  if(charStr <= 9){
-                    scope.startFilter += charStr;
-                  }
-                }else if(scope.startFilter.length == 9){
-                  //mm/dd/yyyy
-                  if(charStr <= 9){
-                    scope.startFilter += charStr + " ";
-                  }
-                }else if(scope.startFilter.length == 10){
-                  //mm/dd/yyyy
-                  if(charStr <= 2){
-                    scope.startFilter += " " + charStr;
-                  }
-                }else if(scope.startFilter.length == 11){
-                  //mm/dd/yyyy h
-                  if(charStr <= 2){
-                    scope.startFilter += charStr;
-                  }
-                }else if(scope.startFilter.length == 12){
-                  //mm/dd/yyyy hh
-                  var prevChar = scope.startFilter.substring(scope.startFilter.length-1);
-                  prevChar = parseInt(prevChar);
-                  if(prevChar < 2){
-                    if(charStr <= 9){
-                      scope.startFilter += charStr + ":";
-                    }
-                  }else{
-                    if(charStr <= 4){
-                      scope.startFilter += charStr + ":";
-                    }
-                  }
-                }else if(scope.startFilter.length == 13){
-                  //mm/dd/yyyy hh:
-                  if(charStr <= 5){
-                    scope.startFilter += ":" + charStr;
-                  }
-                }else if(scope.startFilter.length == 14){
-                  //mm/dd/yyyy hh:m
-                  if(charStr <= 5){
-                    scope.startFilter += charStr;
-                  }
-                }else if(scope.startFilter.length == 15){
-                  //mm/dd/yyyy hh:mm
-                  if(charStr <= 9){
-                    scope.startFilter += charStr;
-                    scope.startFilterError = false;
-                  }
-                }
-              }else{
-                //m
-                if(charStr <= 1){
-                  scope.startFilter = charStr;
-                }
-              }
-            }else{
-              if(scope.endFilter){
-                if(scope.endFilter.length == 1){
-                  //mm
-                  var prevChar = scope.endFilter.substring(scope.endFilter.length-1);
-                  prevChar = parseInt(prevChar);
-                  if(prevChar < 1){
-                    if(prevChar == 0 && charStr == 0){
-
-                    }else if(charStr <= 9){
-                      scope.endFilter += charStr + "/";
-                    }
-                  }else{
-                    if(charStr <= 2){
-                      scope.endFilter += charStr + "/";
-                    }
-                  }
-                }else if(scope.endFilter.length == 2){
-                  //mm/
-                  if(charStr <= 3){
-                    scope.endFilter += "/" + charStr;
-                  }
-                }else if(scope.endFilter.length == 3){
-                  //mm/d
-                  if(charStr <= 3){
-                    scope.endFilter += charStr;
-                  }
-                }else if(scope.endFilter.length == 4){
-                  //mm/dd
-                  var prevChar = scope.endFilter.substring(scope.endFilter.length-1);
-                  prevChar = parseInt(prevChar);
-                  if(prevChar < 3){
-                    if(prevChar == 0 && charStr == 0){
-
-                    }else if(charStr <= 9){
-                      scope.endFilter += charStr + "/";
-                    }
-                  }else{
-                    if(charStr <= 1){
-                      scope.endFilter += charStr + "/";
-                    }
-                  }
-                }else if(scope.endFilter.length == 5){
-                  //mm/dd/
-                  if(charStr <= 2){
-                    scope.endFilter += "/" + charStr;
-                  }
-                }else if(scope.endFilter.length == 6){
-                  //mm/dd/y
-                  if(charStr <= 2){
-                    scope.endFilter += charStr;
-                  }
-                }else if(scope.endFilter.length == 7){
-                  //mm/dd/yy
-                  if(charStr <= 9){
-                    scope.endFilter += charStr;
-                  }
-                }else if(scope.endFilter.length == 8){
-                  //mm/dd/yyy
-                  if(charStr <= 9){
-                    scope.endFilter += charStr;
-                  }
-                }else if(scope.endFilter.length == 9){
-                  //mm/dd/yyyy
-                  if(charStr <= 9){
-                    scope.endFilter += charStr + " ";
-                  }
-                }else if(scope.endFilter.length == 10){
-                  //mm/dd/yyyy
-                  if(charStr <= 2){
-                    scope.endFilter += " " + charStr;
-                  }
-                }else if(scope.endFilter.length == 11){
-                  //mm/dd/yyyy h
-                  if(charStr <= 2){
-                    scope.endFilter += charStr;
-                  }
-                }else if(scope.endFilter.length == 12){
-                  //mm/dd/yyyy hh
-                  var prevChar = scope.endFilter.substring(scope.endFilter.length-1);
-                  prevChar = parseInt(prevChar);
-                  if(prevChar < 2){
-                    if(charStr <= 9){
-                      scope.endFilter += charStr + ":";
-                    }
-                  }else{
-                    if(charStr <= 4){
-                      scope.endFilter += charStr + ":";
-                    }
-                  }
-                }else if(scope.endFilter.length == 13){
-                  //mm/dd/yyyy hh:
-                  if(charStr <= 5){
-                    scope.endFilter += ":" + charStr;
-                  }
-                }else if(scope.endFilter.length == 14){
-                  //mm/dd/yyyy hh:m
-                  if(charStr <= 5){
-                    scope.endFilter += charStr;
-                  }
-                }else if(scope.endFilter.length == 15){
-                  //mm/dd/yyyy hh:mm
-                  if(charStr <= 9){
-                    scope.endFilter += charStr;
-                    scope.endFilterError = false;
-                  }
-                }
-              }else{
-                //m
-                if(charStr <= 1){
-                  scope.endFilter = charStr;
-                }
-              }
+          var completeDate = valueEntered.split(" ");
+          var dates = completeDate[0].split(dateSeperator);
+          var timeArr = [];
+          if(completeDate[1]){
+            completeDate[1].split(":")
+          }
+          splitDateFormat.forEach(function(value, index){
+            if(value.indexOf('d')>=0){
+              dateArr[0] = dates[index];
+            }else if (value.indexOf('m')>=0) {
+              dateArr[1] = dates[index];
+            }else if (value.indexOf('y')>=0) {
+              dateArr[2] = dates[index];
             }
+          });
+          var dateValid = checkDateTimeValidity(dateArr, timeArr);
+          if(type === 'start'){
+            scope.startDateValid = dateValid;
+          }else if(type === 'end'){
+            scope.endDateValid = dateValid;
           }
         };
 
+        var checkDateTimeValidity = function(dateArr, timeArr){
+          var dateValid = false;
+         if(dateArr[2]){
+           if(parseInt(dateArr[2]) > 0 && parseInt(dateArr[2]) <= 9999){
+             dateValid = true;
+           }else {
+             return false;
+           }
+         }
+         if(dateArr[1]){
+           if(parseInt(dateArr[1]) > 0 && parseInt(dateArr[1]) <= 12){
+             dateValid = true;
+           }else {
+             return false;
+           }
+         }
+         if(dateArr[0]) {
+           if(parseInt(dateArr[0]) > 0 && parseInt(dateArr[0]) <= daysInMonth(dateArr[1], dateArr[2])){
+             dateValid = true;
+           }else {
+             return false;
+           }
+         }
+         if(timeArr[0]){
+           if(parseInt(timeArr[0]) >= 0 && parseInt(timeArr[0]) < 24){
+             dateValid = true;
+           }else {
+             return false;
+           }
+         }
+         if(timeArr[1]){
+           if(parseInt(timeArr[1]) >= 0 && parseInt(timeArr[1] < 60)){
+             dateValid = true;
+           }else {
+             return false;
+           }
+         }
+         return dateValid;
+        }
+
         var changeDateFormat = function(date){
+
+          var dateSeperator;
+          if(dateFormat.indexOf('.') >=0){
+            dateSeperator = '.';
+          }else if (dateFormat.indexOf('-') >=0) {
+            dateSeperator='-'
+          }else {
+            dateSeperator = '/';
+          }
+
+          var splitDateFormat = dateFormat.split(dateSeperator);
+          var dateArr = [];
+
           var completeDate = date.split(" ");
-          var dates = completeDate[0].split("/");
-          date = dates[2] + "-" + dates[0] + "-" + dates[1] + "T" + completeDate[1] + "Z";
+          var dates = completeDate[0].split(dateSeperator);
+
+          splitDateFormat.forEach(function(value, index){
+            if(value.indexOf('d')>=0){
+              dateArr[0] = dates[index];
+            }else if (value.indexOf('m')>=0) {
+              dateArr[1] = dates[index];
+            }else if (value.indexOf('y')>=0) {
+              dateArr[2] = dates[index];
+            }
+          });
+
+          date = dateArr[2] + "-" + dateArr[1] + "-" + dateArr[0] + "T" + completeDate[1] + "Z";
           return date;
         };
 
         var validateDateFormat = function(date){
-          var char = date.substring(0, 1);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(1, 2);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(2, 3);
-          if(char != "/"){
-            return false;
-          }
-          char = date.substring(3, 4);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(4, 5);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(5, 6);
-          if(char != "/"){
-            return false;
-          }
-          char = date.substring(6, 7);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(7, 8);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(8, 9);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(9, 10);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(10, 11);
-          if(char != " "){
-            return false;
-          }
-          char = date.substring(11, 12);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(12, 13);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(13, 14);
-          if(char != ":"){
-            return false;
-          }
-          char = date.substring(14, 15);
-          if(isNaN(char)){
-            return false;
-          }
-          char = date.substring(15, 16);
-          if(isNaN(char)){
-            return false;
-          }
-          return true;
+          var date = new Date(changeDateFormat(date));
+          return !isNaN(date.getTime());
         };
 
+        function daysInMonth(month, year) {
+          switch (month) {
+            case 2 :
+              return (year % 4 == 0 && year % 100) || year % 400 == 0 ? 29 : 28;
+            case 9 : case 4 : case 6 : case 11 :
+              return 30;
+            default :
+              return 31
+    }
+}
+
         scope.filterInstances = function(orderBy){
           var start;
           var end;
@@ -686,9 +554,11 @@
               if(!validateDateFormat(scope.startFilter)){
                 executeFilter = false;
                 scope.startFilterError = true;
+                scope.startDateValid = false;
               }else if(!validateDateFormat(scope.endFilter)){
                 executeFilter = false;
                 scope.endFilterError = true;
+                scope.endDateValid = false;
               }else{
                 start = changeDateFormat(scope.startFilter);
                 var filterStartDate = new Date(start);
diff --git a/falcon-ui/app/js/directives/interface-endpoint.js b/falcon-ui/app/js/directives/interface-endpoint.js
new file mode 100644
index 0000000..1e3cef9
--- /dev/null
+++ b/falcon-ui/app/js/directives/interface-endpoint.js
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+  'use strict';
+
+  var interfaceEndpointModule = angular.module('app.directives.interface-endpoint', []);
+
+  interfaceEndpointModule.directive('interfaceEndpoint', [ "$timeout", function ($timeout) {
+    return {
+      require: 'ngModel',
+
+      link: function($scope, $element, $attrs, ngModelCtrl) {
+        function applyDefaultStyle() {
+          $element.removeClass('endpointChanged');
+          $element.addClass('endpointDefault');
+        }
+
+        function applyModifiedStyle() {
+          $element.removeClass('endpointDefault');
+          $element.addClass('endpointChanged');
+        }
+
+        $scope.$watch(function(){
+          return $scope.clusterForm.$submitted;
+        },function(){
+          if(!$element.attr('disabled') && ngModelCtrl.$pristine){
+            $element.parent().find('.validationMessageGral').show();
+            ngModelCtrl.$setValidity('pattern', false);
+          }else if(ngModelCtrl.$dirty && ngModelCtrl.$error.pattern && !$element.attr('disabled')){
+            $element.parent().find('.validationMessageGral').show();
+            ngModelCtrl.$setValidity('pattern', false);
+          }else if($element.attr('disabled')){
+            $element.parent().find('.validationMessageGral').hide();
+            ngModelCtrl.$setValidity('pattern', true);
+          }
+        });
+
+        $scope.$watch(function(){
+          if(!$scope.clusterForm.$submitted && ngModelCtrl.$pristine){
+            $element.parent().find('.validationMessageGral').hide();
+            ngModelCtrl.$setValidity('pattern', true);
+          }else if(ngModelCtrl.$dirty && ngModelCtrl.$error.pattern){
+            $element.parent().find('.validationMessageGral').show();
+            ngModelCtrl.$setValidity('pattern', false);
+          }
+          return $element[0].value;
+        },function(newValue, oldValue){
+          if(newValue){
+            if(newValue === oldValue && newValue.indexOf('<hostname>') >= 0){
+              applyDefaultStyle();
+            }else{
+              applyModifiedStyle();
+            }
+          }
+        });
+
+        $element.focus(function(){
+          applyModifiedStyle();
+        });
+
+        $element.bind('blur',function(){
+          if(ngModelCtrl.$pristine && $element[0].value.indexOf('<hostname>') >= 0){
+            applyDefaultStyle();
+          }
+        });
+      }
+    }
+  }]);
+
+}());
diff --git a/falcon-ui/app/js/directives/lineage-graph.js b/falcon-ui/app/js/directives/lineage-graph.js
index 883d2a7..aeb014d 100644
--- a/falcon-ui/app/js/directives/lineage-graph.js
+++ b/falcon-ui/app/js/directives/lineage-graph.js
@@ -240,7 +240,7 @@
                 .attr('markerWidth', 8)
                 .attr('markerHeight', 5)
                 .attr('orient', 'auto')
-                .attr('style', 'fill: #ccc')
+                //.attr('style', 'fill: #ccc')
                 .append('svg:path')
                 .attr('d', 'M 0 0 L 10 5 L 0 10 z');
           }
@@ -248,7 +248,7 @@
           var bb = layout.graph();
           $('#lineage-graph').attr('width', bb.width);
           //$('#lineage-graph').attr('width', '100%');
-          $('#lineage-graph').attr('height', bb.height);
+         //$('#lineage-graph').attr('height', bb.height);
           post_render();
         }
 
diff --git a/falcon-ui/app/js/directives/ng-tags-input.js b/falcon-ui/app/js/directives/ng-tags-input.js
index 1039011..aa0d4d5 100644
--- a/falcon-ui/app/js/directives/ng-tags-input.js
+++ b/falcon-ui/app/js/directives/ng-tags-input.js
@@ -859,7 +859,7 @@
             span.css('display', 'none');
           }
 
-          element.css('width', width ? width + threshold + 'px' : '');
+          //element.css('width', width ? width + threshold + 'px' : '');
 
           return originalValue;
         };
@@ -1145,4 +1145,4 @@
     );
   }]);
 
-}());
\ No newline at end of file
+}());
diff --git a/falcon-ui/app/js/directives/server-messages.js b/falcon-ui/app/js/directives/server-messages.js
index 6bd6ea9..475f279 100644
--- a/falcon-ui/app/js/directives/server-messages.js
+++ b/falcon-ui/app/js/directives/server-messages.js
@@ -19,18 +19,53 @@
   'use strict';
 
 	var serverMessagesModule = angular.module('app.directives.server-messages', []);
-	
-	serverMessagesModule.directive('serverMessages', function () {
+
+	serverMessagesModule.directive('serverMessages', ["$rootScope", "$timeout","Falcon", function ($rootScope, $timeout, Falcon) {
 		return {
 			replace:false,
 			restrict: 'E',
 			templateUrl: 'html/directives/serverMessagesDv.html',
       link: function (scope, element) {
-
+        scope.close = function(){
+          Falcon.hideNotifs();
+        };
         //scope.allMessages
+        var hideoutTimer;
+        var notifyPanel = element.find(".notifs");
+        $rootScope.$on('hideNotifications', function(event, setting) {
+          scope.showClose = false;
+          $timeout.cancel(hideoutTimer);
+          if (setting && setting.delay) {
+            hideoutTimer = $timeout(function () {
+              notifyPanel.fadeOut(300);
+            }, setting.delay==='slow'?5000:0);
+          } else {
+            notifyPanel.stop();
+            notifyPanel.fadeOut(300);
+          }
+        });
+
+        $rootScope.$on('flashNotifications', function() {
+          $timeout.cancel(hideoutTimer);
+          notifyPanel.stop();
+          notifyPanel.hide();
+          notifyPanel.fadeIn(300);
+          notifyPanel.fadeOut(300);
+          notifyPanel.fadeIn(300);
+          notifyPanel.fadeOut(300);
+          notifyPanel.fadeIn(300);
+        });
+
+        $rootScope.$on('showNotifications', function() {
+          scope.showClose = true;
+          $timeout.cancel(hideoutTimer);
+          notifyPanel.stop();
+          notifyPanel.hide();
+          notifyPanel.fadeIn(300);
+        });
 
       }
 		};
-	});
-	  
+	}]);
+
 })();
\ No newline at end of file
diff --git a/falcon-ui/app/js/directives/tooltip.js b/falcon-ui/app/js/directives/tooltip.js
index 31bb684..4951123 100644
--- a/falcon-ui/app/js/directives/tooltip.js
+++ b/falcon-ui/app/js/directives/tooltip.js
@@ -34,4 +34,26 @@
     };
   });
 
-})();
\ No newline at end of file
+  module.directive("tooltip", ['TooltipMessages', function(TooltipMessages){
+    return {
+      restrict: "A",
+      link: function(scope, element, attrs) {
+        var message = TooltipMessages.messages[attrs.tooltip];
+        if (!message) {
+          console.warn('Message not defined for key ' + attrs.tooltip);
+          return;
+        }
+        var tooltipElement = angular.element("<div class='entities-tooltip-theme'>");
+        tooltipElement.append("<div class='arrow-up'></div>");
+        tooltipElement.append("<div class='entities-tooltip'>" + message + "</div>");
+        element.append(tooltipElement);
+        element.on('mouseenter', function(){
+             tooltipElement.show();
+           }).on('mouseleave', function(){
+             tooltipElement.hide();
+           });
+      }
+    };
+  }]);
+
+})();
diff --git a/falcon-ui/app/js/directives/validation-message.js b/falcon-ui/app/js/directives/validation-message.js
index 7530244..7eab75e 100644
--- a/falcon-ui/app/js/directives/validation-message.js
+++ b/falcon-ui/app/js/directives/validation-message.js
@@ -34,8 +34,9 @@
       scope: {
         validationMessage: "@"
       },
+      require : '^form',
       restrict: 'A',
-      link: function (scope, element) {
+      link: function (scope, element, attrs, formCtrl) {
 
         var lastOne = 0,
           stringLabel,
@@ -89,21 +90,28 @@
 
           if (element[0].type === "select-one") {
             element.bind('change', function () {
-              scope.messageSwitcher.show = false;
-              angular.element(stringLabel).hide();
+                  scope.messageSwitcher.show = false;
+                  angular.element(stringLabel).hide();
             });
           } else {
             element.bind('keyup', checkNameInList);
             element.bind('blur', function () {
-              if (element[0].value.length === 0) {
-                element.parent().addClass("showMessage showValidationStyle validationMessageParent");
-                scope.messageSwitcher.show = true;
-                angular.element(stringLabel).html(messageObject.empty).removeClass('valid');
-              }
+                if (element[0].value.length === 0) {
+                  element.parent().addClass("showMessage showValidationStyle validationMessageParent");
+                  scope.messageSwitcher.show = true;
+                  angular.element(stringLabel).html(messageObject.empty).removeClass('valid');
+                }else if (element.hasClass('ng-invalid-pattern')) {
+                  scope.messageSwitcher.show = true;
+                  angular.element(stringLabel).html(messageObject.patternInvalid).removeClass('valid');
+                  element.removeClass('empty');
+                  element.parent().addClass("showMessage showValidationStyle validationMessageParent");
+                }
             });
             element.bind('focus', function () {
               element.removeClass('empty');
             });
+
+
           }
         }
         function normalize() {
@@ -137,6 +145,17 @@
             element.addClass('empty');
           }
         });
+
+        scope.$watch(function () {
+          return formCtrl.$submitted;
+        }, function () {
+          if (formCtrl.$submitted === true && element.hasClass('ng-invalid-pattern')) {
+            scope.messageSwitcher.show = true;
+            angular.element(stringLabel).html(messageObject.patternInvalid).removeClass('valid');
+            element.removeClass('empty');
+            element.parent().addClass("showMessage showValidationStyle validationMessageParent");
+          }
+        });
       }
     };
   }]);
@@ -208,10 +227,10 @@
 
           element.bind('keyup', prepare);
           element.bind('blur', function () {
-            if (valLength === 0 && required) {
-              element.removeClass('empty');
-              angular.element(stringLabel).html(messageObject.empty).removeClass('hidden');
-              element.parent().addClass("showMessage showValidationStyle validationMessageParent");
+              if (valLength === 0 && required) {
+                element.removeClass('empty');
+                angular.element(stringLabel).html(messageObject.empty).removeClass('hidden');
+                element.parent().addClass("showMessage showValidationStyle validationMessageParent");
             }
           });
         }
@@ -246,4 +265,4 @@
     };
   }]);
 
-}());
\ No newline at end of file
+}());
diff --git a/falcon-ui/app/js/lib/angular-ngStorage.js b/falcon-ui/app/js/lib/angular-ngStorage.js
new file mode 100644
index 0000000..ee45bb2
--- /dev/null
+++ b/falcon-ui/app/js/lib/angular-ngStorage.js
@@ -0,0 +1,161 @@
+(function (root, factory) {
+  'use strict';
+
+  if (typeof define === 'function' && define.amd) {
+    define(['angular'], factory);
+  } else if (typeof exports === 'object') {
+    module.exports = factory(require('angular'));
+  } else {
+    // Browser globals (root is window), we don't register it.
+    factory(root.angular);
+  }
+}(this , function (angular) {
+    'use strict';
+
+    /**
+     * @ngdoc overview
+     * @name ngStorage
+     */
+
+    return angular.module('ngStorage', [])
+
+    /**
+     * @ngdoc object
+     * @name ngStorage.$localStorage
+     * @requires $rootScope
+     * @requires $window
+     */
+
+    .factory('$localStorage', _storageFactory('localStorage'))
+
+    /**
+     * @ngdoc object
+     * @name ngStorage.$sessionStorage
+     * @requires $rootScope
+     * @requires $window
+     */
+
+    .factory('$sessionStorage', _storageFactory('sessionStorage'));
+
+    function _storageFactory(storageType) {
+        return [
+            '$rootScope',
+            '$window',
+            '$log',
+            '$timeout',
+
+            function(
+                $rootScope,
+                $window,
+                $log,
+                $timeout
+            ){
+                function isStorageSupported(storageType) {
+
+                    // Some installations of IE, for an unknown reason, throw "SCRIPT5: Error: Access is denied"
+                    // when accessing window.localStorage. This happens before you try to do anything with it. Catch
+                    // that error and allow execution to continue.
+
+                    // fix 'SecurityError: DOM Exception 18' exception in Desktop Safari, Mobile Safari
+                    // when "Block cookies": "Always block" is turned on
+                    var supported;
+                    try {
+                        supported = $window[storageType];
+                    }
+                    catch (err) {
+                        supported = false;
+                    }
+
+                    // When Safari (OS X or iOS) is in private browsing mode, it appears as though localStorage
+                    // is available, but trying to call .setItem throws an exception below:
+                    // "QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage that exceeded the quota."
+                    if (supported && storageType === 'localStorage') {
+                        var key = '__' + Math.round(Math.random() * 1e7);
+
+                        try {
+                            localStorage.setItem(key, key);
+                            localStorage.removeItem(key);
+                        }
+                        catch (err) {
+                            supported = false;
+                        }
+                    }
+
+                    return supported;
+                }
+
+                // #9: Assign a placeholder object if Web Storage is unavailable to prevent breaking the entire AngularJS app
+                var webStorage = isStorageSupported(storageType) || ($log.warn('This browser does not support Web Storage!'), {setItem: function() {}, getItem: function() {}}),
+                    $storage = {
+                        $default: function(items) {
+                            for (var k in items) {
+                                angular.isDefined($storage[k]) || ($storage[k] = items[k]);
+                            }
+
+                            return $storage;
+                        },
+                        $reset: function(items) {
+                            for (var k in $storage) {
+                                '$' === k[0] || (delete $storage[k] && webStorage.removeItem('ngStorage-' + k));
+                            }
+
+                            return $storage.$default(items);
+                        }
+                    },
+                    _last$storage,
+                    _debounce;
+
+                try {
+                    webStorage = $window[storageType];
+                    webStorage.length;
+                } catch(e) {
+                    $log.warn('This browser does not support Web Storage!');
+                    webStorage = {};
+                }
+
+                for (var i = 0, l = webStorage.length, k; i < l; i++) {
+                    // #8, #10: `webStorage.key(i)` may be an empty string (or throw an exception in IE9 if `webStorage` is empty)
+                    (k = webStorage.key(i)) && 'ngStorage-' === k.slice(0, 10) && ($storage[k.slice(10)] = angular.fromJson(webStorage.getItem(k)));
+                }
+
+                _last$storage = angular.copy($storage);
+
+                $rootScope.$watch(function() {
+                    var temp$storage;
+                    _debounce || (_debounce = $timeout(function() {
+                        _debounce = null;
+
+                        if (!angular.equals($storage, _last$storage)) {
+                            temp$storage = angular.copy(_last$storage);
+                            angular.forEach($storage, function(v, k) {
+                                angular.isDefined(v) && '$' !== k[0] && webStorage.setItem('ngStorage-' + k, angular.toJson(v));
+
+                                delete temp$storage[k];
+                            });
+
+                            for (var k in temp$storage) {
+                                webStorage.removeItem('ngStorage-' + k);
+                            }
+
+                            _last$storage = angular.copy($storage);
+                        }
+                    }, 100, false));
+                });
+
+                // #6: Use `$window.addEventListener` instead of `angular.element` to avoid the jQuery-specific `event.originalEvent`
+                $window.addEventListener && $window.addEventListener('storage', function(event) {
+                    if ('ngStorage-' === event.key.slice(0, 10)) {
+                        event.newValue ? $storage[event.key.slice(10)] = angular.fromJson(event.newValue) : delete $storage[event.key.slice(10)];
+
+                        _last$storage = angular.copy($storage);
+
+                        $rootScope.$apply();
+                    }
+                });
+
+                return $storage;
+            }
+        ];
+    }
+
+}));
diff --git a/falcon-ui/app/js/lib/focusIf.min.js b/falcon-ui/app/js/lib/focusIf.min.js
new file mode 100644
index 0000000..b8206ac
--- /dev/null
+++ b/falcon-ui/app/js/lib/focusIf.min.js
@@ -0,0 +1 @@
+!function(){"use strict";function c(c){function u(u,f,t){function n(f){f&&c(function(){i.focus()},u.$eval(t.focusDelay)||0)}var i=f[0];t.focusIf?u.$watch(t.focusIf,n):n(!0)}return{restrict:"A",link:u}}angular.module("focus-if",[]).directive("focusIf",c),c.$inject=["$timeout"]}();
\ No newline at end of file
diff --git a/falcon-ui/app/js/lib/jquery-ui.min.js b/falcon-ui/app/js/lib/jquery-ui.min.js
new file mode 100644
index 0000000..0245f83
--- /dev/null
+++ b/falcon-ui/app/js/lib/jquery-ui.min.js
@@ -0,0 +1,13 @@
+/*! jQuery UI - v1.11.4 - 2015-03-11
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
+* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget);
+i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);
+return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)
+},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;
+if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};
+f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));
+return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels;
+this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})});
diff --git a/falcon-ui/app/js/lib/jquery.mask.min.js b/falcon-ui/app/js/lib/jquery.mask.min.js
new file mode 100644
index 0000000..984b5b0
--- /dev/null
+++ b/falcon-ui/app/js/lib/jquery.mask.min.js
@@ -0,0 +1,12 @@
+// jQuery Mask Plugin v1.7.7
+// github.com/igorescobar/jQuery-Mask-Plugin
+(function(f){"function"===typeof define&&define.amd?define(["jquery"],f):f(window.jQuery||window.Zepto)})(function(f){var A=function(a,d,b){var h=this,m,p;a=f(a);d="function"===typeof d?d(a.val(),void 0,a,b):d;var c={getCaret:function(){try{var e,l=0,c=a.get(0),g=document.selection,d=c.selectionStart;if(g&&!~navigator.appVersion.indexOf("MSIE 10"))e=g.createRange(),e.moveStart("character",a.is("input")?-a.val().length:-a.text().length),l=e.text.length;else if(d||"0"===d)l=d;return l}catch(b){}},setCaret:function(e){try{if(a.is(":focus")){var l,
+c=a.get(0);c.setSelectionRange?c.setSelectionRange(e,e):c.createTextRange&&(l=c.createTextRange(),l.collapse(!0),l.moveEnd("character",e),l.moveStart("character",e),l.select())}}catch(g){}},events:function(){a.on("keydown.mask",function(){m=c.val()}).on("keyup.mask",c.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){a.keydown().keyup()},100)}).on("change.mask",function(){a.data("changed",!0)}).on("blur.mask",function(){m===a.val()||a.data("changed")||a.trigger("change");a.data("changed",
+!1)}).on("focusout.mask",function(){b.clearIfNotMatch&&!p.test(c.val())&&c.val("")})},getRegexMask:function(){for(var e=[],a,c,g,b,k=0;k<d.length;k++)(a=h.translation[d[k]])?(c=a.pattern.toString().replace(/.{1}$|^.{1}/g,""),g=a.optional,(a=a.recursive)?(e.push(d[k]),b={digit:d[k],pattern:c}):e.push(g||a?c+"?":c)):e.push(d[k].replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"));e=e.join("");b&&(e=e.replace(new RegExp("("+b.digit+"(.*"+b.digit+")?)"),"($1)?").replace(new RegExp(b.digit,"g"),b.pattern));return new RegExp(e)},
+destroyEvents:function(){a.off("keydown keyup paste drop change blur focusout DOMNodeInserted ".split(" ").join(".mask ")).removeData("changeCalled")},val:function(e){var c=a.is("input");return 0<arguments.length?c?a.val(e):a.text(e):c?a.val():a.text()},getMCharsBeforeCount:function(e,a){for(var c=0,b=0,f=d.length;b<f&&b<e;b++)h.translation[d.charAt(b)]||(e=a?e+1:e,c++);return c},caretPos:function(e,a,b,g){return h.translation[d.charAt(Math.min(e-1,d.length-1))]?Math.min(e+b-a-g,b):c.caretPos(e+1,
+a,b,g)},behaviour:function(a){a=a||window.event;var b=a.keyCode||a.which;if(-1===f.inArray(b,h.byPassKeys)){var d=c.getCaret(),g=c.val(),t=g.length,k=d<t,m=c.getMasked(),n=m.length,p=c.getMCharsBeforeCount(n-1)-c.getMCharsBeforeCount(t-1);m!==g&&c.val(m);!k||65===b&&a.ctrlKey||(8!==b&&46!==b&&(d=c.caretPos(d,t,n,p)),c.setCaret(d));return c.callbacks(a)}},getMasked:function(a){var l=[],f=c.val(),g=0,m=d.length,k=0,p=f.length,n=1,u="push",r=-1,q,v;b.reverse?(u="unshift",n=-1,q=0,g=m-1,k=p-1,v=function(){return-1<
+g&&-1<k}):(q=m-1,v=function(){return g<m&&k<p});for(;v();){var w=d.charAt(g),x=f.charAt(k),s=h.translation[w];if(s)x.match(s.pattern)?(l[u](x),s.recursive&&(-1===r?r=g:g===q&&(g=r-n),q===r&&(g-=n)),g+=n):s.optional&&(g+=n,k-=n),k+=n;else{if(!a)l[u](w);x===w&&(k+=n);g+=n}}a=d.charAt(q);m!==p+1||h.translation[a]||l.push(a);return l.join("")},callbacks:function(e){var f=c.val(),h=f!==m;if(!0===h&&"function"===typeof b.onChange)b.onChange(f,e,a,b);if(!0===h&&"function"===typeof b.onKeyPress)b.onKeyPress(f,
+e,a,b);if("function"===typeof b.onComplete&&f.length===d.length)b.onComplete(f,e,a,b)}};h.mask=d;h.options=b;h.remove=function(){var b;c.destroyEvents();c.val(h.getCleanVal()).removeAttr("maxlength");b=c.getCaret();c.setCaret(b-c.getMCharsBeforeCount(b));return a};h.getCleanVal=function(){return c.getMasked(!0)};h.init=function(){b=b||{};h.byPassKeys=[9,16,17,18,36,37,38,39,40,91];h.translation={0:{pattern:/\d/},9:{pattern:/\d/,optional:!0},"#":{pattern:/\d/,recursive:!0},A:{pattern:/[a-zA-Z0-9]/},
+S:{pattern:/[a-zA-Z]/}};h.translation=f.extend({},h.translation,b.translation);h=f.extend(!0,{},h,b);p=c.getRegexMask();!1!==b.maxlength&&a.attr("maxlength",d.length);b.placeholder&&a.attr("placeholder",b.placeholder);a.attr("autocomplete","off");c.destroyEvents();c.events();var e=c.getCaret();c.val(c.getMasked());c.setCaret(e+c.getMCharsBeforeCount(e,!0))}()},y={},z=function(){var a=f(this),d={};a.attr("data-mask-reverse")&&(d.reverse=!0);"false"===a.attr("data-mask-maxlength")&&(d.maxlength=!1);
+a.attr("data-mask-clearifnotmatch")&&(d.clearIfNotMatch=!0);a.mask(a.attr("data-mask"),d)};f.fn.mask=function(a,d){var b=this.selector,h=function(){var b=f(this).data("mask"),h=JSON.stringify;if("object"!==typeof b||h(b.options)!==h(d)||b.mask!==a)return f(this).data("mask",new A(this,a,d))};this.each(h);b&&!y[b]&&(y[b]=!0,setTimeout(function(){f(document).on("DOMNodeInserted.mask",b,h)},500))};f.fn.unmask=function(){try{return this.each(function(){f(this).data("mask").remove().removeData("mask")})}catch(a){}};
+f.fn.cleanVal=function(){return this.data("mask").getCleanVal()};f("*[data-mask]").each(z);f(document).on("DOMNodeInserted.mask","*[data-mask]",z)});
diff --git a/falcon-ui/app/js/lib/popover.js b/falcon-ui/app/js/lib/popover.js
index 57814df..e26c870 100644
--- a/falcon-ui/app/js/lib/popover.js
+++ b/falcon-ui/app/js/lib/popover.js
@@ -1,21 +1,3 @@
-/**
- * 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.
- */
-
 (function(window, angular, undefined){
   'use strict';
 
@@ -478,4 +460,4 @@
       };
     }
   ]);
-})(window, window.angular);
+})(window, window.angular);
\ No newline at end of file
diff --git a/falcon-ui/app/js/lib/xml2json.min.js b/falcon-ui/app/js/lib/xml2json.min.js
index 12c4a45..5c8401c 100644
--- a/falcon-ui/app/js/lib/xml2json.min.js
+++ b/falcon-ui/app/js/lib/xml2json.min.js
@@ -16,563 +16,560 @@
  */
 
 function X2JS(config) {
-    'use strict';
-        
-    var VERSION = "1.1.7";
-    
-    config = config || {};
-    initConfigDefaults();
-    initRequiredPolyfills();
-    
-    function initConfigDefaults() {
-        if(config.escapeMode === undefined) {
-            config.escapeMode = true;
-        }
-        config.attributePrefix = config.attributePrefix || "_";
-        config.arrayAccessForm = config.arrayAccessForm || "none";
-        config.emptyNodeForm = config.emptyNodeForm || "text";
-        if(config.enableToStringFunc === undefined) {
-            config.enableToStringFunc = true; 
-        }
-        config.arrayAccessFormPaths = config.arrayAccessFormPaths || []; 
-        if(config.skipEmptyTextNodesForObj === undefined) {
-            config.skipEmptyTextNodesForObj = true;
-        }
-        if(config.stripWhitespaces === undefined) {
-            config.stripWhitespaces = true;
-        }
-        config.datetimeAccessFormPaths = config.datetimeAccessFormPaths || [];
+	'use strict';
 
-        if(config.useDoubleQuotes === undefined) {
-            config.useDoubleQuotes = false;
-        }
+	var VERSION = "1.2.0";
+
+	config = config || {};
+	initConfigDefaults();
+	initRequiredPolyfills();
+
+	function initConfigDefaults() {
+		if(config.escapeMode === undefined) {
+			config.escapeMode = true;
+		}
+
+		config.attributePrefix = config.attributePrefix || "_";
+		config.arrayAccessForm = config.arrayAccessForm || "none";
+		config.emptyNodeForm = config.emptyNodeForm || "text";
+
+		if(config.enableToStringFunc === undefined) {
+			config.enableToStringFunc = true;
+		}
+		config.arrayAccessFormPaths = config.arrayAccessFormPaths || [];
+		if(config.skipEmptyTextNodesForObj === undefined) {
+			config.skipEmptyTextNodesForObj = true;
+		}
+		if(config.stripWhitespaces === undefined) {
+			config.stripWhitespaces = true;
+		}
+		config.datetimeAccessFormPaths = config.datetimeAccessFormPaths || [];
+
+		if(config.useDoubleQuotes === undefined) {
+			config.useDoubleQuotes = false;
+		}
+
+		config.xmlElementsFilter = config.xmlElementsFilter || [];
+		config.jsonPropertiesFilter = config.jsonPropertiesFilter || [];
+
+		if(config.keepCData === undefined) {
+			config.keepCData = false;
+		}
+	}
+
+	var DOMNodeTypes = {
+		ELEMENT_NODE 	   : 1,
+		TEXT_NODE    	   : 3,
+		CDATA_SECTION_NODE : 4,
+		COMMENT_NODE	   : 8,
+		DOCUMENT_NODE 	   : 9
+	};
+
+	function initRequiredPolyfills() {
+	}
+
+	function getNodeLocalName( node ) {
+		var nodeLocalName = node.localName;
+		if(nodeLocalName == null) // Yeah, this is IE!!
+			nodeLocalName = node.baseName;
+		if(nodeLocalName == null || nodeLocalName=="") // =="" is IE too
+			nodeLocalName = node.nodeName;
+		return nodeLocalName;
+	}
+
+	function getNodePrefix(node) {
+		return node.prefix;
+	}
+
+	function escapeXmlChars(str) {
+		if(typeof(str) == "string")
+			return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;');
+		else
+			return str;
+	}
+
+	function unescapeXmlChars(str) {
+		return str.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&amp;/g, '&');
+	}
+
+	function checkInStdFiltersArrayForm(stdFiltersArrayForm, obj, name, path) {
+        var idx = 0;
+		for(; idx < stdFiltersArrayForm.length; idx++) {
+			var filterPath = stdFiltersArrayForm[idx];
+			if( typeof filterPath === "string" ) {
+				if(filterPath == path)
+					break;
+			}
+			else
+			if( filterPath instanceof RegExp) {
+				if(filterPath.test(path))
+					break;
+			}
+			else
+			if( typeof filterPath === "function") {
+				if(filterPath(obj, name, path))
+					break;
+			}
+		}
+		return idx!=stdFiltersArrayForm.length;
     }
 
-    var DOMNodeTypes = {
-        ELEMENT_NODE       : 1,
-        TEXT_NODE          : 3,
-        CDATA_SECTION_NODE : 4,
-        COMMENT_NODE       : 8,
-        DOCUMENT_NODE      : 9
-    };
-    
-    function initRequiredPolyfills() {
-        function pad(number) {
-          var r = String(number);
-          if ( r.length === 1 ) {
-            r = '0' + r;
-          }
-          return r;
-        }
-        // Hello IE8-
-        if(typeof String.prototype.trim !== 'function') {           
-            String.prototype.trim = function() {
-                return this.replace(/^\s+|^\n+|(\s|\n)+$/g, '');
-            }
-        }
-        if(typeof Date.prototype.toISOString !== 'function') {
-            // Implementation from http://stackoverflow.com/questions/2573521/how-do-i-output-an-iso-8601-formatted-string-in-javascript
-            Date.prototype.toISOString = function() {
-              return this.getUTCFullYear()
-                + '-' + pad( this.getUTCMonth() + 1 )
-                + '-' + pad( this.getUTCDate() )
-                + 'T' + pad( this.getUTCHours() )
-                + ':' + pad( this.getUTCMinutes() )
-                + ':' + pad( this.getUTCSeconds() )
-                + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 )
-                + 'Z';
-            };
-        }
-    }
-    
-    function getNodeLocalName( node ) {
-        var nodeLocalName = node.localName;         
-        if(nodeLocalName == null) // Yeah, this is IE!! 
-            nodeLocalName = node.baseName;
-        if(nodeLocalName == null || nodeLocalName=="") // =="" is IE too
-            nodeLocalName = node.nodeName;
-        return nodeLocalName;
-    }
-    
-    function getNodePrefix(node) {
-        return node.prefix;
-    }
-        
-    function escapeXmlChars(str) {
-        if(typeof(str) == "string")
-            return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;');
-        else
-            return str;
+	function toArrayAccessForm(obj, childName, path) {
+		switch(config.arrayAccessForm) {
+			case "property":
+				if(!(obj[childName] instanceof Array))
+					obj[childName+"_asArray"] = [obj[childName]];
+				else
+					obj[childName+"_asArray"] = obj[childName];
+				break;
+			/*case "none":
+				break;*/
+		}
+
+		if(!(obj[childName] instanceof Array) && config.arrayAccessFormPaths.length > 0) {
+			if(checkInStdFiltersArrayForm(config.arrayAccessFormPaths, obj, childName, path)) {
+				obj[childName] = [obj[childName]];
+			}
+		}
+	}
+
+	function fromXmlDateTime(prop) {
+		// Implementation based up on http://stackoverflow.com/questions/8178598/xml-datetime-to-javascript-date-object
+		// Improved to support full spec and optional parts
+		var bits = prop.split(/[-T:+Z]/g);
+
+		var d = new Date(bits[0], bits[1]-1, bits[2]);
+		var secondBits = bits[5].split("\.");
+		d.setHours(bits[3], bits[4], secondBits[0]);
+		if(secondBits.length>1)
+			d.setMilliseconds(secondBits[1]);
+
+		// Get supplied time zone offset in minutes
+		if(bits[6] && bits[7]) {
+			var offsetMinutes = bits[6] * 60 + Number(bits[7]);
+			var sign = /\d\d-\d\d:\d\d$/.test(prop)? '-' : '+';
+
+			// Apply the sign
+			offsetMinutes = 0 + (sign == '-'? -1 * offsetMinutes : offsetMinutes);
+
+			// Apply offset and local timezone
+			d.setMinutes(d.getMinutes() - offsetMinutes - d.getTimezoneOffset())
+		}
+		else
+			if(prop.indexOf("Z", prop.length - 1) !== -1) {
+				d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()));
+			}
+
+		// d is now a local time equivalent to the supplied time
+		return d;
+	}
+
+	function checkFromXmlDateTimePaths(value, childName, fullPath) {
+		if(config.datetimeAccessFormPaths.length > 0) {
+			var path = fullPath.split("\.#")[0];
+			if(checkInStdFiltersArrayForm(config.datetimeAccessFormPaths, value, childName, path)) {
+				return fromXmlDateTime(value);
+			}
+			else
+				return value;
+		}
+		else
+			return value;
+	}
+
+	function checkXmlElementsFilter(obj, childType, childName, childPath) {
+        if( childType == DOMNodeTypes.ELEMENT_NODE && config.xmlElementsFilter.length > 0) {
+			return checkInStdFiltersArrayForm(config.xmlElementsFilter, obj, childName, childPath);
+		}
+		else
+			return true;
     }
 
-    function unescapeXmlChars(str) {
-        return str.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&amp;/g, '&');
-    }
-    
-    function toArrayAccessForm(obj, childName, path) {
-        switch(config.arrayAccessForm) {
-        case "property":
-            if(!(obj[childName] instanceof Array))
-                obj[childName+"_asArray"] = [obj[childName]];
-            else
-                obj[childName+"_asArray"] = obj[childName];
-            break;      
-        /*case "none":
-            break;*/
-        }
-        
-        if(!(obj[childName] instanceof Array) && config.arrayAccessFormPaths.length > 0) {
-            var idx = 0;
-            for(; idx < config.arrayAccessFormPaths.length; idx++) {
-                var arrayPath = config.arrayAccessFormPaths[idx];
-                if( typeof arrayPath === "string" ) {
-                    if(arrayPath == path)
-                        break;
-                }
-                else
-                if( arrayPath instanceof RegExp) {
-                    if(arrayPath.test(path))
-                        break;
-                }               
-                else
-                if( typeof arrayPath === "function") {
-                    if(arrayPath(obj, childName, path))
-                        break;
-                }
-            }
-            if(idx!=config.arrayAccessFormPaths.length) {
-                obj[childName] = [obj[childName]];
-            }
-        }
-    }
-    
-    function fromXmlDateTime(prop) {
-        // Implementation based up on http://stackoverflow.com/questions/8178598/xml-datetime-to-javascript-date-object
-        // Improved to support full spec and optional parts
-        var bits = prop.split(/[-T:+Z]/g);
-        
-        var d = new Date(bits[0], bits[1]-1, bits[2]);          
-        var secondBits = bits[5].split("\.");
-        d.setHours(bits[3], bits[4], secondBits[0]);
-        if(secondBits.length>1)
-            d.setMilliseconds(secondBits[1]);
+	function parseDOMChildren( node, path ) {
+		if(node.nodeType == DOMNodeTypes.DOCUMENT_NODE) {
+			var result = new Object;
+			var nodeChildren = node.childNodes;
+			// Alternative for firstElementChild which is not supported in some environments
+			for(var cidx=0; cidx <nodeChildren.length; cidx++) {
+				var child = nodeChildren.item(cidx);
+				if(child.nodeType == DOMNodeTypes.ELEMENT_NODE) {
+					var childName = getNodeLocalName(child);
+					result[childName] = parseDOMChildren(child, childName);
+				}
+			}
+			return result;
+		}
+		else
+		if(node.nodeType == DOMNodeTypes.ELEMENT_NODE) {
+			var result = new Object;
+			result.__cnt=0;
 
-        // Get supplied time zone offset in minutes
-        if(bits[6] && bits[7]) {
-            var offsetMinutes = bits[6] * 60 + Number(bits[7]);
-            var sign = /\d\d-\d\d:\d\d$/.test(prop)? '-' : '+';
+			var nodeChildren = node.childNodes;
 
-            // Apply the sign
-            offsetMinutes = 0 + (sign == '-'? -1 * offsetMinutes : offsetMinutes);
+			// Children nodes
+			for(var cidx=0; cidx <nodeChildren.length; cidx++) {
+				var child = nodeChildren.item(cidx); // nodeChildren[cidx];
+				var childName = getNodeLocalName(child);
 
-            // Apply offset and local timezone
-            d.setMinutes(d.getMinutes() - offsetMinutes - d.getTimezoneOffset())
-        }
-        else
-            if(prop.indexOf("Z", prop.length - 1) !== -1) {
-                d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()));                  
-            }
+				if(child.nodeType!= DOMNodeTypes.COMMENT_NODE) {
+					var childPath = path+"."+childName;
+					if (checkXmlElementsFilter(result,child.nodeType,childName,childPath)) {
+						result.__cnt++;
+						if(result[childName] == null) {
+							result[childName] = parseDOMChildren(child, childPath);
+							toArrayAccessForm(result, childName, childPath);
+						}
+						else {
+							if(result[childName] != null) {
+								if( !(result[childName] instanceof Array)) {
+									result[childName] = [result[childName]];
+									toArrayAccessForm(result, childName, childPath);
+								}
+							}
+							(result[childName])[result[childName].length] = parseDOMChildren(child, childPath);
+						}
+					}
+				}
+			}
 
-        // d is now a local time equivalent to the supplied time
-        return d;
-    }
-    
-    function checkFromXmlDateTimePaths(value, childName, fullPath) {
-        if(config.datetimeAccessFormPaths.length > 0) {
-            var path = fullPath.split("\.#")[0];
-            var idx = 0;
-            for(; idx < config.datetimeAccessFormPaths.length; idx++) {
-                var dtPath = config.datetimeAccessFormPaths[idx];
-                if( typeof dtPath === "string" ) {
-                    if(dtPath == path)
-                        break;
-                }
-                else
-                if( dtPath instanceof RegExp) {
-                    if(dtPath.test(path))
-                        break;
-                }               
-                else
-                if( typeof dtPath === "function") {
-                    if(dtPath(obj, childName, path))
-                        break;
-                }
-            }
-            if(idx!=config.datetimeAccessFormPaths.length) {
-                return fromXmlDateTime(value);
-            }
-            else
-                return value;
-        }
-        else
-            return value;
+			// Attributes
+			for(var aidx=0; aidx <node.attributes.length; aidx++) {
+				var attr = node.attributes.item(aidx); // [aidx];
+				result.__cnt++;
+				result[config.attributePrefix+attr.name]=attr.value;
+			}
+
+			// Node namespace prefix
+			var nodePrefix = getNodePrefix(node);
+			if(nodePrefix!=null && nodePrefix!="") {
+				result.__cnt++;
+				result.__prefix=nodePrefix;
+			}
+
+			if(result["#text"]!=null) {
+				result.__text = result["#text"];
+				if(result.__text instanceof Array) {
+					result.__text = result.__text.join("\n");
+				}
+				//if(config.escapeMode)
+				//	result.__text = unescapeXmlChars(result.__text);
+				if(config.stripWhitespaces)
+					result.__text = result.__text.trim();
+				delete result["#text"];
+				if(config.arrayAccessForm=="property")
+					delete result["#text_asArray"];
+				result.__text = checkFromXmlDateTimePaths(result.__text, childName, path+"."+childName);
+			}
+			if(result["#cdata-section"]!=null) {
+				result.__cdata = result["#cdata-section"];
+				delete result["#cdata-section"];
+				if(config.arrayAccessForm=="property")
+					delete result["#cdata-section_asArray"];
+			}
+
+			if( result.__cnt == 0 && config.emptyNodeForm=="text" ) {
+				result = '';
+			}
+			else
+			if( result.__cnt == 1 && result.__text!=null  ) {
+				result = result.__text;
+			}
+			else
+			if( result.__cnt == 1 && result.__cdata!=null && !config.keepCData  ) {
+				result = result.__cdata;
+			}
+			else
+			if ( result.__cnt > 1 && result.__text!=null && config.skipEmptyTextNodesForObj) {
+				if( (config.stripWhitespaces && result.__text=="") || (result.__text.trim()=="")) {
+					delete result.__text;
+				}
+			}
+			delete result.__cnt;
+
+			if( config.enableToStringFunc && (result.__text!=null || result.__cdata!=null )) {
+				result.toString = function() {
+					return (this.__text!=null? this.__text:'')+( this.__cdata!=null ? this.__cdata:'');
+				};
+			}
+
+			return result;
+		}
+		else
+		if(node.nodeType == DOMNodeTypes.TEXT_NODE || node.nodeType == DOMNodeTypes.CDATA_SECTION_NODE) {
+			return node.nodeValue;
+		}
+	}
+
+	function startTag(jsonObj, element, attrList, closed) {
+		var resultStr = "<"+ ( (jsonObj!=null && jsonObj.__prefix!=null)? (jsonObj.__prefix+":"):"") + element;
+		if(attrList!=null) {
+			for(var aidx = 0; aidx < attrList.length; aidx++) {
+				var attrName = attrList[aidx];
+				var attrVal = jsonObj[attrName];
+				if(config.escapeMode)
+					attrVal=escapeXmlChars(attrVal);
+				resultStr+=" "+attrName.substr(config.attributePrefix.length)+"=";
+				if(config.useDoubleQuotes)
+					resultStr+='"'+attrVal+'"';
+				else
+					resultStr+="'"+attrVal+"'";
+			}
+		}
+		if(!closed)
+			resultStr+=">";
+		else
+			resultStr+="/>";
+		return resultStr;
+	}
+
+	function endTag(jsonObj,elementName) {
+		return "</"+ (jsonObj.__prefix!=null? (jsonObj.__prefix+":"):"")+elementName+">";
+	}
+
+	function endsWith(str, suffix) {
+	    return str.indexOf(suffix, str.length - suffix.length) !== -1;
+	}
+
+	function jsonXmlSpecialElem ( jsonObj, jsonObjField ) {
+		if((config.arrayAccessForm=="property" && endsWith(jsonObjField.toString(),("_asArray")))
+				|| jsonObjField.toString().indexOf(config.attributePrefix)==0
+				|| jsonObjField.toString().indexOf("__")==0
+				|| (jsonObj[jsonObjField] instanceof Function) )
+			return true;
+		else
+			return false;
+	}
+
+	function jsonXmlElemCount ( jsonObj ) {
+		var elementsCnt = 0;
+		if(jsonObj instanceof Object ) {
+			for( var it in jsonObj  ) {
+				if(jsonXmlSpecialElem ( jsonObj, it) )
+					continue;
+				elementsCnt++;
+			}
+		}
+		return elementsCnt;
+	}
+
+	function checkJsonObjPropertiesFilter(jsonObj, propertyName, jsonObjPath) {
+        return config.jsonPropertiesFilter.length == 0
+			|| jsonObjPath==""
+			|| checkInStdFiltersArrayForm(config.jsonPropertiesFilter, jsonObj, propertyName, jsonObjPath);
     }
 
-    function parseDOMChildren( node, path ) {
-        if(node.nodeType == DOMNodeTypes.DOCUMENT_NODE) {
-            var result = new Object;
-            var nodeChildren = node.childNodes;
-            // Alternative for firstElementChild which is not supported in some environments
-            for(var cidx=0; cidx <nodeChildren.length; cidx++) {
-                var child = nodeChildren.item(cidx);
-                if(child.nodeType == DOMNodeTypes.ELEMENT_NODE) {
-                    var childName = getNodeLocalName(child);
-                    result[childName] = parseDOMChildren(child, childName);
-                }
-            }
-            return result;
-        }
-        else
-        if(node.nodeType == DOMNodeTypes.ELEMENT_NODE) {
-            var result = new Object;
-            result.__cnt=0;
-            
-            var nodeChildren = node.childNodes;
-            
-            // Children nodes
-            for(var cidx=0; cidx <nodeChildren.length; cidx++) {
-                var child = nodeChildren.item(cidx); // nodeChildren[cidx];
-                var childName = getNodeLocalName(child);
-                
-                if(child.nodeType!= DOMNodeTypes.COMMENT_NODE) {
-                    result.__cnt++;
-                    if(result[childName] == null) {
-                        result[childName] = parseDOMChildren(child, path+"."+childName);
-                        toArrayAccessForm(result, childName, path+"."+childName);                   
-                    }
-                    else {
-                        if(result[childName] != null) {
-                            if( !(result[childName] instanceof Array)) {
-                                result[childName] = [result[childName]];
-                                toArrayAccessForm(result, childName, path+"."+childName);
-                            }
-                        }
-                        (result[childName])[result[childName].length] = parseDOMChildren(child, path+"."+childName);
-                    }
-                }                               
-            }
-            
-            // Attributes
-            for(var aidx=0; aidx <node.attributes.length; aidx++) {
-                var attr = node.attributes.item(aidx); // [aidx];
-                result.__cnt++;
-                result[config.attributePrefix+attr.name]=attr.value;
-            }
-            
-            // Node namespace prefix
-            var nodePrefix = getNodePrefix(node);
-            if(nodePrefix!=null && nodePrefix!="") {
-                result.__cnt++;
-                result.__prefix=nodePrefix;
-            }
-            
-            if(result["#text"]!=null) {             
-                result.__text = result["#text"];
-                if(result.__text instanceof Array) {
-                    result.__text = result.__text.join("\n");
-                }
-                //if(config.escapeMode)
-                //  result.__text = unescapeXmlChars(result.__text);
-                if(config.stripWhitespaces)
-                    result.__text = result.__text.trim();
-                delete result["#text"];
-                if(config.arrayAccessForm=="property")
-                    delete result["#text_asArray"];
-                result.__text = checkFromXmlDateTimePaths(result.__text, childName, path+"."+childName);
-            }
-            if(result["#cdata-section"]!=null) {
-                result.__cdata = result["#cdata-section"];
-                delete result["#cdata-section"];
-                if(config.arrayAccessForm=="property")
-                    delete result["#cdata-section_asArray"];
-            }
-            
-            if( result.__cnt == 1 && result.__text!=null  ) {
-                result = result.__text;
-            }
-            else
-            if( result.__cnt == 0 && config.emptyNodeForm=="text" ) {
-                result = '';
-            }
-            else
-            if ( result.__cnt > 1 && result.__text!=null && config.skipEmptyTextNodesForObj) {
-                if( (config.stripWhitespaces && result.__text=="") || (result.__text.trim()=="")) {
-                    delete result.__text;
-                }
-            }
-            delete result.__cnt;            
-            
-            if( config.enableToStringFunc && (result.__text!=null || result.__cdata!=null )) {
-                result.toString = function() {
-                    return (this.__text!=null? this.__text:'')+( this.__cdata!=null ? this.__cdata:'');
-                };
-            }
-            
-            return result;
-        }
-        else
-        if(node.nodeType == DOMNodeTypes.TEXT_NODE || node.nodeType == DOMNodeTypes.CDATA_SECTION_NODE) {
-            return node.nodeValue;
-        }   
-    }
-    
-    function startTag(jsonObj, element, attrList, closed) {
-        var resultStr = "<"+ ( (jsonObj!=null && jsonObj.__prefix!=null)? (jsonObj.__prefix+":"):"") + element;
-        if(attrList!=null) {
-            for(var aidx = 0; aidx < attrList.length; aidx++) {
-                var attrName = attrList[aidx];
-                var attrVal = jsonObj[attrName];
-                if(config.escapeMode)
-                    attrVal=escapeXmlChars(attrVal);
-                resultStr+=" "+attrName.substr(config.attributePrefix.length)+"=";
-                if(config.useDoubleQuotes)
-                    resultStr+='"'+attrVal+'"';
-                else
-                    resultStr+="'"+attrVal+"'";
-            }
-        }
-        if(!closed)
-            resultStr+=">";
-        else
-            resultStr+="/>";
-        return resultStr;
-    }
-    
-    function endTag(jsonObj,elementName) {
-        return "</"+ (jsonObj.__prefix!=null? (jsonObj.__prefix+":"):"")+elementName+">";
-    }
-    
-    function endsWith(str, suffix) {
-        return str.indexOf(suffix, str.length - suffix.length) !== -1;
-    }
-    
-    function jsonXmlSpecialElem ( jsonObj, jsonObjField ) {
-        if((config.arrayAccessForm=="property" && endsWith(jsonObjField.toString(),("_asArray"))) 
-                || jsonObjField.toString().indexOf(config.attributePrefix)==0 
-                || jsonObjField.toString().indexOf("__")==0
-                || (jsonObj[jsonObjField] instanceof Function) )
-            return true;
-        else
-            return false;
-    }
-    
-    function jsonXmlElemCount ( jsonObj ) {
-        var elementsCnt = 0;
-        if(jsonObj instanceof Object ) {
-            for( var it in jsonObj  ) {
-                if(jsonXmlSpecialElem ( jsonObj, it) )
-                    continue;           
-                elementsCnt++;
-            }
-        }
-        return elementsCnt;
-    }
-    
-    function parseJSONAttributes ( jsonObj ) {
-        var attrList = [];
-        if(jsonObj instanceof Object ) {
-            for( var ait in jsonObj  ) {
-                if(ait.toString().indexOf("__")== -1 && ait.toString().indexOf(config.attributePrefix)==0) {
-                    attrList.push(ait);
-                }
-            }
-        }
-        return attrList;
-    }
-    
-    function parseJSONTextAttrs ( jsonTxtObj ) {
-        var result ="";
-        
-        if(jsonTxtObj.__cdata!=null) {                                      
-            result+="<![CDATA["+jsonTxtObj.__cdata+"]]>";                   
-        }
-        
-        if(jsonTxtObj.__text!=null) {           
-            if(config.escapeMode)
-                result+=escapeXmlChars(jsonTxtObj.__text);
-            else
-                result+=jsonTxtObj.__text;
-        }
-        return result;
-    }
-    
-    function parseJSONTextObject ( jsonTxtObj ) {
-        var result ="";
+	function parseJSONAttributes ( jsonObj ) {
+		var attrList = [];
+		if(jsonObj instanceof Object ) {
+			for( var ait in jsonObj  ) {
+				if(ait.toString().indexOf("__")== -1 && ait.toString().indexOf(config.attributePrefix)==0) {
+					attrList.push(ait);
+				}
+			}
+		}
+		return attrList;
+	}
 
-        if( jsonTxtObj instanceof Object ) {
-            result+=parseJSONTextAttrs ( jsonTxtObj );
+	function parseJSONTextAttrs ( jsonTxtObj ) {
+		var result ="";
+
+		if(jsonTxtObj.__cdata!=null) {
+			result+="<![CDATA["+jsonTxtObj.__cdata+"]]>";
+		}
+
+		if(jsonTxtObj.__text!=null) {
+			if(config.escapeMode)
+				result+=escapeXmlChars(jsonTxtObj.__text);
+			else
+				result+=jsonTxtObj.__text;
+		}
+		return result;
+	}
+
+	function parseJSONTextObject ( jsonTxtObj ) {
+		var result ="";
+
+		if( jsonTxtObj instanceof Object ) {
+			result+=parseJSONTextAttrs ( jsonTxtObj );
+		}
+		else
+			if(jsonTxtObj!=null) {
+				if(config.escapeMode)
+					result+=escapeXmlChars(jsonTxtObj);
+				else
+					result+=jsonTxtObj;
+			}
+
+		return result;
+	}
+
+	function getJsonPropertyPath(jsonObjPath, jsonPropName) {
+		if (jsonObjPath==="") {
+            return jsonPropName;
         }
-        else
-            if(jsonTxtObj!=null) {
-                if(config.escapeMode)
-                    result+=escapeXmlChars(jsonTxtObj);
-                else
-                    result+=jsonTxtObj;
-            }
-        
-        return result;
+		else
+			return jsonObjPath+"."+jsonPropName;
     }
-    
-    function parseJSONArray ( jsonArrRoot, jsonArrObj, attrList ) {
-        var result = ""; 
-        if(jsonArrRoot.length == 0) {
-            result+=startTag(jsonArrRoot, jsonArrObj, attrList, true);
-        }
-        else {
-            for(var arIdx = 0; arIdx < jsonArrRoot.length; arIdx++) {
-                result+=startTag(jsonArrRoot[arIdx], jsonArrObj, parseJSONAttributes(jsonArrRoot[arIdx]), false);
-                result+=parseJSONObject(jsonArrRoot[arIdx]);
-                result+=endTag(jsonArrRoot[arIdx],jsonArrObj);                      
-            }
-        }
-        return result;
-    }
-    
-    function parseJSONObject ( jsonObj ) {
-        var result = "";    
 
-        var elementsCnt = jsonXmlElemCount ( jsonObj );
-        
-        if(elementsCnt > 0) {
-            for( var it in jsonObj ) {
-                
-                if(jsonXmlSpecialElem ( jsonObj, it) )
-                    continue;           
-                
-                var subObj = jsonObj[it];                       
-                
-                var attrList = parseJSONAttributes( subObj )
-                
-                if(subObj == null || subObj == undefined) {
-                    result+=startTag(subObj, it, attrList, true);
-                }
-                else
-                if(subObj instanceof Object) {
-                    
-                    if(subObj instanceof Array) {                   
-                        result+=parseJSONArray( subObj, it, attrList );                 
-                    }
-                    else if(subObj instanceof Date) {
-                        result+=startTag(subObj, it, attrList, false);
-                        result+=subObj.toISOString();
-                        result+=endTag(subObj,it);
-                    }
-                    else {
-                        var subObjElementsCnt = jsonXmlElemCount ( subObj );
-                        if(subObjElementsCnt > 0 || subObj.__text!=null || subObj.__cdata!=null) {
-                            result+=startTag(subObj, it, attrList, false);
-                            result+=parseJSONObject(subObj);
-                            result+=endTag(subObj,it);
-                        }
-                        else {
-                            result+=startTag(subObj, it, attrList, true);
-                        }
-                    }
-                }
-                else {
-                    result+=startTag(subObj, it, attrList, false);
-                    result+=parseJSONTextObject(subObj);
-                    result+=endTag(subObj,it);
-                }
-            }
-        }
-        result+=parseJSONTextObject(jsonObj);
-        
-        return result;
-    }
-    
-    this.parseXmlString = function(xmlDocStr) {
-        var isIEParser = window.ActiveXObject || "ActiveXObject" in window;
-        if (xmlDocStr === undefined) {
-            return null;
-        }
-        var xmlDoc;
-        if (window.DOMParser) {
-            var parser=new window.DOMParser();          
-            var parsererrorNS = null;
-            // IE9+ now is here
-            if(!isIEParser) {
-                try {
-                    parsererrorNS = parser.parseFromString("INVALID", "text/xml").childNodes[0].namespaceURI;
-                }
-                catch(err) {                    
-                    parsererrorNS = null;
-                }
-            }
-            try {
-                xmlDoc = parser.parseFromString( xmlDocStr, "text/xml" );
-                if( parsererrorNS!= null && xmlDoc.getElementsByTagNameNS(parsererrorNS, "parsererror").length > 0) {
-                    //throw new Error('Error parsing XML: '+xmlDocStr);
-                    xmlDoc = null;
-                }
-            }
-            catch(err) {
-                xmlDoc = null;
-            }
-        }
-        else {
-            // IE :(
-            if(xmlDocStr.indexOf("<?")==0) {
-                xmlDocStr = xmlDocStr.substr( xmlDocStr.indexOf("?>") + 2 );
-            }
-            xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
-            xmlDoc.async="false";
-            xmlDoc.loadXML(xmlDocStr);
-        }
-        return xmlDoc;
-    };
-    
-    this.asArray = function(prop) {
-        if (prop === undefined || prop == null)
-            return [];
-        else
-        if(prop instanceof Array)
-            return prop;
-        else
-            return [prop];
-    };
-    
-    this.toXmlDateTime = function(dt) {
-        if(dt instanceof Date)
-            return dt.toISOString();
-        else
-        if(typeof(dt) === 'number' )
-            return new Date(dt).toISOString();
-        else    
-            return null;
-    };
-    
-    this.asDateTime = function(prop) {
-        if(typeof(prop) == "string") {
-            return fromXmlDateTime(prop);
-        }
-        else
-            return prop;
-    };
+	function parseJSONArray ( jsonArrRoot, jsonArrObj, attrList, jsonObjPath ) {
+		var result = "";
+		if(jsonArrRoot.length == 0) {
+			result+=startTag(jsonArrRoot, jsonArrObj, attrList, true);
+		}
+		else {
+			for(var arIdx = 0; arIdx < jsonArrRoot.length; arIdx++) {
+				result+=startTag(jsonArrRoot[arIdx], jsonArrObj, parseJSONAttributes(jsonArrRoot[arIdx]), false);
+				result+=parseJSONObject(jsonArrRoot[arIdx], getJsonPropertyPath(jsonObjPath,jsonArrObj));
+				result+=endTag(jsonArrRoot[arIdx],jsonArrObj);
+			}
+		}
+		return result;
+	}
 
-    this.xml2json = function (xmlDoc) {
-        return parseDOMChildren ( xmlDoc );
-    };
-    
-    this.xml_str2json = function (xmlDocStr) {
-        var xmlDoc = this.parseXmlString(xmlDocStr);
-        if(xmlDoc!=null)
-            return this.xml2json(xmlDoc);
-        else
-            return null;
-    };
+	function parseJSONObject ( jsonObj, jsonObjPath ) {
+		var result = "";
 
-    this.json2xml_str = function (jsonObj) {
-        return parseJSONObject ( jsonObj );
-    };
+		var elementsCnt = jsonXmlElemCount ( jsonObj );
 
-    this.json2xml = function (jsonObj) {
-        var xmlDocStr = this.json2xml_str (jsonObj);
-        return this.parseXmlString(xmlDocStr);
-    };
-    
-    this.getVersion = function () {
-        return VERSION;
-    };
-    
-}
\ No newline at end of file
+		if(elementsCnt > 0) {
+			for( var it in jsonObj ) {
+
+				if(jsonXmlSpecialElem ( jsonObj, it) || (jsonObjPath!="" && !checkJsonObjPropertiesFilter(jsonObj, it, getJsonPropertyPath(jsonObjPath,it))) )
+					continue;
+
+				var subObj = jsonObj[it];
+
+				var attrList = parseJSONAttributes( subObj )
+
+				if(subObj == null || subObj == undefined) {
+					result+=startTag(subObj, it, attrList, true);
+				}
+				else
+				if(subObj instanceof Object) {
+
+					if(subObj instanceof Array) {
+						result+=parseJSONArray( subObj, it, attrList, jsonObjPath );
+					}
+					else if(subObj instanceof Date) {
+						result+=startTag(subObj, it, attrList, false);
+						result+=subObj.toISOString();
+						result+=endTag(subObj,it);
+					}
+					else {
+						var subObjElementsCnt = jsonXmlElemCount ( subObj );
+						if(subObjElementsCnt > 0 || subObj.__text!=null || subObj.__cdata!=null) {
+							result+=startTag(subObj, it, attrList, false);
+							result+=parseJSONObject(subObj, getJsonPropertyPath(jsonObjPath,it));
+							result+=endTag(subObj,it);
+						}
+						else {
+							result+=startTag(subObj, it, attrList, true);
+						}
+					}
+				}
+				else {
+					result+=startTag(subObj, it, attrList, false);
+					result+=parseJSONTextObject(subObj);
+					result+=endTag(subObj,it);
+				}
+			}
+		}
+		result+=parseJSONTextObject(jsonObj);
+
+		return result;
+	}
+
+	this.parseXmlString = function(xmlDocStr) {
+		var isIEParser = window.ActiveXObject || "ActiveXObject" in window;
+		if (xmlDocStr === undefined) {
+			return null;
+		}
+		var xmlDoc;
+		if (window.DOMParser) {
+			var parser=new window.DOMParser();
+			var parsererrorNS = null;
+			// IE9+ now is here
+			if(!isIEParser) {
+				try {
+					parsererrorNS = parser.parseFromString("INVALID", "text/xml").getElementsByTagName("parsererror")[0].namespaceURI;
+				}
+				catch(err) {
+					parsererrorNS = null;
+				}
+			}
+			try {
+				xmlDoc = parser.parseFromString( xmlDocStr, "text/xml" );
+				if( parsererrorNS!= null && xmlDoc.getElementsByTagNameNS(parsererrorNS, "parsererror").length > 0) {
+					//throw new Error('Error parsing XML: '+xmlDocStr);
+					xmlDoc = null;
+				}
+			}
+			catch(err) {
+				xmlDoc = null;
+			}
+		}
+		else {
+			// IE :(
+			if(xmlDocStr.indexOf("<?")==0) {
+				xmlDocStr = xmlDocStr.substr( xmlDocStr.indexOf("?>") + 2 );
+			}
+			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
+			xmlDoc.async="false";
+			xmlDoc.loadXML(xmlDocStr);
+		}
+		return xmlDoc;
+	};
+
+	this.asArray = function(prop) {
+		if (prop === undefined || prop == null)
+			return [];
+		else
+		if(prop instanceof Array)
+			return prop;
+		else
+			return [prop];
+	};
+
+	this.toXmlDateTime = function(dt) {
+		if(dt instanceof Date)
+			return dt.toISOString();
+		else
+		if(typeof(dt) === 'number' )
+			return new Date(dt).toISOString();
+		else
+			return null;
+	};
+
+	this.asDateTime = function(prop) {
+		if(typeof(prop) == "string") {
+			return fromXmlDateTime(prop);
+		}
+		else
+			return prop;
+	};
+
+	this.xml2json = function (xmlDoc) {
+		return parseDOMChildren ( xmlDoc );
+	};
+
+	this.xml_str2json = function (xmlDocStr) {
+		var xmlDoc = this.parseXmlString(xmlDocStr);
+		if(xmlDoc!=null)
+			return this.xml2json(xmlDoc);
+		else
+			return null;
+	};
+
+	this.json2xml_str = function (jsonObj) {
+		return parseJSONObject ( jsonObj, "" );
+	};
+
+	this.json2xml = function (jsonObj) {
+		var xmlDocStr = this.json2xml_str (jsonObj);
+		return this.parseXmlString(xmlDocStr);
+	};
+
+	this.getVersion = function () {
+		return VERSION;
+	};
+}
diff --git a/falcon-ui/app/js/services/common/date-helper.js b/falcon-ui/app/js/services/common/date-helper.js
index b1f4b52..a837aa0 100644
--- a/falcon-ui/app/js/services/common/date-helper.js
+++ b/falcon-ui/app/js/services/common/date-helper.js
@@ -21,6 +21,218 @@
   angular.module('dateHelper', [])
     .factory('DateHelper', function () {
 
+      var formats = {
+       "ar-SA" : "dd/MM/yy",
+       "bg-BG" : "dd.M.yyyy",
+       "ca-ES" : "dd/MM/yyyy",
+       "zh-TW" : "yyyy/M/d",
+       "cs-CZ" : "d.M.yyyy",
+       "da-DK" : "dd-MM-yyyy",
+       "de-DE" : "dd.MM.yyyy",
+       "el-GR" : "d/M/yyyy",
+       "en-US" : "MM/dd/yyyy",
+       "fi-FI" : "d.M.yyyy",
+       "fr-FR" : "dd/MM/yyyy",
+       "he-IL" : "dd/MM/yyyy",
+       "hu-HU" : "yyyy. MM. dd.",
+       "is-IS" : "d.M.yyyy",
+       "it-IT" : "dd/MM/yyyy",
+       "ja-JP" : "yyyy/MM/dd",
+       "ko-KR" : "yyyy-MM-dd",
+       "nl-NL" : "d-M-yyyy",
+       "nb-NO" : "dd.MM.yyyy",
+       "pl-PL" : "yyyy-MM-dd",
+       "pt-BR" : "d/M/yyyy",
+       "ro-RO" : "dd.MM.yyyy",
+       "ru-RU" : "dd.MM.yyyy",
+       "hr-HR" : "d.M.yyyy",
+       "sk-SK" : "d. M. yyyy",
+       "sq-AL" : "yyyy-MM-dd",
+       "sv-SE" : "yyyy-MM-dd",
+       "th-TH" : "d/M/yyyy",
+       "tr-TR" : "dd.MM.yyyy",
+       "ur-PK" : "dd/MM/yyyy",
+       "id-ID" : "dd/MM/yyyy",
+       "uk-UA" : "dd.MM.yyyy",
+       "be-BY" : "dd.MM.yyyy",
+       "sl-SI" : "d.M.yyyy",
+       "et-EE" : "d.MM.yyyy",
+       "lv-LV" : "yyyy.MM.dd.",
+       "lt-LT" : "yyyy.MM.dd",
+       "fa-IR" : "MM/dd/yyyy",
+       "vi-VN" : "dd/MM/yyyy",
+       "hy-AM" : "dd.MM.yyyy",
+       "az-Latn-AZ" : "dd.MM.yyyy",
+       "eu-ES" : "yyyy/MM/dd",
+       "mk-MK" : "dd.MM.yyyy",
+       "af-ZA" : "yyyy/MM/dd",
+       "ka-GE" : "dd.MM.yyyy",
+       "fo-FO" : "dd-MM-yyyy",
+       "hi-IN" : "dd-MM-yyyy",
+       "ms-MY" : "dd/MM/yyyy",
+       "kk-KZ" : "dd.MM.yyyy",
+       "ky-KG" : "dd.MM.yy",
+       "sw-KE" : "M/d/yyyy",
+       "uz-Latn-UZ" : "dd/MM yyyy",
+       "tt-RU" : "dd.MM.yyyy",
+       "pa-IN" : "dd-MM-yy",
+       "gu-IN" : "dd-MM-yy",
+       "ta-IN" : "dd-MM-yyyy",
+       "te-IN" : "dd-MM-yy",
+       "kn-IN" : "dd-MM-yy",
+       "mr-IN" : "dd-MM-yyyy",
+       "sa-IN" : "dd-MM-yyyy",
+       "mn-MN" : "yy.MM.dd",
+       "gl-ES" : "dd/MM/yy",
+       "kok-IN" : "dd-MM-yyyy",
+       "syr-SY" : "dd/MM/yyyy",
+       "dv-MV" : "dd/MM/yy",
+       "ar-IQ" : "dd/MM/yyyy",
+       "zh-CN" : "yyyy/M/d",
+       "de-CH" : "dd.MM.yyyy",
+       "en-GB" : "dd/MM/yyyy",
+       "es-MX" : "dd/MM/yyyy",
+       "fr-BE" : "d/MM/yyyy",
+       "it-CH" : "dd.MM.yyyy",
+       "nl-BE" : "d/MM/yyyy",
+       "nn-NO" : "dd.MM.yyyy",
+       "pt-PT" : "dd-MM-yyyy",
+       "sr-Latn-CS" : "d.M.yyyy",
+       "sv-FI" : "d.M.yyyy",
+       "az-Cyrl-AZ" : "dd.MM.yyyy",
+       "ms-BN" : "dd/MM/yyyy",
+       "uz-Cyrl-UZ" : "dd.MM.yyyy",
+       "ar-EG" : "dd/MM/yyyy",
+       "zh-HK" : "d/M/yyyy",
+       "de-AT" : "dd.MM.yyyy",
+       "en-AU" : "d/MM/yyyy",
+       "es-ES" : "dd/MM/yyyy",
+       "fr-CA" : "yyyy-MM-dd",
+       "sr-Cyrl-CS" : "d.M.yyyy",
+       "ar-LY" : "dd/MM/yyyy",
+       "zh-SG" : "d/M/yyyy",
+       "de-LU" : "dd.MM.yyyy",
+       "en-CA" : "dd/MM/yyyy",
+       "es-GT" : "dd/MM/yyyy",
+       "fr-CH" : "dd.MM.yyyy",
+       "ar-DZ" : "dd-MM-yyyy",
+       "zh-MO" : "d/M/yyyy",
+       "de-LI" : "dd.MM.yyyy",
+       "en-NZ" : "d/MM/yyyy",
+       "es-CR" : "dd/MM/yyyy",
+       "fr-LU" : "dd/MM/yyyy",
+       "ar-MA" : "dd-MM-yyyy",
+       "en-IE" : "dd/MM/yyyy",
+       "es-PA" : "MM/dd/yyyy",
+       "fr-MC" : "dd/MM/yyyy",
+       "ar-TN" : "dd-MM-yyyy",
+       "en-ZA" : "yyyy/MM/dd",
+       "es-DO" : "dd/MM/yyyy",
+       "ar-OM" : "dd/MM/yyyy",
+       "en-JM" : "dd/MM/yyyy",
+       "es-VE" : "dd/MM/yyyy",
+       "ar-YE" : "dd/MM/yyyy",
+       "en-029" : "MM/dd/yyyy",
+       "es-CO" : "dd/MM/yyyy",
+       "ar-SY" : "dd/MM/yyyy",
+       "en-BZ" : "dd/MM/yyyy",
+       "es-PE" : "dd/MM/yyyy",
+       "ar-JO" : "dd/MM/yyyy",
+       "en-TT" : "dd/MM/yyyy",
+       "es-AR" : "dd/MM/yyyy",
+       "ar-LB" : "dd/MM/yyyy",
+       "en-ZW" : "M/d/yyyy",
+       "es-EC" : "dd/MM/yyyy",
+       "ar-KW" : "dd/MM/yyyy",
+       "en-PH" : "M/d/yyyy",
+       "es-CL" : "dd-MM-yyyy",
+       "ar-AE" : "dd/MM/yyyy",
+       "es-UY" : "dd/MM/yyyy",
+       "ar-BH" : "dd/MM/yyyy",
+       "es-PY" : "dd/MM/yyyy",
+       "ar-QA" : "dd/MM/yyyy",
+       "es-BO" : "dd/MM/yyyy",
+       "es-SV" : "dd/MM/yyyy",
+       "es-HN" : "dd/MM/yyyy",
+       "es-NI" : "dd/MM/yyyy",
+       "es-PR" : "dd/MM/yyyy",
+       "am-ET" : "d/M/yyyy",
+       "tzm-Latn-DZ" : "dd-MM-yyyy",
+       "iu-Latn-CA" : "d/MM/yyyy",
+       "sma-NO" : "dd.MM.yyyy",
+       "mn-Mong-CN" : "yyyy/M/d",
+       "gd-GB" : "dd/MM/yyyy",
+       "en-MY" : "d/M/yyyy",
+       "prs-AF" : "dd/MM/yy",
+       "bn-BD" : "dd-MM-yy",
+       "wo-SN" : "dd/MM/yyyy",
+       "rw-RW" : "M/d/yyyy",
+       "qut-GT" : "dd/MM/yyyy",
+       "sah-RU" : "MM.dd.yyyy",
+       "gsw-FR" : "dd/MM/yyyy",
+       "co-FR" : "dd/MM/yyyy",
+       "oc-FR" : "dd/MM/yyyy",
+       "mi-NZ" : "dd/MM/yyyy",
+       "ga-IE" : "dd/MM/yyyy",
+       "se-SE" : "yyyy-MM-dd",
+       "br-FR" : "dd/MM/yyyy",
+       "smn-FI" : "d.M.yyyy",
+       "moh-CA" : "M/d/yyyy",
+       "arn-CL" : "dd-MM-yyyy",
+       "ii-CN" : "yyyy/M/d",
+       "dsb-DE" : "d. M. yyyy",
+       "ig-NG" : "d/M/yyyy",
+       "kl-GL" : "dd-MM-yyyy",
+       "lb-LU" : "dd/MM/yyyy",
+       "ba-RU" : "dd.MM.yy",
+       "nso-ZA" : "yyyy/MM/dd",
+       "quz-BO" : "dd/MM/yyyy",
+       "yo-NG" : "d/M/yyyy",
+       "ha-Latn-NG" : "d/M/yyyy",
+       "fil-PH" : "M/d/yyyy",
+       "ps-AF" : "dd/MM/yy",
+       "fy-NL" : "d-M-yyyy",
+       "ne-NP" : "M/d/yyyy",
+       "se-NO" : "dd.MM.yyyy",
+       "iu-Cans-CA" : "d/M/yyyy",
+       "sr-Latn-RS" : "d.M.yyyy",
+       "si-LK" : "yyyy-MM-dd",
+       "sr-Cyrl-RS" : "d.M.yyyy",
+       "lo-LA" : "dd/MM/yyyy",
+       "km-KH" : "yyyy-MM-dd",
+       "cy-GB" : "dd/MM/yyyy",
+       "bo-CN" : "yyyy/M/d",
+       "sms-FI" : "d.M.yyyy",
+       "as-IN" : "dd-MM-yyyy",
+       "ml-IN" : "dd-MM-yy",
+       "en-IN" : "dd-MM-yyyy",
+       "or-IN" : "dd-MM-yy",
+       "bn-IN" : "dd-MM-yy",
+       "tk-TM" : "dd.MM.yy",
+       "bs-Latn-BA" : "d.M.yyyy",
+       "mt-MT" : "dd/MM/yyyy",
+       "sr-Cyrl-ME" : "d.M.yyyy",
+       "se-FI" : "d.M.yyyy",
+       "zu-ZA" : "yyyy/MM/dd",
+       "xh-ZA" : "yyyy/MM/dd",
+       "tn-ZA" : "yyyy/MM/dd",
+       "hsb-DE" : "d. M. yyyy",
+       "bs-Cyrl-BA" : "d.M.yyyy",
+       "tg-Cyrl-TJ" : "dd.MM.yy",
+       "sr-Latn-BA" : "d.M.yyyy",
+       "smj-NO" : "dd.MM.yyyy",
+       "rm-CH" : "dd/MM/yyyy",
+       "smj-SE" : "yyyy-MM-dd",
+       "quz-EC" : "dd/MM/yyyy",
+       "quz-PE" : "dd/MM/yyyy",
+       "hr-BA" : "d.M.yyyy.",
+       "sr-Latn-ME" : "d.M.yyyy",
+       "sma-SE" : "yyyy-MM-dd",
+       "en-SG" : "d/M/yyyy",
+       "ug-CN" : "yyyy-M-d",
+       "sr-Cyrl-BA" : "d.M.yyyy",
+       "es-US" : "M/d/yyyy"
+      };
       var formatDigit = function(digit){
         if(digit<10){
           digit = "0"+digit;
@@ -28,16 +240,26 @@
         return digit;
       };
 
+      var getTZOffset = function(tz){
+        var zoneDeltaPortion = tz.slice(4);
+        var zoneDeltaDirection = parseInt(tz.substr(3,1)+1);
+        var timePortions = zoneDeltaPortion.split(":");
+        var zoneTimeOffset = zoneDeltaDirection*parseInt(timePortions[0])+parseInt(timePortions[1])/60;
+        return zoneTimeOffset;
+      }
+
       var dateHelper = {};
 
+      dateHelper.getLocaleDateFormat = function() {
+        return formats[navigator.language] || 'MM/dd/yyyy';
+      }
+
       dateHelper.importDate = function (date, tz) {
         if (!tz || tz === 'UTC') {
           tz = "GMT+00:00";
         }
         var rawDate = Date.parse(date);
-        var tzN = parseInt(tz.slice(3));
-        var tzDate = new Date (rawDate + (3600000*tzN));
-
+        var tzDate = new Date (rawDate + (3600000*getTZOffset(tz)));
         return new Date(
           tzDate.getUTCFullYear(),
           tzDate.getUTCMonth(),
@@ -49,22 +271,16 @@
       };
 
       dateHelper.createISO = function (date, time, tz) {
-        var UTC = new Date(
-              Date.UTC(
-                date.getUTCFullYear(),
-                date.getUTCMonth(),
-                date.getUTCDate(),
-                time.getHours(),
-                time.getMinutes(),
-                0, 0
-              )
-            ).toUTCString() + tz.slice(3),
-            UTCRaw = Date.parse(UTC);
-
-        var dateWithSecs = new Date(UTCRaw).toISOString();
-
-        return dateWithSecs.slice(0, -8) + "Z";
-
+        var inputDate = new Date(date.getFullYear(),date.getMonth(),date.getDate(),
+                time.getHours(),time.getMinutes());
+        if (!tz || tz === 'UTC') {
+            tz = "GMT+00:00";
+        }
+        var currentOffsetInHours= -1*inputDate.getTimezoneOffset()/60;
+        var effectiveOff = currentOffsetInHours - getTZOffset(tz);
+        var inputDateInCurrentTz = inputDate.getTime() + effectiveOff*60*60*1000;
+        var inputDateInUTC = new Date(inputDateInCurrentTz - currentOffsetInHours*60*60*1000);
+        return dateHelper.createISOString(inputDateInUTC,inputDateInUTC);
       };
 
       //i.e. 2015-09-10T16:35:21.235Z
@@ -74,6 +290,18 @@
         return result;
       };
 
+      dateHelper.getDateTimeString = function(date,time){
+        var inputDate = new Date(date.getFullYear(),date.getMonth(),date.getDate(),
+                time.getHours(),time.getMinutes());
+        var result = inputDate.getFullYear() + "-" + formatDigit(inputDate.getMonth()+1) + "-" + formatDigit(inputDate.getDate())
+          + " " + formatDigit(inputDate.getHours()>12?inputDate.getHours()-12:inputDate.getHours()) + ":" + formatDigit(inputDate.getMinutes());
+        if(inputDate.getHours() < 12){
+          result = result + " AM";
+        }else{
+          result = result + " PM";
+        }
+        return result;
+      }
       return dateHelper;
 
     });
diff --git a/falcon-ui/app/js/services/common/falcon-api.js b/falcon-ui/app/js/services/common/falcon-api.js
index a0b1bb7..9137904 100644
--- a/falcon-ui/app/js/services/common/falcon-api.js
+++ b/falcon-ui/app/js/services/common/falcon-api.js
@@ -24,17 +24,16 @@
     function ($http, X2jsService, $location, $rootScope, $cookieStore, $timeout) {
 
       var Falcon = {},
-        NUMBER_OF_ENTITIES = 10,
+        NUMBER_OF_ENTITIES = 20,
         NUMBER_OF_INSTANCES = 11; // 10 + 1 for next page
 
-      function buildURI(uri) {
+      function buildURI(uri, noUser) {
         if ($rootScope.ambariView()) {
           uri = uri.substring(2);
           uri = $rootScope.serviceURI + uri;
-        } else {
-          if(!$rootScope.secureMode){
-            uri = add_user(uri);
-          }
+        }
+        if(!$rootScope.secureMode && !noUser){
+          uri = add_user(uri);
         }
         console.log(uri);
         return uri;
@@ -70,47 +69,33 @@
       Falcon.responses.isVisible = false;
 
       Falcon.hide = function () {
-        Falcon.hideTimeout = $timeout(function () {
-          $(".notifs").fadeOut(300);
-        }, 5000);
+        $rootScope.$emit('hideNotifications', {'delay' : 'slow'});
       };
 
       Falcon.responses.unreaded = 0;
       Falcon.notify = function (showAll) {
-        $(".notifs").stop();
-        $timeout.cancel(Falcon.hideTimeout);
-
         if (showAll) {
           Falcon.responses.unreaded = 0;
           if (Falcon.responses.isVisible) {
             Falcon.responses.isVisible = false;
-            $(".notifs").fadeOut(300);
+            $rootScope.$emit('hideNotifications');
           } else {
             Falcon.responses.isVisible = true;
-            $(".notifs").hide();
-            $(".notifs").fadeIn(300);
+            $rootScope.$emit('showNotifications');
           }
           Falcon.responses.showAll = true;
         } else {
           Falcon.responses.unreaded++;
           Falcon.responses.isVisible = false;
-          $(".notifs").stop();
-          $(".notifs").hide();
-          $(".notifs").fadeIn(300);
-          $(".notifs").fadeOut(300);
-          $(".notifs").fadeIn(300);
-          $(".notifs").fadeOut(300);
-          $(".notifs").fadeIn(300);
+          $rootScope.$emit('flashNotifications');
           Falcon.hide();
           Falcon.responses.showAll = false;
         }
       };
 
       Falcon.hideNotifs = function () {
-        $(".notifs").stop();
-        $timeout.cancel(Falcon.hideTimeout);
+        $rootScope.$emit('hideNotifications');
         Falcon.responses.isVisible = false;
-        $(".notifs").fadeOut(300);
         Falcon.responses.queue.forEach(function(notifMsg) {
           notifMsg.readed = true;
         });
@@ -159,6 +144,15 @@
               requestId: messageObject.requestId,
               readed: false
             };
+          } else if (messageObject.errorCode !== undefined) {
+            var response = {
+              success: false,
+              type: "error",
+              status: "error",
+              message: messageObject.errorMessage,
+              requestId: messageObject.requestId,
+              readed: false
+            };
           } else {
             if (messageObject.slice(0, 6) !== "Cannot") {
               var errorMessage = X2jsService.xml_str2json(messageObject);
@@ -248,7 +242,7 @@
       //-------------METHODS-----------------------------//
 
       Falcon.getServerConfig = function () {
-        return $http.get('../api/admin/version?user.name=falcon');
+        return $http.get(buildURI('../api/admin/version?user.name=falcon', true));
       };
 
       Falcon.getServerStack = function () {
@@ -256,11 +250,15 @@
       };
 
       Falcon.clearUser = function () {
-        return $http.get('../api/admin/clearuser?user.name=falcon');
+        return $http.get(buildURI('../api/admin/clearuser?user.name=falcon', true));
       };
 
       Falcon.getCurrentUser = function () {
-        return $http.get('../api/admin/getuser');
+        return $http.get(buildURI('../api/admin/getuser', true));
+      };
+
+      Falcon.getRuntimeConfig = function (currentUser) {
+        return $http.get(buildURI('../api/admin/config/runtime?user.name=' + currentUser, true));
       };
 
       Falcon.postValidateEntity = function (xml, type) {
@@ -295,6 +293,10 @@
         return $http.get(buildURI('../api/entities/definition/' + type + '/' + name), {headers: {'Accept': 'text/plain'}});
       };
 
+      Falcon.getEntityStatus = function (type, name) {
+        return $http.get(buildURI('../api/entities/status/' + type + '/' + name));
+      };
+
       Falcon.searchEntities = function (name, tags, entityType, offset, order) {
         var searchUrl = "../api/entities/list/";
         if (entityType !== undefined && entityType !== "") {
@@ -404,6 +406,23 @@
         return $http.post(buildURI('../api/entities/prepareAndSubmitRecipe'), recipe, {headers: {'Content-Type': 'text/plain'}});
       };
 
+      //----Extension APIs-----//
+      Falcon.getExtensionDefinition = function (type) {
+        return $http.get(buildURI('../api/extension/definition/' + type), {headers: {'Accept': 'text/plain'}});
+      };
+
+      Falcon.postValidateExtension = function (extension, type) {
+        return $http.post(buildURI('../api/extension/validate/' + type), extension, {headers: {'Content-Type': 'text/plain'}});
+      };
+
+      Falcon.postSubmitExtension = function (extension, type) {
+        return $http.post(buildURI('../api/extension/submit/' + type), extension, {headers: {'Content-Type': 'text/plain'}});
+      };
+
+      Falcon.postUpdateExtension = function (extension, type) {
+        return $http.post(buildURI('../api/extension/update/' + type), extension, {headers: {'Content-Type': 'text/plain'}});
+      };
+
       return Falcon;
 
     }]);
diff --git a/falcon-ui/app/js/services/common/route-helper.js b/falcon-ui/app/js/services/common/route-helper.js
new file mode 100644
index 0000000..78592a1
--- /dev/null
+++ b/falcon-ui/app/js/services/common/route-helper.js
@@ -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.
+ */
+(function () {
+  'use strict';
+
+  angular.module('routeHelper', [])
+    .factory('RouteHelper', function () {
+      var getStateInfo = function (state) {
+        var currentState = state.substring(state.lastIndexOf(".")+ 1,state.length);
+        var currentPath = state.substring(0,state.lastIndexOf("."));
+        return {path : currentPath, state : currentState};
+      };
+      var getNextState = function (currentState, stateMatrix) {
+        var stateInfo = getStateInfo(currentState);
+        var nextState = stateInfo.path + "." + stateMatrix[stateInfo.state].next;
+        return nextState;
+      };
+      var getPreviousState = function (currentState, stateMatrix) {
+        var stateInfo = getStateInfo(currentState);
+        return stateInfo.path + "." + stateMatrix[stateInfo.state].previous;
+      };
+      var getStateByType = function(type){
+        return type.toLowerCase();
+      }
+     return {
+       getNextState : getNextState,
+       getPreviousState : getPreviousState,
+       getStateByType : getStateByType
+     }
+    });
+})();
diff --git a/falcon-ui/app/js/services/common/server-api.js b/falcon-ui/app/js/services/common/server-api.js
index 9224179..c12125a 100644
--- a/falcon-ui/app/js/services/common/server-api.js
+++ b/falcon-ui/app/js/services/common/server-api.js
@@ -21,8 +21,8 @@
   var app = angular.module('app.services.server', ['app.services']);
 
   app.factory('ServerAPI', [
-    "Falcon", "$q",
-    function (Falcon, $q) {
+    "Falcon", "$q", "$rootScope",
+    function (Falcon, $q, $rootScope) {
 
       var ServerAPI = {};
 
@@ -33,8 +33,12 @@
           Falcon.logResponse('success', data, false, true);
           ServerAPI.data = data;
           deffered.resolve();
-        }).error(function (err) {
-          Falcon.logResponse('error', err);
+        }).error(function (error, code) {
+          $rootScope.httpError = {
+            error: error,
+            code: code
+          };
+          Falcon.logResponse('error', error);
           deffered.resolve();
         });
         return deffered.promise;
@@ -46,8 +50,12 @@
         Falcon.setOptions(username).success(function (data) {
           Falcon.logResponse('success', data, false, true);
           deffered.resolve();
-        }).error(function (err) {
-          Falcon.logResponse('error', err);
+        }).error(function (error, code) {
+          $rootScope.httpError = {
+            error: error,
+            code: code
+          };
+          Falcon.logResponse('error', error);
           deffered.resolve();
         });
         return deffered.promise;
@@ -60,8 +68,12 @@
           Falcon.logResponse('success', data, false, true);
           ServerAPI.setted = data;
           deffered.resolve();
-        }).error(function (err) {
-          Falcon.logResponse('error', err);
+        }).error(function (error, code) {
+          $rootScope.httpError = {
+            error: error,
+            code: code
+          };
+          Falcon.logResponse('error', error);
           deffered.resolve();
         });
         return deffered.promise;
@@ -74,8 +86,25 @@
           Falcon.logResponse('success', data, false, true);
           ServerAPI.user = data;
           deffered.resolve();
-        }).error(function (err) {
-          Falcon.logResponse('error', err);
+        }).error(function (error, code) {
+          $rootScope.httpError = {
+            error: error,
+            code: code
+          };
+          Falcon.logResponse('error', error);
+          deffered.resolve();
+        });
+        return deffered.promise;
+      };
+
+      ServerAPI.getRuntimeConfig = function(currentUser){
+        var deffered = $q.defer();
+        //Falcon.logRequest();
+        Falcon.getRuntimeConfig(currentUser).success(function (data) {
+          $rootScope.superUser = true;
+          deffered.resolve();
+        }).error(function (error, code) {
+          $rootScope.superUser = false;
           deffered.resolve();
         });
         return deffered.promise;
diff --git a/falcon-ui/app/js/services/common/tooltip-messages.js b/falcon-ui/app/js/services/common/tooltip-messages.js
new file mode 100644
index 0000000..2ee0790
--- /dev/null
+++ b/falcon-ui/app/js/services/common/tooltip-messages.js
@@ -0,0 +1,117 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  var module = angular.module('app.services.tooltip', []);
+
+  module.factory('TooltipMessages', ['$window', function ($window) {
+    var messages = {
+        'cluster.name': 'Unique. No special characters. Maximum 40 Characters',
+        'cluster.colo': 'Data center or co-location of this cluster',
+        'cluster.interfaces.readonly': 'URI for read operations<br>Eg. hdfs://localhost:50070 | webhdfs://localhost:50070 | hftp://localhost:50070',
+        'cluster.interfaces.write': 'URI for write operations<br>Eg. hdfs://localhost:8020',
+        'cluster.interfaces.execute': 'URI for executing jobs<br>Eg. localhost:8050',
+        'cluster.interfaces.workflow': 'URI to access the workflow manager<br>Eg. http://localhost:11000/oozie/',
+        'cluster.interfaces.messaging': 'URI for Falcon message broker<br>Eg. tcp://localhost:61616?daemon=true',
+        'cluster.interfaces.registry': 'URI to the Hive Host Thrift port<br>Eg. thrift://localhost:9083',
+        'cluster.interfaces.spark': 'URI for the Spark Master',
+        'cluster.locations.staging': 'Default HDFS directory for staging on this cluster. The directory should have 777 permisssion and owned by falcon.',
+        'cluster.locations.temp': 'Default HDFS directory for temporary storage on this cluster',
+        'cluster.locations.working': 'Default HDFS directory for working storage on this cluster.The directory should have 755 permisssion and owned by falcon.',
+
+        'feed.name': 'Unique. No special characters. Maximum 40 Characters',
+        'feed.groups': 'Comma seperated list of Feed Groups this Feed is part of',
+        'feed.schema.location': 'Location of the file containing the layout for the feed',
+        'feed.schema.provider': 'Data interchange protocol of the Feed:  Avro, Hive, RDBMS, etc',
+        'feed.properties.frequency': 'Frequency of feed generation.',
+        'feed.properties.lateArrival': 'Specify how long Feed processing should wait for the required feed to become available.',
+        'feed.properties.availabilityIndicator': 'If one exists, provide the name of file whose existance indicates the feed is available for use',
+        'feed.properties.timezone': 'Timezone associate with the feed, if different from the cluster default timezone.',
+        'feed.location.storageType': 'Select Catalog for Hive tables, File System for HDFS',
+        'feed.storage.tableUri': 'Eg. catalog:default:sample_07#ds=${YEAR}-${MONTH}-${DAY}-${HOUR}',
+
+        'process.name': 'Unique. No special characters.',
+        'process.workflow.path': 'Must specify a valid HDFS script of the engine type (Pig, Hive, Oozie, Spark)',
+        'process.properties.timezone': 'Timezone associate with the feed, if different from the cluster default timezone.',
+        'process.properties.retryPolicy': 'Workflow failure handling policy'
+          + '<div class="pt5px"><b>Periodic:</b><br>Try X times after  N Min/Hours/</div>'
+          + '<div class="pt5px"><b>Exponential Backup:</b><br>Try X times after N to the x1, N to x2, N to x3, etc.</div>'
+          + '<div class="pt5px"><b>None:</b><br>Do not retry</div>',
+        'process.properties.order': 'Order for instance pickup'
+          + '<div class="pt5px"><b>FIFO:</b><br>Oldest to Latest</div>'
+          + '<div class="pt5px"><b>LIFO:</b><br>Latest to Oldest</div>'
+          + '<div class="pt5px"><b>LASTONLY:</b><br>Latest only</div>',
+        'process.cluster': 'Cluster(s) this process should execute on',
+
+        'process.workflow.spark.name': 'Name of the spark application',
+        'process.workflow.spark.application': 'Path of jar or python file',
+        'process.workflow.spark.class': "Spark application's main class",
+        'process.workflow.spark.master': 'Run in Yarn or directly on spark',
+        'process.workflow.spark.mode': 'Run locally or or remote on the Application Master',
+
+        'datasource.driver.jar': 'HDFS location containing driver jar and should have access to the falcon user',
+        'datasource.credential.passwordFile': 'HDFS location containing password file without newline at the end and should be accessible by the user who creates the datasource entity',
+
+        'dataset.name': 'Unique job name',
+        'dataset.jobClusterName': 'Cluster where job should run',
+        'dataset.jobValidityStart': 'Job validity start time',
+        'dataset.jobValidityEnd': 'Job validity end time',
+        'dataset.jobFrequency': 'Job frequency. Valid frequency types are minutes, hours, days, months',
+        'dataset.jobTimezone': 'Time zone for the job',
+        'dataset.jobTags': 'list of comma separated tags. Key Value Pairs, separated by comma. Eg. consumer=consumer@xyz.com, _department_type=forecasting',
+        'dataset.jobRetryPolicy': 'Job retry policy',
+        'dataset.jobRetryDelay': 'Job retry delay',
+        'dataset.jobRetryAttempts': 'Job retry attempts',
+        'dataset.jobRetryOnTimeout': 'Job retry on timeout',
+        'dataset.jobAclOwner': 'ACL owner',
+        'dataset.jobAclGroup': 'ACL group',
+        'dataset.jobAclPermission': 'ACL permission',
+        'dataset.sourceDir': 'Multiple hdfs comma separated source directories',
+        'dataset.sourceCluster': 'Source cluster',
+        'dataset.targetDir': 'Target hdfs directory',
+        'dataset.targetCluster': 'Source cluster',
+        'dataset.distcpMaxMaps': 'Maximum number of mappers for DistCP',
+        'dataset.distcpMapBandwidth': 'Bandwidth in MB for each mapper in DistCP',
+        'dataset.maxEvents': 'To ceil the max events processed each time the job runs. Set it to max value depending on your bandwidth limit. Setting it to -1 will process all the events but can hog up the bandwidth. Use it judiciously!',
+        'dataset.replicationMaxMaps': 'Maximum number of mappers to use for hive replication',
+        'dataset.jobNotificationReceivers': 'Email Notification for Falcon instance completion.',
+        'dataset.tdeEncryptionEnabled': 'Set this flag to true if TDE encryption is enabled on source and target',
+        'dataset.sourceStagingPath': 'Staging path on source',
+        'dataset.targetStagingPath': 'Staging path on target',
+        'dataset.sourceHiveServer2Uri': 'Hive2 server end point. Eg. hive2://localhost:10000',
+        'dataset.targetHiveServer2Uri': 'Hive2 server end point. Eg.hive2://localhost:10000',
+        'dataset.sourceDatabases': 'For DB level replication specify multiple comma separated databases to replicate',
+        'dataset.sourceTables': 'For table level replication specify multiple comma separated tables to replicate',
+        'dataset.sourceHive2KerberosPrincipal': 'Kerberos principal required to access hive servers. Eg. hive/_HOST@EXAMPLE.COM',
+        'dataset.targetHive2KerberosPrincipal': 'Kerberos principal required to access hive servers. Eg. hive/_HOST@EXAMPLE.COM',
+
+        'dataset.snapshot.sourceSnapshotDir' : 'Snapshot-able source directory which should be replicated',
+        'dataset.snapshot.sourceSnapshotRetentionAgeLimit' : 'Snapshots on source older than this age limit will be eligible for deletion.',
+        'dataset.snapshot.sourceSnapshotRetentionNumber' : 'These many latest snapshots on source will be retained, the rest of them eligible for deletion.',
+        'dataset.snapshot.targetSnapshotDir' : 'Snapshot-able target directory to which source should be replicated',
+        'dataset.snapshot.targetSnapshotRetentionAgeLimit' : 'Snapshots on target older than this age limit will be eligible for deletion.',
+        'dataset.snapshot.targetSnapshotRetentionNumber' : 'These many latest snapshots on target will be retained, the rest of them eligible for deletion.'
+    };
+
+    return {
+      messages: messages
+    };
+
+  }]);
+}());
diff --git a/falcon-ui/app/js/services/common/validation-service.js b/falcon-ui/app/js/services/common/validation-service.js
index ff2f4ef..be4f9a7 100644
--- a/falcon-ui/app/js/services/common/validation-service.js
+++ b/falcon-ui/app/js/services/common/validation-service.js
@@ -24,7 +24,7 @@
     var checkMessages = {
         name: {
           patternInvalid: "The name has an invalid format.",
-          unavailable: "The name you choosed is not available",
+          unavailable: "The name you entered is not available",
           empty: "You need to specify a name"
         },
         colo: {
@@ -39,6 +39,10 @@
           empty: "You need to provide a path",
           patternInvalid: "The Path has an invalid format. "
         },
+        tableUri: {
+          empty: "You need to provide table uri",
+          patternInvalid: "The Table uri has an invalid format. "
+        },
         key: {
           empty: "You need to provide a key",
           patternInvalid: "The Key has an invalid format. "
@@ -71,6 +75,8 @@
         engine: { empty: "You need to select an engine" },
         cluster: { empty: "You need to select a cluster" },
         feed: { empty: "You need to select a feed" },
+        datasource: { empty: "You need to select a datasource" },
+        table: { empty: "You need to provide a table" },
         date: {
           empty: "You need to select a date",
           startAfterEnd: "Start date must be before end date.",
@@ -123,10 +129,91 @@
         azure: {
           empty: "You need to provide an Azure URL",
           patternInvalid: "The URL has an invalid format. It needs to end with '.blob.core.windows.net'"
+        },
+        versionNumbers: {
+          patternInvalid: "The version is invalid"
+        },
+        availabilityFlag: {
+          patternInvalid: "The Availability flag has an invalid format.",
+          empty: "You need to specify the availability flag"
+        },
+        kerberosPrincipal : {
+          empty :"You need to provide the Kerberos Principal",
+          patternInvalid : "The Kerberos Principal has an invalid format."
+        },
+        metastoreUri : {
+          empty : "You need to provide the Metastore URI",
+          patternInvalid : "The Metastore URI has an invalid format"
+        },
+        partitions : {
+          patternInvalid : "The Partitions have an invalid format"
+        },
+        partitionExpression : {
+          patternInvalid : "The Partition expression has an invalid format"
+        },
+        interfaceEndpoints : {
+            empty : "You need to provide a endpoint URL",
+            patternInvalid : "The Enpoint URL has an invalid format"
+        },
+        dbManager : {
+            empty : "You need to select Database Manager"
+        },
+        driver : {
+            empty : "You need to select Driver",
+            clazz : {
+              empty : 'You need to provide a Driver class'
+            },
+            jar : {
+              empty : 'You need to provide a Driver jar'
+            }
+        },
+        host : {
+            empty : "You need to provide host"
+        },
+        port : {
+            empty : "You need to provide port"
+        },
+        credential : {
+            empty : "You need to provide a credential type"
+        },
+        userName : {
+            empty : "You need to provide user name"
+        },
+        dbPassword : {
+            empty : "You need to provide password"
+        },
+        passwordFile : {
+            empty : "You need to provide password file",
+            patternInvalid : "The password file has an invalid format"
+        },
+        passwordAlias : {
+            empty : "You need to provide password alias",
+            patternInvalid : "The password alias has an invalid format"
+        },
+        providerPath : {
+          empty : "You need to provide provider path",
+        },
+        connectionString : {
+          empty : "You need to provide a connection string"
+        },
+        overrideMapReduceHome : {
+          empty : "You need to provide map reduce home"
+        },
+        parameterFile : {
+          empty : "You need to provide parameter file"
+        },
+        directoryPath : {
+          patternInvalid : "The directory path has an invalid format"
+      },
+        frequency : {
+          minimum : "You need to provide a minimum frequency of 5 minutes."
         }
       },
       checkPatterns = {
-        name: new RegExp("^[a-zA-Z0-9-_]{1,60}$"),
+        name: new RegExp("^[a-zA-Z][\\-a-zA-Z0-9]{1,39}$"),
+        inputName: new RegExp("^[a-zA-Z][\\-a-zA-Z0-9]{1,59}$"),
+        workflowName: new RegExp("^[a-zA-Z][\\-a-zA-Z0-9]{1,155}$"),
+        propertyName: new RegExp("^[a-zA-Z_]\\w*(\\.[a-zA-Z_]\\w*)*$"),
         id: new RegExp("^(([a-zA-Z]([\\-a-zA-Z0-9_])*){1,39})$"),
         password: new RegExp("^(([a-zA-Z]([\\-a-zA-Z0-9])*){1,39})$"),
         freeText: new RegExp("^([\\sa-zA-Z0-9]){1,40}$"),
@@ -135,15 +222,22 @@
         commaSeparated: new RegExp("^[a-zA-Z0-9,]{1,80}$"),
         unixId: new RegExp("^([a-zA-Z_][a-zA-Z0-9-_\\.\\-]{0,30})$"),
         unixPermissions: new RegExp("^((([x0-7]){1,5})|(\\*))$"),
-        osPath: new RegExp("^[^\\0 ]+$"),
+        osPath: new RegExp("^[^\\0]+$"),
+        path: new RegExp("^[\\/]{0,1}([^\\/]+[\\/])*([^\\/]*)$"),
+        interfaceEndpoints : new RegExp("^((http(s)?|hftp|hdfs|tcp|thrift|webhdfs):\/{2})?(([a-zA-Z0-9-._]+)|([0-9](\\.[0-9]{3})))(:[0-9]+)?((\\/[^\\?#\\s]+)?(\\?[^#\\s]+)?(\\#.+)?)?$"),
         twoDigits: new RegExp("^([0-9]){1,4}$"), //>> requirement change to 4 digits, just to dont change all inputs that reference this
         tableUri: new RegExp("^[^\\0]+$"),
-        versionNumbers: new RegExp("^[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}$"),
+        versionNumbers: new RegExp("^[0-9.]+$"),
         url: new RegExp("^[^\\0 ]+\\.[a-zA-Z0-9]{1,3}$"),
         number: new RegExp("^([-0-9]){1,40}$"),
         email: new RegExp("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$"),
         s3: new RegExp("^s3[a-zA-Z0-9._%+-:\\/]+\\.amazonaws.com$"),
-        azure: new RegExp("^[a-zA-Z0-9._%+-:@\\/]+\\.blob.core.windows.net$")
+        azure: new RegExp("^[a-zA-Z0-9._%+-:@\\/]+\\.blob.core.windows.net$"),
+        kerberosPrincipal : new RegExp("^hive\\/+[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$"),
+        metastoreUri : new RegExp("^thrift:\/{2}[a-zA-Z0-9._-]+:[0-9]"),
+        hiveTables: new RegExp("^([\\sa-zA-Z0-9,_-]){1,100}$"),
+        hiveDatabase: new RegExp("^([\\sa-zA-Z0-9_-]){1,100}$"),
+        hiveDatabases: new RegExp("^([\\sa-zA-Z0-9,_-]){1,100}$")
       };
 
     function acceptOnlyNumber(evt) {
@@ -179,19 +273,23 @@
       }
     }
 
+    function checkMininum(value){
+      if(parseInt(value) < 5){
+        return false;
+      }else{
+        return true;
+      }
+    };
+
     return {
       messages: checkMessages,
       patterns: checkPatterns,
       nameAvailable: true,
       displayValidations: {show: false, nameShow: false},
       acceptOnlyNumber: acceptOnlyNumber,
-      acceptNoSpaces: acceptNoSpaces
+      acceptNoSpaces: acceptNoSpaces,
+      checkMininum : checkMininum
     };
 
   }]);
 }());
-
-
-
-
-
diff --git a/falcon-ui/app/js/services/common/xml-to-json-service.js b/falcon-ui/app/js/services/common/xml-to-json-service.js
index d054e89..a886aad 100644
--- a/falcon-ui/app/js/services/common/xml-to-json-service.js
+++ b/falcon-ui/app/js/services/common/xml-to-json-service.js
@@ -72,6 +72,15 @@
         });
 
         return formatted;
+      },
+
+      isValidXml: function(xml){
+        try {
+          this.xml_str2json(xml);
+          return true;
+        } catch (err) {
+          return false;
+        }
       }
     };
 
diff --git a/falcon-ui/app/js/services/entity/entity-details.js b/falcon-ui/app/js/services/entity/entity-details.js
new file mode 100644
index 0000000..831610c
--- /dev/null
+++ b/falcon-ui/app/js/services/entity/entity-details.js
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+  'use strict';
+  var module = angular.module('app.services.entity.details', []);
+
+  module.factory('EntityDetails', ['Falcon','$q','X2jsService', 'EntityModel', function(Falcon, $q, X2jsService, EntityModel){
+
+    var entityDetails = {};
+
+    entityDetails.getEntityDetails = function(name, type){
+      Falcon.logRequest();
+      var entityDetailsPromise = Falcon.getEntityDefinition(type, name);
+      var entityStatusPromise = Falcon.getEntityStatus(type, name);
+      return $q.all([entityDetailsPromise,entityStatusPromise]).then(function(responses){
+            Falcon.logResponse('success', responses[0].data, false, true);
+            Falcon.logResponse('success', responses[1].data, false, true);
+            var entityModel = X2jsService.xml_str2json(responses[0].data);
+            EntityModel.type = type;
+            EntityModel.name = name;
+            var status = responses[1].data.message;
+            EntityModel.status = status.substr(status.indexOf("/") + 1, status.length - 1).trim();
+            EntityModel.model = entityModel;
+            return EntityModel;
+      },function(err){
+            Falcon.logResponse('error', err, type);
+      });
+    };
+
+    entityDetails.getEntityDefinition  = function(type, name){
+      var deferred = $q.defer();
+      type = type.toLowerCase(); //new sandbox returns uppercase type
+      Falcon.logRequest();
+      Falcon.getEntityDefinition(type, name)
+        .success(function (data) {
+            Falcon.logResponse('success', data, false, true);
+            EntityModel.type = type;
+            EntityModel.name = name;
+            deferred.resolve(X2jsService.xml_str2json(data));
+        })
+        .error(function (err) {
+            Falcon.logResponse('error', err, false, true);
+            deferred.reject(err);
+        });
+      return deferred.promise;
+    };
+    return entityDetails;
+  }]);
+})();
diff --git a/falcon-ui/app/js/services/entity/entity-factory.js b/falcon-ui/app/js/services/entity/entity-factory.js
index 82848c0..c8f1707 100644
--- a/falcon-ui/app/js/services/entity/entity-factory.js
+++ b/falcon-ui/app/js/services/entity/entity-factory.js
@@ -51,14 +51,22 @@
         return new Location(type, path);
       },
 
-      newCluster: function (type, selected) {
-        return new Cluster(type, selected);
+      newCluster: function (type, selected, name, partition) {
+        return new Cluster(type, selected, name, partition);
+      },
+
+      newPartition: function (name) {
+        return new Partition(name);
       },
 
       newEntry: function (key, value) {
         return new Entry(key, value);
       },
 
+      newProperty: function (name, value) {
+        return new Property(name, value);
+      },
+
       newProcess: function () {
         return new Process();
       },
@@ -71,12 +79,53 @@
         return new Output();
       },
 
+      newClusterEntity: function() {
+        return new ClusterEntity();
+      },
+
+      newClusterLocation: function(name, path) {
+        return new ClusterLocation(name, path);
+      },
+
+      newClusterInterface: function(type, endpoint, version) {
+        return new ClusterInterface(type, endpoint, version);
+      },
+
+      newSnapshot: function() {
+        return new Snapshot();
+      },
+
+      newSparkAttributes: function() {
+        return new SparkAttributes();
+      },
+
+      newCredential: function() {
+        return new Credential();
+      },
+
+      newDatasourceInterface: function() {
+        return new DatasourceInterface();
+      },
+
+      newDatasource: function() {
+        return new Datasource();
+      },
+
+      newClusterFileSystem: function() {
+        return new clusterFileSystem();
+      },
+
       newEntity: function (type) {
         if (type === 'feed') {
           return this.newFeed();
-        }
-        if (type === 'process') {
+        } else if (type === 'process') {
           return this.newProcess();
+        } else if (type === 'cluster') {
+          return this.newClusterEntity();
+        } else if (type === 'snapshot') {
+          return this.newSnapshot();
+        } else if (type === 'datasource') {
+          return this.newDatasource();
         }
       }
 
@@ -91,14 +140,19 @@
     this.tags = [new Entry(null, null)];
     this.ACL = new ACL();
     this.schema = new Schema();
-    this.frequency = new Frequency(null, 'hours');
+    this.frequency = new Frequency(1, 'hours');
     this.lateArrival = new LateArrival();
-    this.availabilityFlag = null;
+    this.availabilityFlag = '_success';
     this.properties = feedProperties();
     this.customProperties = [new Entry(null, null)];
     this.storage = new Storage();
-    this.clusters = [new Cluster('source', true)];
-    this.timezone = "";
+    this.clusters = [];
+    this.timezone = 'UTC';
+    this.partitions = [];
+    this.retentionFrequency = new Frequency(20, 'minutes');
+    this.validity = new Validity();
+    this.enableFeedReplication = false;
+    this.dataTransferType = '';
   }
 
 
@@ -109,15 +163,14 @@
   }
 
   function Schema() {
-    this.location = undefined;
-    this.provider = undefined;
+    this.location = '/none';
+    this.provider = '/none';
   }
 
   function feedProperties() {
     return [
-      new Entry('queueName', ''),
-      new Entry('jobPriority', ''),
-      new Entry('timeout', ''),
+      new Entry('queueName', 'default'),
+      new Entry('jobPriority', 'NORMAL'),
       new Entry('parallel', ''),
       new Entry('maxMaps', ''),
       new Entry('mapBandwidthKB', '')
@@ -138,8 +191,8 @@
   }
 
   function LateArrival() {
-    this.active = false;
-    this.cutOff = new Frequency(null, 'hours');
+    this.active = true;
+    this.cutOff = new Frequency(4, 'hours');
   }
 
   function Frequency(quantity, unit) {
@@ -156,13 +209,15 @@
     this.fileSystem = new FileSystem();
     this.catalog = new Catalog();
   }
-  function clusterStorage() {
-    this.fileSystem = new clusterFileSystem();
-    this.catalog = new Catalog();
+  function clusterStorage(type) {
+    if(type === 'hdfs'){
+      this.fileSystem = new clusterFileSystem();
+    }else if(type === 'hive'){
+      this.catalog = new Catalog();
+    }
   }
 
   function Catalog() {
-    this.active = false;
     this.catalogTable = new CatalogTable();
   }
 
@@ -172,12 +227,10 @@
   }
 
   function FileSystem() {
-    this.active = true;
-    this.locations = [new Location('data','/'), new Location('stats','/'), new Location('meta','/')];
+    this.locations = null;
   }
   function clusterFileSystem() {
-    this.active = false;
-    this.locations = [ new Location('data',''), new Location('stats',''), new Location('meta','') ];
+    this.locations = [ new Location('data',''), new Location('stats','/')];
   }
 
   function Location(type, path) {
@@ -186,20 +239,36 @@
     this.focused = false;
   }
 
-  function Cluster(type, selected) {
+  function Cluster(type, selected, name, partition) {
 //    this.name = null;
-	  this.name = "";
+    this.name = (name != undefined) ? name : "";
     this.type = type;
     this.selected = selected;
-    this.retention = new Frequency(null, 'hours');
+    if (type == 'source') {
+      this.retention = new Frequency(90, 'days');
+    } else if (type == 'target') {
+      this.retention = new Frequency(12, 'months');
+    } else {
+      this.retention = new Frequency(null, 'hours');
+    }
+
     this.retention.action = 'delete';
     this.validity = new Validity();
-    this.storage = new clusterStorage();
+    this.storage = new clusterStorage(selected);
+    if (partition != undefined) {
+      this.partition = partition;
+    }
+  }
+
+  function Partition(name) {
+    this.name = name;
   }
 
   function Validity() {
     this.start = new DateAndTime();
     this.end = new DateAndTime();
+    this.end.date = new Date("Dec 31, 2099 11:59:59");
+    this.end.time = new Date("Dec 31, 2099 11:59:59");
     this.timezone = "";
   }
 
@@ -222,15 +291,17 @@
     this.name = null;
     this.tags = [new Entry(null, null)];
     this.workflow = new Workflow();
-    this.timezone = "";
-    this.frequency = new Frequency(null, 'hours');
+    this.timezone = 'UTC';
+    this.frequency = new Frequency(30, 'minutes');
     this.parallel = 1;
-    this.order = "";
-    this.retry = new Retry();
+    this.order = 'FIFO';
+    this.retry = new ProcessRetry();
     this.clusters = [new Cluster('source', true)];
     this.inputs = [];
     this.outputs = [];
     this.ACL = new ACL();
+    this.properties = [new Property(null, null)];
+    this.validity = new Validity();
 
     /*
     this.name = 'P';
@@ -245,17 +316,34 @@
     */
   }
 
+  function SparkAttributes() {
+    this.name = '';
+    this.master = 'yarn';
+    this.mode = 'cluster';
+    this.class = '';
+    this.sparkOptions = '';
+    this.jar = '';
+    this.arg = '';
+  }
+
   function Workflow() {
-    this.name = "";
-    this.engine = "";
+    this.name = '';
+    this.engine = '';
     this.version = '';
     this.path = '/';
+    this.spark = new SparkAttributes();
   }
 
   function Retry() {
-    this.policy = '';
-    this.attempts = null;
-    this.delay = new Frequency(null, '');
+    this.policy = 'exp-backoff';
+    this.attempts = 3;
+    this.delay = new Frequency(30, 'minutes');
+  }
+
+  function ProcessRetry() {
+    this.policy = 'periodic';
+    this.attempts = 3;
+    this.delay = new Frequency(30, 'minutes');
   }
 
   function Input() {
@@ -268,7 +356,115 @@
   function Output() {
     this.name = null;
     this.feed = "";
-    this.outputInstance = null;
+    this.outputInstance = 'now(0,0)';
   }
 
-})();
\ No newline at end of file
+  function ClusterEntity() {
+    this.name = "";
+    this.colo = null;
+    this.description = null;
+    this.tags = [new Entry(null, null)];
+    this.ACL = new ACL();
+
+    this.interfaces = [];
+    this.properties = [];
+    this.locations = []
+  }
+
+  function ClusterLocation(name, path) {
+    this.name = name;
+    this.path= path;
+  }
+
+  function ClusterInterface(type, endpoint, version) {
+    this.type = type;
+    this.endpoint = endpoint;
+    this.version = version;
+  }
+
+  function SnapshotCluster(type) {
+    this.cluster = '';
+    this.directoryPath = '';
+    if (type === 'source') {
+      this.deleteFrequency = new Frequency(14, 'days');
+      this.retentionNumber = 90;
+    } else if (type === 'target') {
+      this.deleteFrequency = new Frequency(14, 'days');
+      this.retentionNumber = 90;
+    }
+  }
+
+  function Snapshot() {
+    this.name = '';
+    this.type = 'snapshot';
+    this.ACL = new ACL();
+    this.tags = [new Entry(null,  null)];
+    this.frequency = new Frequency(1, 'days');
+    this.alerts = [];
+    this.validity = new Validity();
+    this.validity.timezone = 'UTC';
+    this.runOn = 'target';
+    this.retry = new Retry();
+    this.source = new SnapshotCluster('source');
+    this.target = new SnapshotCluster('target');
+    this.allocation = {};
+    this.tdeEncryptionEnabled = false;
+  }
+
+  function Credential() {
+    this.type = "";
+    this.userName = ""
+    this.passwordText = "";
+    this.passwordFile = "";
+    this.passwordAlias = "";
+    this.providerPath = "";
+  }
+
+  function DatasourceInterface() {
+    this.type = "readonly";
+    this.endpoint = "";
+    this.credential = new Credential();
+  }
+
+  function DatasourceInterfaces() {
+    this.credential = new Credential();
+    this.interfaces = [new DatasourceInterface()];
+  }
+
+  function Driver() {
+    this.clazz = null;
+    this.jar = [{value:""}];
+  }
+
+  function Property(name, value) {
+    this.name = name;
+    this.value = value;
+  }
+
+  function datasourceProperties() {
+    return [
+      new Property('parameterFile', ''),
+      new Property('verboseMode', ''),
+      new Property('directMode', '')
+    ];
+  }
+
+  function Datasource() {
+    this.name = "";
+    this.colo = null;
+    this.description = null;
+    this.tags = [new Entry(null, null)];
+    this.type = "";
+    this.customProperties = [];
+    this.properties = new datasourceProperties();
+    this.parameters = [];
+    this.ACL = new ACL();
+    this.interfaces = new DatasourceInterfaces();
+    this.host = "";
+    this.port = "";
+    this.databaseName = "";
+    this.driver = new Driver();
+  }
+
+
+})();
diff --git a/falcon-ui/app/js/services/entity/entity-model.js b/falcon-ui/app/js/services/entity/entity-model.js
index 48fa617..a8a66d7 100644
--- a/falcon-ui/app/js/services/entity/entity-model.js
+++ b/falcon-ui/app/js/services/entity/entity-model.js
@@ -21,15 +21,20 @@
 
   module.factory('EntityModel', ["X2jsService", "$cookieStore", function(X2jsService, $cookieStore) {
 
-    var EntityModel = {}, userName;
+    var EntityModel = {};
 
     EntityModel.json = null;
     EntityModel.detailsPageModel = null;
 
+    EntityModel.getUserNameFromCookie = function() {
+      return $cookieStore.get('userToken')?$cookieStore.get('userToken').user:"";
+    };
+
     EntityModel.identifyType = function(json) {
       if(json && json.feed) { EntityModel.type = "feed"; }
       else if(json && json.cluster) { EntityModel.type = "cluster"; }
       else if(json && json.process) { EntityModel.type = "process"; }
+      else if(json && json.datasource) { EntityModel.type = "datasource"; }
       else { EntityModel.type = 'Type not recognized'; }
     };
 
@@ -38,11 +43,6 @@
       return EntityModel.identifyType(EntityModel.json);
     };
 
-    if($cookieStore.get('userToken')){
-      userName = $cookieStore.get('userToken').user;
-    } else {
-      userName = "";
-    }
 
     EntityModel.defaultValues = {
       cluster: {
@@ -52,45 +52,50 @@
             interface:[
               {
                 _type:"readonly",
-                _endpoint:"hftp://sandbox.hortonworks.com:50070",
+                _endpoint:"hftp://<hostname>:50070",
                 _version:"2.2.0"
               },
               {
                 _type:"write",
-                _endpoint:"hdfs://sandbox.hortonworks.com:8020",
+                _endpoint:"hdfs://<hostname>:8020",
                 _version:"2.2.0"
 
               },
               {
                 _type:"execute",
-                _endpoint:"sandbox.hortonworks.com:8050",
+                _endpoint:"<hostname>:8050",
                 _version:"2.2.0"
 
               },
               {
                 _type:"workflow",
-                _endpoint:"http://sandbox.hortonworks.com:11000/oozie/",
+                _endpoint:"http://<hostname>:11000/oozie/",
                 _version:"4.0.0"
 
               },
               {
                 _type:"messaging",
-                _endpoint:"tcp://sandbox.hortonworks.com:61616?daemon=true",
+                _endpoint:"tcp://<hostname>:61616?daemon=true",
                 _version:"5.1.6"
 
+              },
+              {
+                _type:"registry",
+                _endpoint:"thrift://<hostname>:9083",
+                _version:"0.11.0"
+
               }
             ]
           },
           locations:{
             location:[
               {_name: "staging", _path: ""},
-              {_name: "temp", _path: ""},
-              {_name: "working", _path: ""},
-              {"_name":"","_path":""} //>> to compare
+              {_name: "temp", _path: "/tmp"},
+              {_name: "working", _path: ""}
             ]
           },
           ACL: {
-            _owner: userName,
+            _owner: EntityModel.getUserNameFromCookie(),
             _group: "users",
             _permission: "0x755"
           },
@@ -107,13 +112,10 @@
       },
       MirrorUIModel: {
         name: undefined,
-        tags: {
-          newTag: { value:"", key:"" },
-          tagsArray: [{ key:"_falcon_mirroring_type", value:"HDFS" }],
-          tagsString: ""
-        },
-        formType: "HDFS",
+        tags: [{ value:"", key:"" }],
+        type: "HDFS",
         runOn: "target",
+        tdeEncryptionEnabled: true,
         source: {
           location: "HDFS",
           cluster: "",
@@ -121,42 +123,43 @@
           path: "",
           hiveDatabaseType: "databases",
           hiveDatabases: "",
-          hiveDatabase: "",
-          hiveTables: ""
+          hiveTables: "",
+          hiveMetastoreUri : "thrift://localhost:9083",
+          hive2KerberosPrincipal : "hive/_HOST@EXAMPLE.COM",
+          hiveMetastoreKerberosPrincipal : "hive/_HOST@EXAMPLE.COM"
         },
         target: {
           location: "HDFS",
           cluster: "",
           url: "",
-          path: ""
+          path: "",
+          hive2KerberosPrincipal : "hive/_HOST@EXAMPLE.COM",
+          hiveMetastoreUri : "thrift://localhost:9083",
+          hiveMetastoreKerberosPrincipal : "hive/_HOST@EXAMPLE.COM"
         },
-        alerts: {
-          alert: { email: "" },
-          alertsArray: []
-        },
+        alerts: [],
         validity: {
-          start: (function () { var d = new Date(); d.setHours(0); d.setMinutes(0); d.setSeconds(0); return d; }()),
-          startTime: new Date(),
-          end: "",
-          endTime: new Date(),
-          tz: "GMT+00:00",
+          start: {date: (function () { var d = new Date(); d.setHours(0); d.setMinutes(0); d.setSeconds(0); return d; }()),
+                  time: new Date()},
+          end: {date: new Date("Dec 31, 2099 11:59:59"), time: new Date("Dec 31, 2099 11:59:59")},
+          timezone: "UTC",
           startISO: "",
           endISO: ""
         },
         frequency: {
-          number: 5,
-          unit: 'minutes'
+          quantity: 1,
+          unit: 'days'
         },
         allocation: {
           hdfs:{
-            maxMaps: "5",
-            maxBandwidth: "100"
+            distcpMaxMaps: "5",
+            distcpMapBandwidth: "100"
           },
           hive:{
-            maxMapsDistcp: "1",
-            maxMapsMirror: "5",
-            maxMapsEvents: "-1",
-            maxBandwidth: "100"
+            distcpMaxMaps: "1",
+            replicationMaxMaps: "5",
+            maxEvents: "-1",
+            distcpMapBandwidth: "100"
           }
         },
         hiveOptions: {
@@ -173,14 +176,14 @@
           policy:"periodic",
           delay: {
             unit: "minutes",
-            number: 30
+            quantity: 30
           },
           attempts: 3
         },
-        acl: {
-          owner: userName,
+        ACL: {
+          owner: EntityModel.getUserNameFromCookie(),
           group: "users",
-          permissions: "0x755"
+          permission: "0x755"
         }
       }
     };
@@ -191,7 +194,7 @@
         tags: "",
         groups: "",
         frequency: "",
-        /*timezone: "GMT+00:00",*/
+        /*timezone: "UTC",*/
         "late-arrival": {
           "_cut-off": ""
         },
@@ -222,7 +225,7 @@
           }]
         },
         ACL: {
-          _owner: userName,
+          _owner: EntityModel.getUserNameFromCookie(),
           _group: "users",
           _permission: "0x755"
         },
@@ -241,7 +244,7 @@
       UIModel: {},
       HDFS: {
         process: {
-          tags: "",
+          tags: [{ value:"", key:"" }],
           clusters: {
             cluster: [{
               validity: {
@@ -253,7 +256,7 @@
           },
           parallel: "1",
           order: "LAST_ONLY",
-          frequency: "minutes(5)",
+          frequency: "days(1)",
           timezone: "UTC",
           properties: {
             property: [
@@ -296,13 +299,16 @@
               {
                 _name: "sourceCluster",
                 _value: ""
+              }, {
+                _name: "tdeEncryptionEnabled",
+                _value: "true"
               }
             ]
           },
           workflow: {
             _name: "hdfs-dr-workflow",
             _engine: "oozie",
-            _path: "/apps/data-mirroring/workflows/hdfs-replication-workflow.xml",
+            _path: "/apps/falcon/extensions/hdfs-mirroring/resources/runtime/hdfs-mirroring-workflow.xml",
             _lib: ""
           },
           retry: {
@@ -321,7 +327,7 @@
       },
       HIVE: {
         process: {
-          tags: "",
+          tags: [{ value:"", key:"" }],
           clusters: {
             cluster: [{
               validity: {
@@ -333,7 +339,7 @@
           },
           parallel: "1",
           order: "LAST_ONLY",
-          frequency: "minutes(3)",
+          frequency: "days(1)",
           timezone: "UTC",
           properties: {
             property: [
@@ -391,11 +397,27 @@
               },
               {
                 _name: "targetMetastoreUri",
-                _value: "thrift://240.0.0.11:9083"
+                _value: "thrift://localhost:9083"
               },
               {
                 _name: "sourceMetastoreUri",
-                _value: "thrift://240.0.0.10:9083"
+                _value: "thrift://localhost:9083"
+              },
+              {
+                _name: "targetHiveMetastoreKerberosPrincipal",
+                _value: "hive/_HOST@EXAMPLE.COM"
+              },
+              {
+                _name: "sourceHiveMetastoreKerberosPrincipal",
+                _value: "hive/_HOST@EXAMPLE.COM"
+              },
+              {
+                _name: "targetHive2KerberosPrincipal",
+                _value: "hive/_HOST@EXAMPLE.COM"
+              },
+              {
+                _name: "sourceHive2KerberosPrincipal",
+                _value: "hive/_HOST@EXAMPLE.COM"
               },
               {
                 _name: "sourceTable",
@@ -428,13 +450,16 @@
               {
                 _name: "drNotificationReceivers",
                 _value: "NA"
+              }, {
+                _name: "tdeEncryptionEnabled",
+                _value: "true"
               }
             ]
           },
           workflow: {
             _name: "falcon-dr-hive-workflow",
             _engine: "oozie",
-            _path: "/apps/data-mirroring/workflows/hive-disaster-recovery-workflow.xml",
+            _path: "/apps/falcon/extensions/hive-mirroring/resources/runtime/hive-mirroring-workflow.xml",
             _lib: ""
           },
           retry: {
diff --git a/falcon-ui/app/js/services/entity/entity-scheduler.js b/falcon-ui/app/js/services/entity/entity-scheduler.js
new file mode 100644
index 0000000..cbc544d
--- /dev/null
+++ b/falcon-ui/app/js/services/entity/entity-scheduler.js
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+  'use strict';
+
+  var entityScheduler = angular.module("app.services.entity.scheduler",['app.services.falcon']);
+  entityScheduler.factory('EntityScheduler',["$window", "$q", "Falcon", "EncodeService", "X2jsService", function($window, $q, Falcon, encodeService, X2jsService){
+    var entityScheduler = {};
+    var entityStatus = {
+      RUNNING : "RUNNING",
+      SUBMITTED : "SUBMITTED",
+      SUSPENDED : "SUSPENDED",
+      DELETED : "DELETED",
+      FAILED : "FAILED"
+    };
+
+    entityScheduler.resumeEntity = function (type, name) {
+      var deferred = $q.defer();
+      type = type.toLowerCase();
+      Falcon.logRequest();
+      Falcon.postResumeEntity(type, name).success(function (data) {
+        Falcon.logResponse('success', data, type);
+        deferred.resolve(entityStatus.RUNNING);
+      })
+      .error(function (err) {
+        Falcon.logResponse('error', err, type);
+        deferred.resolve(entityStatus.SUSPENDED);
+      });
+      return deferred.promise;
+    };
+
+    entityScheduler.scheduleEntity = function (type, name) {
+      var deferred = $q.defer();
+      type = type.toLowerCase();
+      Falcon.logRequest();
+      Falcon.postScheduleEntity(type, name).success(function (data) {
+        Falcon.logResponse('success', data, type);
+        deferred.resolve(entityStatus.RUNNING);
+      })
+      .error(function (err) {
+        Falcon.logResponse('error', err, type);
+        deferred.resolve(entityStatus.SUBMITTED);
+      });
+      return deferred.promise;
+    };
+
+    entityScheduler.suspendEntity = function (type, name) {
+      var deferred = $q.defer();
+      Falcon.logRequest();
+      type = type.toLowerCase();
+      Falcon.postSuspendEntity(type, name)
+        .success(function (message) {
+          Falcon.logResponse('success', message, type);
+          deferred.resolve(entityStatus.SUSPENDED);
+        })
+        .error(function (err) {
+          Falcon.logResponse('error', err, type);
+          deferred.resolve(entityStatus.RUNNING);
+        });
+        return deferred.promise;
+    };
+
+    entityScheduler.deleteEntity = function (type, name) {
+      type = type.toLowerCase(); //new sandbox returns uppercase type
+      var deferred = $q.defer();
+      Falcon.logRequest();
+      Falcon.deleteEntity(type, name)
+        .success(function (data) {
+          Falcon.logResponse('success', data, type);
+          deferred.resolve(entityStatus.DELETED);
+        })
+        .error(function (err) {
+          Falcon.logResponse('error', err, type);
+          deferred.resolve(entityStatus.FAILED);
+        });
+        return deferred.promise;
+    };
+
+    entityScheduler.getEntityDefinition  = function(type, name){
+      var deferred = $q.defer();
+      type = type.toLowerCase(); //new sandbox returns uppercase type
+      Falcon.logRequest();
+      Falcon.getEntityDefinition(type, name)
+        .success(function (data) {
+            Falcon.logResponse('success', data, false, true);
+            deferred.resolve(X2jsService.xml_str2json(data));
+        })
+        .error(function (err) {
+            Falcon.logResponse('error', err, false, true);
+            deferred.reject(entityStatus.FAILED);
+        });
+      return deferred.promise;
+    };
+
+    entityScheduler.downloadEntity = function (type, name) {
+      type = type.toLowerCase();
+      Falcon.logRequest();
+      Falcon.getEntityDefinition(type, name) .success(function (data) {
+        Falcon.logResponse('success', data, false, true);
+        $window.location.href = 'data:application/octet-stream,' + encodeService.encode(data);
+      }).error(function (err) {
+        Falcon.logResponse('error', err, false);
+      });
+    };
+    return entityScheduler;
+  }]);
+})();
diff --git a/falcon-ui/app/js/services/entity/entity-serializer.js b/falcon-ui/app/js/services/entity/entity-serializer.js
index 284c30f..327a311 100644
--- a/falcon-ui/app/js/services/entity/entity-serializer.js
+++ b/falcon-ui/app/js/services/entity/entity-serializer.js
@@ -38,8 +38,7 @@
         return DateHelper.importDate(input, feedTz);
       }
       function timeAndDateToStringProcess(input) {
-        //return DateHelper.createISO(input.date, input.time, processTz);
-        return DateHelper.createISOString(input.date, input.time);
+        return DateHelper.createISO(input.date, input.time, processTz);
       }
       function importDateProcess (input) {
         return DateHelper.importDate(input, processTz);
@@ -47,19 +46,24 @@
 
 
     return {
-      preSerialize: function(feed, type) {
+      preSerialize: function(entity, type) {
         if(type === 'feed') {
-          if(feed.properties) {
-            feed.allproperties = feed.properties.concat(feed.customProperties);
+          if(entity.properties) {
+            entity.allproperties = entity.properties.concat(entity.customProperties);
           }
-          return preSerializeFeed(feed, JsonTransformerFactory);
+          return preSerializeFeed(entity, JsonTransformerFactory);
         } else if(type === 'process') {
-          return preSerializeProcess(feed, JsonTransformerFactory);
+          return preSerializeProcess(entity, JsonTransformerFactory);
+        } else if(type === 'datasource') {
+          if(entity.properties) {
+            entity.allProperties = entity.properties.concat(entity.customProperties);
+          }
+          return preSerializeDatasource(entity, JsonTransformerFactory);
         }
       },
 
-      serialize: function(feed, type) {
-        return X2jsService.json2xml_str(this.preSerialize(feed, type));
+      serialize: function(entity, type) {
+        return X2jsService.json2xml_str(this.preSerialize(entity, type));
       },
 
       preDeserialize: function(entityModel, type) {
@@ -67,6 +71,10 @@
           return preDeserializeFeed(entityModel, JsonTransformerFactory);
         } else if(type === 'process') {
           return preDeserializeProcess(entityModel, JsonTransformerFactory);
+        } else if(type === 'cluster') {
+          return preDeserializeCluster(entityModel, JsonTransformerFactory);
+        }  else if(type === 'datasource') {
+          return preDeserializeDatasource(entityModel, JsonTransformerFactory);
         }
       },
 
@@ -89,6 +97,11 @@
         return input && input.value;
       }
 
+      function emptyProperty (property) {
+        return property && property.name && property.name !== ''
+          && property.value && property.value !== '';
+      }
+
       function emptyFrequency (input) {
         return input.value.unit ? input.value.quantity : input.value;
       }
@@ -124,39 +137,141 @@
           .transform('type', '_type')
           .transform('path', '_path');
 
+        var partitionTransform = transformerFactory
+          .transform('name', '_name');
+
         var clusterTransform = transformerFactory
-          .transform('name', '_name')
-          .transform('type', '_type')
-          .transform('validity.start', 'validity._start', (function () { feedTz = feed.timezone; return timeAndDateToStringFeed; }()))
-          .transform('validity.end', 'validity._end', timeAndDateToStringFeed)
-          .transform('retention', 'retention._limit', frequencyToString)
-          .transform('retention.action', 'retention._action')
-          .transform('storage.fileSystem', 'locations.location', function(fileSystem) {
-            return feed.storage.fileSystem.active ? transformfileSystem(fileSystem) : null;
+          .transform('cluster.name', '_name')
+          .transform('cluster.type', '_type')
+          .transform('cluster.partition', '_partition')
+          .transform('cluster.validity.start', 'validity._start', (function () { feedTz = feed.timezone; return timeAndDateToStringFeed; }()))
+          .transform('cluster.validity.end', 'validity._end', timeAndDateToStringFeed)
+          .transform('cluster.retention', 'retention._limit', frequencyToString)
+          .transform('cluster.retention.action', 'retention._action')
+          .transform('cluster','import',function(cluster){
+            if(feed.dataTransferType === 'import' && feed.import){
+              return dataSourceTransformImport.apply(feed.import, {});
+            }
           })
-          .transform('storage.catalog', 'table', function(catalog) {
-            return feed.storage.catalog.active ? transformCatalog(catalog) : null;
-          });
+          .transform('cluster','export',function(cluster){
+            if(feed.dataTransferType === 'export' && feed.export){
+              return dataSourceTransformExport.apply(feed.export, {});
+            }
+          })
+          .transform('cluster', 'locations.location', function(cluster) {
+            if ((cluster.type === 'source' && feed.sourceClusterLocationType === 'hdfs')
+                || (cluster.type === 'target' && feed.targetClusterLocationType === 'hdfs')
+                || (feed.dataTransferType === 'import' && feed.targetClusterLocationType === 'hdfs')
+                || (feed.dataTransferType === 'export' && feed.sourceClusterLocationType === 'hdfs')
+              ) {
+                return transformfileSystem(cluster.storage.fileSystem);
+            }
+            return null;
+          })
+          .transform('cluster', 'table', function(cluster) {
+            if ((cluster.type === 'source' && feed.sourceClusterLocationType === 'hive')
+                || (cluster.type === 'target' && feed.targetClusterLocationType === 'hive')
+                || (feed.dataTransferType === 'import' && feed.targetClusterLocationType === 'hive')
+                || (feed.dataTransferType === 'export' && feed.sourceClusterLocationType === 'hive')
+              ) {
+                return transformCatalog(cluster.storage.catalog);
+            }
+            return null;
+          })
+          ;
+
+        var fieldTransform = transformerFactory
+            .transform('field', 'field');
+
+        var dataSourceTransformImport = transformerFactory
+            .transform('source.name','source._name')
+            .transform('source.tableName','source._tableName')
+            .transform('source.extract.type','source.extract._type')
+            .transform('source.extract.mergepolicy','source.extract.mergepolicy')
+            .transform('source','source.fields.includes.field',function(source){
+              if (source.columnsType === 'include' && source.fields.includes && source.fields.includes.length > 0) {
+                return source.fields.includes.map(function (field) {
+                  return fieldTransform.apply(field, field);
+                });
+              }
+              return null;
+            })
+            .transform('source','source.fields.excludes.field',function(source){
+              if(source.columnsType === 'exclude' && source.fields.excludes && source.fields.excludes.length > 0){
+                return source.fields.excludes.map(function (field) {
+                  return fieldTransform.apply(field, field);
+                });
+              }
+              return null;
+            })
+            ;
+
+          var dataSourceTransformExport = transformerFactory
+            .transform('target.name','target._name')
+            .transform('target.tableName','target._tableName')
+            .transform('target.load.type','target.load._type')
+            .transform('target','target.fields.includes.field',function(target){
+              if(target.columnsType === 'include' && target.fields.includes && target.fields.includes.length > 0){
+                return target.fields.includes.map(function (field) {
+                  return fieldTransform.apply(field, field);
+                });
+              }
+              return null;
+            })
+            .transform('target','target.fields.excludes.field',function(target){
+              if(target.columnsType === 'exclude' && target.fields.excludes && target.fields.excludes.length > 0){
+                return target.fields.excludes.map(function (field) {
+                  return fieldTransform.apply(field, field);
+                });
+              }
+              return null;
+            })
+            ;
 
         var transform = transformerFactory
           .transform('name', 'feed._name')
           .transform('description', 'feed._description')
           .transform('tags', 'feed.tags', keyValuePairs)
+          .transform('partitions', 'feed.partitions.partition', function(partitions) {
+            return partitions.length==0 ? null : partitions.map(function(partition) {
+              return partitionTransform.apply(partition, {});
+            });
+          })
           .transform('groups', 'feed.groups')
           .transform('availabilityFlag', 'feed.availabilityFlag')
           .transform('frequency', 'feed.frequency', frequencyToString)
           .transform('timezone', 'feed.timezone')
           .transform('lateArrival.cutOff', 'feed.late-arrival._cut-off', frequencyToString)
           .transform('clusters', 'feed.clusters.cluster', function(clusters) {
+            clusters = clusters.filter(function (cluster) {
+              return cluster.name;
+            });
+            if (!feed.enableFeedReplication) {
+              clusters = clusters.filter(function (cluster) {
+                return cluster.type == 'source';
+              });
+            }
             return clusters.map(function(cluster) {
-              return clusterTransform.apply(cluster, {});
+              return clusterTransform.apply({'cluster':cluster}, {});
             });
           })
           .transform('storage.fileSystem', 'feed.locations.location', function(fileSystem) {
-            return fileSystem.active ? transformfileSystem(fileSystem) : null;
+            if (feed.dataTransferType === 'hdfs'
+              || (feed.dataTransferType === 'import' && feed.targetClusterLocationType === 'hdfs')
+              || (feed.dataTransferType === 'export' && feed.sourceClusterLocationType === 'hdfs')
+              || (feed.dataTransferType === 'hive' && feed.sourceClusterLocationType === 'hdfs')) {
+                return transformfileSystem(fileSystem)
+            }
+            return null;
           })
           .transform('storage.catalog', 'feed.table', function(catalog) {
-            return catalog.active ? transformCatalog(catalog) : null;
+            if (feed.dataTransferType === 'hive'
+              || (feed.dataTransferType === 'import' && feed.targetClusterLocationType === 'hive')
+              || (feed.dataTransferType === 'export' && feed.sourceClusterLocationType === 'hive')
+              || (feed.dataTransferType === 'hdfs' && feed.sourceClusterLocationType === 'hive')) {
+                return transformCatalog(catalog);
+            }
+            return null;
           })
           .transform('ACL', 'feed.ACL', emptyElement)
           .transform('ACL.owner', 'feed.ACL._owner')
@@ -166,10 +281,13 @@
           .transform('schema.location', 'feed.schema._location')
           .transform('schema.provider', 'feed.schema._provider')
           .transform('allproperties', 'feed.properties.property', function(properties) {
-            return properties.filter(emptyValue).filter(emptyFrequency).map(function(property) {
+            properties = properties.filter(emptyValue);
+            return properties.length==0 ? null : properties.map(function(property) {
               return propertyTransform.apply(property, {});
             });
-          });
+          })
+          //.transform('retentionFrequency', 'feed.lifecycle.retention-stage.frequency', frequencyToString)
+          ;
 
         function transformfileSystem (fileSystem) {
           return fileSystem.locations.map(function(location) {
@@ -203,12 +321,42 @@
           .transform('feed', '_feed')
           .transform('outputInstance', '_instance');
 
+        var propertyTransform = transformerFactory
+          .transform('name', '_name')
+          .transform('value', '_value');
+
+        var sparkTransform = transformerFactory
+          .transform('spark', 'master', function(spark) {
+            if (spark.master === 'yarn') {
+              return spark.master + '-' + spark.mode;
+            } else {
+              return spark.master;
+            }
+          })
+          .transform('spark', 'mode', function(spark) {
+            if (spark.master && spark.master.indexOf('yarn') != '-1') {
+              return spark.mode;
+            } else {
+              return null;
+            }
+          })
+          .transform('spark.name', 'name')
+          .transform('spark.class', 'class')
+          .transform('spark.jar', 'jar')
+          .transform('spark.sparkOptions', 'spark-opts')
+          .transform('spark.arg', 'arg');
+
+        var workflowNameCheck = function(workflow) {
+          if (workflow.engine === 'spark') {
+            return null;
+          } else {
+            return workflow.name;
+          }
+        }
+
         var transform = transformerFactory
           .transform('name', 'process._name')
           .transform('tags', 'process.tags', keyValuePairs)
-
-
-
           .transform('clusters', 'process.clusters.cluster', function(clusters) {
             return clusters.map(function(cluster) {
               return clusterTransform.apply(cluster, {});
@@ -234,10 +382,25 @@
               return outputTransform.apply(output, {});
             });
           })
-          .transform('workflow.name', 'process.workflow._name')
+          .transform('properties', 'process.properties.property', function(properties) {
+            properties = properties.filter(emptyProperty);
+            if(properties.length === 0) {
+              return null;
+            } else {
+              return properties.map(function(property) {
+                return propertyTransform.apply(property, {});
+              });
+            }
+          })
+          .transform('workflow', 'process.workflow._name', workflowNameCheck)
           .transform('workflow.version', 'process.workflow._version')
           .transform('workflow.engine', 'process.workflow._engine')
           .transform('workflow.path', 'process.workflow._path')
+          .transform('workflow', 'process.spark-attributes', function(workflow) {
+            if (workflow.engine === 'spark') {
+              return sparkTransform.apply(workflow, {});
+            }
+          })
           .transform('retry.policy', 'process.retry._policy')
           .transform('retry.delay', 'process.retry._delay', frequencyToString)
           .transform('retry.attempts', 'process.retry._attempts')
@@ -251,31 +414,149 @@
 
       }
 
+      function preSerializeDatasource (datasource, transformerFactory) {
+        var credentialPasswordTextTransform = transformerFactory
+          .transform('type', '_type')
+          .transform('userName', 'userName')
+          .transform('passwordText', 'passwordText', function(value) {
+            return value;
+          });
+
+        var credentialPasswordFileTransform = transformerFactory
+          .transform('type', '_type')
+          .transform('userName', 'userName')
+          .transform('passwordFile', 'passwordFile');
+
+        var credentialPasswordAliasTransform = transformerFactory
+          .transform('type', '_type')
+          .transform('userName', 'userName')
+          .transform('passwordAlias', 'passwordAlias.alias')
+          .transform('providerPath', 'passwordAlias.providerPath');
+
+        var credentialTransform = function(credential)  {
+          if (credential.type == 'password-text') {
+            return credentialPasswordTextTransform.apply(credential, {});
+          } if (credential.type == 'password-file') {
+            return credentialPasswordFileTransform.apply(credential, {});
+          } if (credential.type == 'password-alias') {
+            return credentialPasswordAliasTransform.apply(credential, {});
+          } else {
+            return null;
+          }
+        };
+
+        var interfaceTransform = transformerFactory
+          .transform('type', '_type')
+          .transform('endpoint', '_endpoint')
+          .transform('credential.type', 'credential._type')
+          .transform('credential', 'credential', credentialTransform);
+
+        var propertyTransform = transformerFactory
+          .transform('name', '_name')
+          .transform('value', '_value', function(value) {
+            return value;
+          });
+        var driverJarsTransform = function(driverJars){
+          var filtered = driverJars.filter(function(jar){
+            return jar.value && jar.value.trim().length > 0;
+          });
+          if(filtered.length > 0){
+            return filtered.map(function(jar){
+              return jar.value;
+            });
+          }
+        };
+        var transform = transformerFactory
+          .transform('colo', 'datasource._colo')
+          .transform('description', 'datasource._description')
+          .transform('type', 'datasource._type')
+          .transform('name', 'datasource._name')
+          .transform('tags', 'datasource.tags', keyValuePairs)
+          .transform('interfaces', 'datasource.interfaces.interface', function(datasourceInterfaces) {
+            return datasourceInterfaces.interfaces.length==0 ? null
+              : datasourceInterfaces.interfaces.map(function(datasourceInterface) {
+                  return interfaceTransform.apply(datasourceInterface, {});
+                });
+          })
+          .transform('interfaces.credential', 'datasource.interfaces.credential', credentialTransform)
+          .transform('driver.clazz', 'datasource.driver.clazz')
+          .transform('driver.jar', 'datasource.driver.jar',driverJarsTransform)
+          .transform('allProperties', 'datasource.properties.property', function(properties) {
+            properties = properties.filter(emptyValue).filter(emptyFrequency);
+            return properties.length==0 ? null : properties.map(function(property) {
+              return propertyTransform.apply(property, {});
+            });
+          })
+          .transform('ACL', 'datasource.ACL', emptyElement)
+          .transform('ACL.owner', 'datasource.ACL._owner')
+          .transform('ACL.group', 'datasource.ACL._group')
+          .transform('ACL.permission', 'datasource.ACL._permission')
+
+        return transform.apply(datasource, new EntityModel('datasource'));
+
+      }
+
+      function preDeserializeCluster(clusterModel, transformerFactory) {
+
+        var cluster = EntityFactory.newClusterEntity();
+
+        var transform = transformerFactory
+            .transform('_name', 'name')
+            .transform('_colo','colo')
+            .transform('_description', 'description')
+            .transform('tags', 'tags', parseKeyValuePairs)
+            .transform('ACL._owner','ACL.owner')
+            .transform('ACL._group','ACL.group')
+            .transform('ACL._permission','ACL.permission')
+            .transform('locations.location', 'locations', parseClusterLocations)
+            .transform('properties.property', 'properties', parseClusterProperties)
+            .transform('interfaces.interface', 'interfaces', parseClusterInterfaces);
+
+        return transform.apply(angular.copy(clusterModel.cluster), cluster);
+      }
+
       function preDeserializeFeed(feedModel, transformerFactory) {
 
         var feed = EntityFactory.newFeed();
-        feed.storage.fileSystem.active = false;
 
         var clusterTransform = transformerFactory
             .transform('_name', 'name')
             .transform('_type', 'type')
+            .transform('_partition', 'partition')
             .transform('validity._start', 'validity.start.date', (function () { feedTz = feedModel.feed.timezone; return importDateFeed; }()))
             .transform('validity._start', 'validity.start.time', importDateFeed)
             .transform('validity._end', 'validity.end.date', importDateFeed)
             .transform('validity._end', 'validity.end.time', importDateFeed)
             .transform('retention._limit', 'retention', parseFrequency)
             .transform('retention._action', 'retention.action')
-            .transform('locations', 'storage.fileSystem.active', parseBoolean)
             .transform('locations.location', 'storage.fileSystem.locations', parseLocations)
-            .transform('table', 'storage.catalog.active', parseBoolean)
             .transform('table._uri', 'storage.catalog.catalogTable.uri')
           ;
+          var fieldTransform = transformerFactory
+              .transform('field', 'field');
+          var dataSourceTransformImport = transformerFactory
+              .transform('_name','name')
+              .transform('_tableName','tableName')
+              .transform('extract._type','extract.type')
+              .transform('extract.mergepolicy','extract.mergepolicy')
+              .transform('fields.excludes.field','excludesCSV', parseFields)
+              .transform('fields.includes.field','includesCSV', parseFields)
+              ;
+
+          var dataSourceTransformExport = transformerFactory
+              .transform('_name','name')
+              .transform('_tableName','tableName')
+              .transform('load._type','load.type')
+              .transform('fields.includes.field','includesCSV', parseFields)
+              .transform('fields.excludes.field','excludesCSV', parseFields)
+              ;
 
         var transform = transformerFactory
             .transform('_name', 'name')
             .transform('_description', 'description')
             .transform('tags', 'tags', parseKeyValuePairs)
             .transform('groups','groups')
+            .transform('availabilityFlag', 'availabilityFlag')
             .transform('ACL._owner','ACL.owner')
             .transform('ACL._group','ACL.group')
             .transform('ACL._permission','ACL.permission')
@@ -284,15 +565,44 @@
             .transform('frequency','frequency', parseFrequency)
             .transform('late-arrival','lateArrival.active', parseBoolean)
             .transform('late-arrival._cut-off','lateArrival.cutOff', parseFrequency)
-            .transform('availabilityFlag', 'availabilityFlag')
             .transform('properties.property', 'customProperties', parseProperties(isCustomProperty, EntityFactory.newFeedCustomProperties()))
             .transform('properties.property', 'properties', parseProperties(isFalconProperty, EntityFactory.newFeedProperties()))
-            .transform('locations', 'storage.fileSystem.active', parseBoolean)
             .transform('locations.location', 'storage.fileSystem.locations', parseLocations)
-            .transform('table', 'storage.catalog.active', parseBoolean)
             .transform('table._uri', 'storage.catalog.catalogTable.uri')
-            .transform('clusters.cluster', 'clusters', parseClusters(clusterTransform))
-            .transform('timezone', 'timezone');
+            .transform('partitions.partition', 'partitions', parsePartitions)
+            .transform('clusters.cluster', 'clusters', parseClusters(feed,clusterTransform))
+            .transform('clusters.cluster', 'datasources', parseFeedDatasources)
+            .transform('timezone', 'timezone')
+            ;
+
+            function parseFeedDatasources(clusters) {
+              if (clusters.length > 0) {
+                var cluster = clusters[0];
+                if (cluster.import) {
+                  feed.dataTransferType = 'import';
+                  feed.import = { 'source' : dataSourceTransformImport.apply(cluster.import.source, {}) };
+                  if(cluster._type ==='source' && feed.storage.catalog.catalogTable.uri !== null){
+                    feed.targetClusterLocationType = 'hive';
+                  } else {
+                    feed.targetClusterLocationType = 'hdfs';
+                  }
+                } else if (clusters[0].export) {
+                  feed.dataTransferType = 'export';
+                  feed.export = { 'target' : dataSourceTransformExport.apply(clusters[0].export.target, {}) };
+                  if(cluster._type ==='source' && feed.storage.catalog.catalogTable.uri !== null){
+                    feed.targetClusterLocationType = 'hive';
+                  } else {
+                    feed.targetClusterLocationType = 'hdfs';
+                  }
+                }
+              }
+              return null;
+            }
+
+            function parseFields(fields) {
+              return $.isArray(fields) ? fields.join() : fields;
+            }
+
 
         return transform.apply(angular.copy(feedModel.feed), feed);
       }
@@ -319,6 +629,19 @@
           .transform('_feed', 'feed')
           .transform('_instance', 'outputInstance');
 
+        var propertyTransform = transformerFactory
+          .transform('_name', 'name')
+          .transform('_value', 'value');
+
+        var sparkTransform = transformerFactory
+          .transform('master', 'master')
+          .transform('mode', 'mode')
+          .transform('name', 'name')
+          .transform('class', 'class')
+          .transform('jar', 'jar')
+          .transform('spark-opts', 'sparkOptions')
+          .transform('arg', 'arg');
+
         var transform = transformerFactory
           .transform('_name', 'name')
           .transform('tags', 'tags', parseKeyValuePairs)
@@ -326,6 +649,7 @@
           .transform('workflow._version', 'workflow.version')
           .transform('workflow._engine', 'workflow.engine')
           .transform('workflow._path', 'workflow.path')
+          .transform('spark-attributes', 'workflow.spark', parseSparkProperties(sparkTransform))
           .transform('timezone', 'timezone')
           .transform('frequency','frequency', parseFrequency)
           .transform('parallel','parallel')
@@ -336,6 +660,7 @@
           .transform('clusters.cluster', 'clusters', parseClusters(clusterTransform))
           .transform('inputs.input', 'inputs', parseInputs(inputTransform))
           .transform('outputs.output', 'outputs', parseOutputs(outputTransform))
+          .transform('properties.property', 'properties', parseProperties)
           .transform('ACL._owner','ACL.owner')
           .transform('ACL._group','ACL.group')
           .transform('ACL._permission','ACL.permission');
@@ -348,9 +673,82 @@
           };
         }
 
+        function parseProperties(properties) {
+          return $.isArray(properties) ? properties.map(parseProperty) : [parseProperty(properties)];
+        }
+
+        function parseProperty(property) {
+          return EntityFactory.newProperty(property._name, property._value);
+        }
+
+        function parseSparkProperties(transform) {
+          return function(sparkAttributes) {
+            if (sparkAttributes.master && sparkAttributes.master.indexOf('yarn') !== '-1') {
+              sparkAttributes.master = 'yarn';
+            }
+            return sparkTransform.apply(sparkAttributes, EntityFactory.newSparkAttributes());
+          };
+        }
+
         return transform.apply(angular.copy(processModel.process), process);
       }
 
+      function preDeserializeDatasource(datasourceModel, transformerFactory) {
+          var datasource = EntityFactory.newDatasource();
+
+          function parseProperty(property) {
+            return EntityFactory.newProperty(property._name, property._value);
+          }
+
+          function parseProperties(filterCallback) {
+            return function(properties) {
+              var result = filter(properties, filterCallback).map(parseProperty);
+              return result;
+            };
+          }
+
+          function parseInterface(datasourceinterface) {
+            var interfaceTransform = transformerFactory
+              .transform('_type', 'type')
+              .transform('_endpoint', 'endpoint')
+              .transform('credential._type', 'credential.type')
+              .transform('credential.userName', 'credential.userName')
+              .transform('credential.passwordText', 'credential.passwordText')
+              .transform('credential.passwordFile', 'credential.passwordFile')
+              .transform('credential.passwordAlias.alias', 'credential.passwordAlias')
+              .transform('credential.passwordAlias.providerPath', 'credential.providerPath');
+
+              return interfaceTransform.apply(datasourceinterface, EntityFactory.newDatasourceInterface());
+          }
+
+          function parseInterfaces(interfaces) {
+              return $.isArray(interfaces) ? interfaces.map(parseInterface) : [parseInterface(interfaces)];
+          }
+          function parseDriverJar(jar){
+            return {value : jar};
+          }
+          function parseDriverJars(jars) {
+            return $.isArray(jars) ? jars.map(parseDriverJar) : [parseDriverJar(jars)];
+          }
+          var transform = transformerFactory
+              .transform('_name', 'name')
+              .transform('_description', 'description')
+              .transform('tags', 'tags', parseKeyValuePairs)
+              .transform('_colo','colo')
+              .transform('_type','type')
+              .transform('ACL._owner','ACL.owner')
+              .transform('ACL._group','ACL.group')
+              .transform('ACL._permission','ACL.permission')
+              .transform('driver.clazz','driver.clazz')
+              .transform('driver.jar','driver.jar',parseDriverJars)
+              .transform('interfaces.interface', 'interfaces.interfaces', parseInterfaces)
+              .transform('properties.property', 'properties', parseProperties(isDatasourceProperty))
+              .transform('properties.property', 'customProperties', parseProperties(isCustomDatasourceProperty));
+
+          return transform.apply(angular.copy(datasourceModel.datasource), datasource);
+
+      }
+
       function parseDate(input) {
         var dateComponent = (input.split('T')[0]).split('-');
         return newUtcDate(dateComponent[0], dateComponent[1], dateComponent[2]);
@@ -361,9 +759,39 @@
         return newUtcTime(timeComponent[0], timeComponent[1]);
       }
 
-      function parseClusters(transform) {
+      function parseClusters(feed, transform) {
         return function(clusters) {
+          if (clusters.length > 0 && clusters[0] === "") {
+            return null;
+          }
           var result = clusters.map(parseCluster(transform));
+          result.forEach(function(cluster){
+            if (cluster.type ==='target') {
+              feed.enableFeedReplication = true;
+            }
+            if(cluster.type ==='source' && cluster.storage.catalog){
+              feed.sourceClusterLocationType = 'hive';
+            }
+            if(cluster.type ==='target' && cluster.storage.catalog){
+              feed.targetClusterLocationType = 'hive';
+            }
+            if(cluster.type ==='source' && cluster.storage.fileSystem){
+              feed.sourceClusterLocationType = 'hdfs';
+            }
+            if(cluster.type ==='target' && cluster.storage.fileSystem){
+              feed.targetClusterLocationType = 'hdfs';
+            }
+          });
+          if (feed.sourceClusterLocationType === 'hive'
+            && (!feed.targetClusterLocationType || feed.targetClusterLocationType === 'hive')) {
+            feed.dataTransferType = 'hive';
+          } else if (feed.sourceClusterLocationType === 'hdfs'
+            && (!feed.targetClusterLocationType || feed.targetClusterLocationType === 'hdfs')) {
+            feed.dataTransferType = 'hdfs';
+          }
+          if (!feed.targetClusterLocationType && (feed.dataTransferType === 'hdfs' || feed.dataTransferType === 'hive')) {
+            feed.targetClusterLocationType = feed.dataTransferType;
+          }
           selectFirstSourceCluster(result);
           return  result;
         };
@@ -396,7 +824,7 @@
       function parseCluster(transform) {
         return function(input) {
           var cluster = EntityFactory.newCluster('target', false);
-          cluster.storage.fileSystem.active = false;
+          //cluster.storage.fileSystem.active = false;
           return  transform.apply(input, cluster);
         };
       }
@@ -477,6 +905,39 @@
         return EntityFactory.newLocation(location._type, location._path);
       }
 
+      function parseClusterLocations(locations) {
+        return $.isArray(locations) ? locations.map(parseClusterLocation) : [parseClusterLocation(locations)];
+      }
+
+      function parseClusterLocation(location) {
+        return EntityFactory.newClusterLocation(location._name, location._path);
+      }
+
+      function parseClusterProperties(properties) {
+        return $.isArray(properties) ? properties.map(parseClusterProperty) : [parseClusterProperty(properties)];
+      }
+
+      function parseClusterProperty(property) {
+        return EntityFactory.newEntry(property._name, property._value);
+      }
+
+      function parseClusterInterfaces(interfaces) {
+        return $.isArray(interfaces) ? interfaces.map(parseClusterInterface) : [parseClusterInterface(interfaces)];
+      }
+
+      function parseClusterInterface(clusterInterface) {
+        return EntityFactory.newClusterInterface(
+          clusterInterface._type, clusterInterface._endpoint, clusterInterface._version);
+      }
+
+      function parsePartitions(partitions) {
+        return $.isArray(partitions) ? partitions.map(parsePartititon) : [parsePartititon(partitions)];
+      }
+
+      function parsePartititon(partition) {
+        return EntityFactory.newPartition(partition._name);
+      }
+
       function indexBy(array, property) {
         var map = {};
 
@@ -507,7 +968,6 @@
     mapBandwidthKB: true
   };
 
-
   function isCustomProperty(property) {
     return !falconProperties[property._name];
   }
@@ -516,5 +976,18 @@
     return falconProperties[property._name];
   }
 
+  var datasourceProperties = {
+    parameterFile: true,
+    verboseMode: true,
+    directMode: true
+  };
 
-})();
\ No newline at end of file
+  function isCustomDatasourceProperty(property) {
+    return !datasourceProperties[property._name];
+  }
+
+  function isDatasourceProperty(property) {
+    return datasourceProperties[property._name];
+  }
+
+})();
diff --git a/falcon-ui/app/js/services/extension/extension-serializer.js b/falcon-ui/app/js/services/extension/extension-serializer.js
new file mode 100644
index 0000000..3f689b4
--- /dev/null
+++ b/falcon-ui/app/js/services/extension/extension-serializer.js
@@ -0,0 +1,415 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+  var module = angular.module('app.services.extension.serializer',
+    ['app.services',
+      'app.services.entity.factory',
+      'app.services.entity.model']);
+
+  module.factory('ExtensionSerializer', ['EntityFactory', 'DateHelper', 'EntityModel',
+    function(EntityFactory, DateHelper, EntityModel) {
+
+      var convertTags = function (tagsArray) {
+        var result = [];
+        tagsArray.forEach(function(element) {
+          if(element.key && element.value) {
+            result.push(element.key + "=" + element.value);
+          }
+        });
+        result = result.join(",");
+        return result;
+      };
+
+      var convertObjectToString = function (obj) {
+        var str = '';
+        for (var key in obj) {
+          if (obj.hasOwnProperty(key)) {
+              str += key + '=' + obj[key] + '\n';
+          }
+        }
+        return str;
+      };
+
+      var serializeExtensionCommonProperties = function(extension) {
+        var extensionProps = {};
+        extensionProps.jobName = extension.name;
+        extensionProps.jobValidityStart = DateHelper.createISO(extension.validity.start.date,
+          extension.validity.start.time, extension.validity.timezone);
+        extensionProps.jobValidityEnd = DateHelper.createISO(extension.validity.end.date,
+          extension.validity.end.time, extension.validity.timezone);
+        extensionProps.jobFrequency = extension.frequency.unit + '(' + extension.frequency.quantity + ')';
+        extensionProps.jobTimezone = extension.validity.timezone;
+        extensionProps.jobTags = convertTags(extension.tags);
+        extensionProps.jobRetryPolicy = extension.retry.policy;
+        extensionProps.jobRetryDelay = extension.retry.delay.unit + '(' + extension.retry.delay.quantity + ')';
+        extensionProps.jobRetryAttempts = extension.retry.attempts;
+        extensionProps.jobAclOwner = extension.ACL.owner;
+        extensionProps.jobAclGroup = extension.ACL.group;
+        extensionProps.jobAclPermission = extension.ACL.permission;
+        extensionProps.tdeEncryptionEnabled = extensionProps.tdeEncryptionEnabled;
+
+        extensionProps.sourceCluster = extension.source.cluster;
+        extensionProps.targetCluster = extension.target.cluster;
+        if (extension.runOn === 'source') {
+          extensionProps.jobClusterName = extension.source.cluster;
+        } else if (extension.runOn === 'target') {
+          extensionProps.jobClusterName = extension.target.cluster;
+        }
+        if (extension.alerts.length > 0) {
+          extensionProps.jobNotificationType = 'email';
+          extensionProps.jobNotificationReceivers = extension.alerts.join();
+        }
+        return extensionProps;
+      };
+
+      var serializeSnapshotExtensionProperties = function(snapshot) {
+        var snapshotProps = serializeExtensionCommonProperties(snapshot);
+        snapshotProps.sourceSnapshotDir = snapshot.source.directoryPath.trim();
+        snapshotProps.targetSnapshotDir = snapshot.target.directoryPath.trim();
+        snapshotProps.sourceSnapshotRetentionAgeLimit = snapshot.source.deleteFrequency.unit
+          + '(' + snapshot.source.deleteFrequency.quantity + ')';
+        snapshotProps.targetSnapshotRetentionAgeLimit = snapshot.target.deleteFrequency.unit
+          + '(' + snapshot.target.deleteFrequency.quantity + ')';
+        snapshotProps.sourceSnapshotRetentionNumber = snapshot.source.retentionNumber;
+        snapshotProps.targetSnapshotRetentionNumber = snapshot.target.retentionNumber;
+        if (snapshot.allocation) {
+          if (snapshot.allocation.distcpMaxMaps) {
+            snapshotProps.distcpMaxMaps = snapshot.allocation.distcpMaxMaps;
+          }
+          if (snapshot.allocation.distcpMapBandwidth) {
+            snapshotProps.distcpMapBandwidth = snapshot.allocation.distcpMapBandwidth;
+          }
+        }
+
+        return snapshotProps;
+      };
+
+      var serializeHDFSExtensionProperties = function(hdfsExtension, secureMode) {
+        var hdfsExtensionProps = serializeExtensionCommonProperties(hdfsExtension);
+        hdfsExtensionProps.sourceDir = hdfsExtension.source.path.trim();
+        hdfsExtensionProps.targetDir = hdfsExtension.target.path.trim();
+        if (hdfsExtension.allocation.hdfs) {
+          if (hdfsExtension.allocation.hdfs.distcpMaxMaps) {
+            hdfsExtensionProps.distcpMaxMaps = hdfsExtension.allocation.hdfs.distcpMaxMaps;
+          }
+          if (hdfsExtension.allocation.hdfs.distcpMapBandwidth) {
+            hdfsExtensionProps.distcpMapBandwidth = hdfsExtension.allocation.hdfs.distcpMapBandwidth;
+          }
+        }
+        return hdfsExtensionProps;
+      };
+
+      var serializeHiveExtensionProperties = function(hiveEntension, secureMode) {
+        var hiveEntensionProps = serializeExtensionCommonProperties(hiveEntension);
+        if (hiveEntension.allocation.hive) {
+          if (hiveEntension.allocation.hive.distcpMaxMaps) {
+            hiveEntensionProps.distcpMaxMaps = hiveEntension.allocation.hive.distcpMaxMaps;
+          }
+          if (hiveEntension.allocation.hive.distcpMapBandwidth) {
+            hiveEntensionProps.distcpMapBandwidth = hiveEntension.allocation.hive.distcpMapBandwidth;
+          }
+          if (hiveEntension.allocation.hive.maxEvents) {
+            hiveEntensionProps.maxEvents = hiveEntension.allocation.hive.maxEvents;
+          }
+          if (hiveEntension.allocation.hive.replicationMaxMaps) {
+            hiveEntensionProps.replicationMaxMaps = hiveEntension.allocation.hive.replicationMaxMaps;
+          }
+        }
+
+        hiveEntensionProps.sourceDatabases = hiveEntension.source.hiveDatabases;
+        hiveEntensionProps.sourceTables = (hiveEntension.source.hiveDatabaseType === "databases")
+          ? "*" : hiveEntension.source.hiveTables;
+
+        hiveEntensionProps.sourceStagingPath = hiveEntension.hiveOptions.source.stagingPath
+        hiveEntensionProps.sourceHiveServer2Uri = hiveEntension.hiveOptions.source.hiveServerToEndpoint;
+        hiveEntensionProps.targetStagingPath = hiveEntension.hiveOptions.target.stagingPath
+        hiveEntensionProps.targetHiveServer2Uri = hiveEntension.hiveOptions.target.hiveServerToEndpoint;
+
+        // Secure mode
+        if (secureMode) {
+          hiveEntensionProps.sourceMetastoreUri = hiveEntension.source.hiveMetastoreUri;
+          hiveEntensionProps.sourceHiveMetastoreKerberosPrincipal = hiveEntension.source.hiveMetastoreKerberosPrincipal;
+          hiveEntensionProps.sourceHive2KerberosPrincipal = hiveEntension.source.hive2KerberosPrincipal;
+          hiveEntensionProps.targetMetastoreUri = hiveEntension.target.hiveMetastoreUri;
+          hiveEntensionProps.targetHiveMetastoreKerberosPrincipal = hiveEntension.target.hiveMetastoreKerberosPrincipal;
+          hiveEntensionProps.targetHive2KerberosPrincipal =  hiveEntension.target.hive2KerberosPrincipal;
+        }
+
+        return hiveEntensionProps;
+      };
+
+      var serializeBasicExtensionModel = function(model, extensionObj) {
+
+        extensionObj.name = model.process._name;
+
+        extensionObj.retry.policy = model.process.retry._policy;
+        extensionObj.retry.attempts = model.process.retry._attempts;
+        extensionObj.retry.delay.quantity = (function () {
+          return parseInt(model.process.retry._delay.split('(')[1]);
+        }());
+        extensionObj.retry.delay.unit = (function () {
+          return model.process.retry._delay.split('(')[0];
+        }());
+
+        extensionObj.frequency.quantity = (function () {
+          return parseInt(model.process.frequency.split('(')[1]);
+        }());
+        extensionObj.frequency.unit = (function () {
+          return model.process.frequency.split('(')[0];
+        }());
+
+        // extensionObj.ACL.owner = model.process.ACL._owner;
+        // extensionObj.ACL.group = model.process.ACL._group;
+        // extensionObj.ACL.permissions = model.process.ACL._permission;
+
+        extensionObj.validity.timezone = model.process.timezone;
+        extensionObj.validity.start.date = DateHelper.importDate(
+          model.process.clusters.cluster[0].validity._start, model.process.timezone);
+        extensionObj.validity.start.time = DateHelper.importDate(
+          model.process.clusters.cluster[0].validity._start, model.process.timezone);
+        extensionObj.validity.end.date = DateHelper.importDate(
+          model.process.clusters.cluster[0].validity._end, model.process.timezone);
+        extensionObj.validity.end.time = DateHelper.importDate(
+          model.process.clusters.cluster[0].validity._end, model.process.timezone);
+
+        extensionObj.tags = (function () {
+          var array = [];
+          if(model.process && model.process.tags){
+            model.process.tags.split(',').forEach(function (fieldToSplit) {
+              var splittedString = fieldToSplit.split('=');
+              if (splittedString[0] != '_falcon_extension_name' && splittedString[0] != '_falcon_extension_job') {
+                array.push({key: splittedString[0], value: splittedString[1]});
+              }
+            });
+          }
+          return array;
+        }());
+
+        if(model.process && model.process.tags){
+          if (model.process.tags.indexOf('_falcon_extension_name=HDFS-MIRRORING') !== -1) {
+            extensionObj.type = 'HDFS';
+          } else if (model.process.tags.indexOf('_falcon_extension_name=HDFS-SNAPSHOT-MIRRORING') !== -1) {
+            extensionObj.type = 'snapshot';
+          } else if (model.process.tags.indexOf('_falcon_extension_name=HIVE-MIRRORING') !== -1) {
+            extensionObj.type = 'HIVE';
+          }
+        }
+
+        if (model.process.notification._to) {
+          extensionObj.alerts = (function () {
+            if (model.process.notification._to !== "NA") {
+              return model.process.notification._to.split(',');
+            } else {
+              return [];
+            }
+          }());
+        }
+
+        model.process.properties.property.forEach(function (item) {
+            if (item._name === 'targetCluster') {
+              extensionObj.target.cluster = item._value;
+            }
+            if (item._name === 'sourceCluster') {
+              extensionObj.source.cluster = item._value;
+            }
+          });
+
+          return extensionObj;
+      };
+
+      var serializeSnapshotExtensionModel = function(model, snapshotObj) {
+        snapshotObj = serializeBasicExtensionModel(model, snapshotObj);
+
+        model.process.properties.property.forEach(function (item) {
+            if (item._name === 'distcpMaxMaps') {
+              snapshotObj.allocation.distcpMaxMaps = item._value;
+            }
+            if (item._name === 'distcpMapBandwidth') {
+              snapshotObj.allocation.distcpMapBandwidth = item._value;
+            }
+            if (item._name === 'tdeEncryptionEnabled') {
+              if (item._value === 'true') {
+                snapshotObj.tdeEncryptionEnabled = true;
+              } else {
+                snapshotObj.tdeEncryptionEnabled = false;
+              }
+            }
+            if (item._name === 'sourceSnapshotDir') {
+              snapshotObj.source.directoryPath = item._value;
+            }
+            if (item._name === 'targetSnapshotDir') {
+              snapshotObj.target.directoryPath = item._value;
+            }
+            if (item._name === 'sourceSnapshotRetentionNumber') {
+              snapshotObj.source.retentionNumber = item._value;
+            }
+            if (item._name === 'targetSnapshotRetentionNumber') {
+              snapshotObj.target.retentionNumber = item._value;
+            }
+            if (item._name === 'sourceSnapshotRetentionAgeLimit') {
+              snapshotObj.source.deleteFrequency.quantity = (function () {
+                return parseInt(item._value.split('(')[1]);
+              }());
+              snapshotObj.source.deleteFrequency.unit = (function () {
+                return item._value.split('(')[0];
+              }());
+            }
+            if (item._name === 'targetSnapshotRetentionAgeLimit') {
+              snapshotObj.target.deleteFrequency.quantity = (function () {
+                return parseInt(item._value.split('(')[1]);
+              }());
+              snapshotObj.target.deleteFrequency.unit = (function () {
+                return item._value.split('(')[0];
+              }());
+            }
+          });
+
+          return snapshotObj;
+      };
+
+      var serializeHDFSExtensionModel = function(model, hdfsExtensionObj) {
+        hdfsExtensionObj = serializeBasicExtensionModel(model, hdfsExtensionObj);
+        model.process.properties.property.forEach(function (item) {
+            if (item._name === 'distcpMaxMaps') {
+              hdfsExtensionObj.allocation.hdfs.distcpMaxMaps = item._value;
+            }
+            if (item._name === 'distcpMapBandwidth') {
+              hdfsExtensionObj.allocation.hdfs.distcpMapBandwidth = item._value;
+            }
+            // if (item._name === 'tdeEncryptionEnabled') {
+            //   if (item._value === 'true') {
+            //     hdfsExtensionObj.tdeEncryptionEnabled = true;
+            //   } else {
+            //     hdfsExtensionObj.tdeEncryptionEnabled = false;
+            //   }
+            // }
+            if (item._name === 'sourceDir') {
+              hdfsExtensionObj.source.path = item._value;
+            }
+            if (item._name === 'targetDir') {
+              hdfsExtensionObj.target.path = item._value;
+            }
+          });
+
+          return hdfsExtensionObj;
+      };
+
+      var serializeHiveExtensionModel = function(model, hiveExtensionObj, secureMode) {
+        hiveExtensionObj = serializeBasicExtensionModel(model, hiveExtensionObj);
+        model.process.properties.property.forEach(function (item) {
+            if (item._name === 'distcpMaxMaps') {
+              hiveExtensionObj.allocation.hive.distcpMaxMaps = item._value;
+            }
+            if (item._name === 'distcpMapBandwidth') {
+              hiveExtensionObj.allocation.hive.distcpMapBandwidth = item._value;
+            }
+            if (item._name === 'tdeEncryptionEnabled') {
+              if (item._value === 'true') {
+                hiveExtensionObj.tdeEncryptionEnabled = true;
+              } else {
+                hiveExtensionObj.tdeEncryptionEnabled = false;
+              }
+            }
+            if (item._name === 'replicationMaxMaps') {
+              hiveExtensionObj.allocation.hive.replicationMaxMaps = item._value;
+            }
+            if (item._name === 'maxEvents') {
+              hiveExtensionObj.allocation.hive.maxEvents = item._value;
+            }
+            if (item._name === 'sourceTables') {
+              if (item._value === "*") {
+                hiveExtensionObj.source.hiveDatabaseType = "databases";
+              } else {
+                hiveExtensionObj.source.hiveDatabaseType = "tables";
+                hiveExtensionObj.source.hiveTables = item._value;
+              }
+            }
+            if (item._name === 'sourceDatabases') {
+                hiveExtensionObj.source.hiveDatabases = item._value;
+            }
+
+            if (item._name === 'sourceStagingPath') {
+              hiveExtensionObj.hiveOptions.source.stagingPath = item._value;
+            }
+            if (item._name === 'targetStagingPath') {
+              hiveExtensionObj.hiveOptions.target.stagingPath = item._value;
+            }
+
+            if (item._name === 'sourceHiveServer2Uri') {
+              hiveExtensionObj.hiveOptions.source.hiveServerToEndpoint = item._value;
+            }
+            if (item._name === 'targetHiveServer2Uri') {
+              hiveExtensionObj.hiveOptions.target.hiveServerToEndpoint = item._value;
+            }
+
+            // Secure Mode Properties
+            if (secureMode) {
+              if(item._name === 'sourceMetastoreUri') {
+                hiveExtensionObj.source.hiveMetastoreUri = item._value;
+              }
+              if (item._name === 'sourceHiveMetastoreKerberosPrincipal') {
+                hiveExtensionObj.source.hiveMetastoreKerberosPrincipal = item._value;
+              }
+              if (item._name === 'sourceHive2KerberosPrincipal') {
+                hiveExtensionObj.source.hive2KerberosPrincipal = item._value;
+              }
+              if(item._name === 'targetMetastoreUri') {
+                hiveExtensionObj.target.hiveMetastoreUri = item._value;
+              }
+              if (item._name === 'targetHiveMetastoreKerberosPrincipal') {
+                hiveExtensionObj.target.hiveMetastoreKerberosPrincipal = item._value;
+              }
+              if (item._name === 'targetHive2KerberosPrincipal') {
+                hiveExtensionObj.target.hive2KerberosPrincipal = item._value;
+              }
+            }
+          });
+
+          return hiveExtensionObj;
+      };
+
+      var serializeExtensionProperties = function(extension, extensionType, secureMode) {
+        if (extensionType === 'snapshot') {
+          return serializeSnapshotExtensionProperties(extension);
+        } else if (extensionType === 'HDFS-MIRROR') {
+          return serializeHDFSExtensionProperties(extension, secureMode);
+        }  else if (extensionType === 'HIVE-MIRROR') {
+          return serializeHiveExtensionProperties(extension, secureMode);
+        }
+      };
+
+      var serializeExtensionModel = function(extensionModel, extensionType, secureMode) {
+        if (extensionType === 'snapshot') {
+          return serializeSnapshotExtensionModel(extensionModel, EntityFactory.newEntity('snapshot'));
+        } else if (extensionType === 'hdfs-mirror') {
+          return serializeHDFSExtensionModel(extensionModel, EntityModel.datasetModel.UIModel);
+        } else if (extensionType === 'hive-mirror') {
+          return serializeHiveExtensionModel(extensionModel, EntityModel.datasetModel.UIModel, secureMode);
+        }
+      };
+
+      return {
+        serializeExtensionProperties: serializeExtensionProperties,
+        serializeExtensionModel: serializeExtensionModel,
+        convertObjectToString: convertObjectToString,
+        convertTags: convertTags
+      };
+
+  }]);
+})();
diff --git a/falcon-ui/app/js/services/services.js b/falcon-ui/app/js/services/services.js
index 93d0482..41839fb 100644
--- a/falcon-ui/app/js/services/services.js
+++ b/falcon-ui/app/js/services/services.js
@@ -29,19 +29,19 @@
     'app.services.entity.factory',
     'app.services.entity.model',
     'app.services.instance',
-    'app.services.server'
+    'app.services.server',
+    'app.services.entity.scheduler',
+    'app.services.tooltip',
+    'app.services.entity.details',
+    'app.services.extension.serializer'
   ]);
 
   services.factory('SpinnersFlag', function () {
     return {
       show: false,
-      backShow: false
-    };
-  });
-  services.factory('SpinnersFlag', function () {
-    return {
-      show: false,
-      backShow: false
+      backShow: false,
+      saveShow: false,
+      validateShow: false
     };
   });
 
diff --git a/falcon-ui/app/test/controllers/HeaderControllerSpec.js b/falcon-ui/app/test/controllers/HeaderControllerSpec.js
index b3753db..9e2d986 100644
--- a/falcon-ui/app/test/controllers/HeaderControllerSpec.js
+++ b/falcon-ui/app/test/controllers/HeaderControllerSpec.js
@@ -29,30 +29,30 @@
               interface:[
                 {
                   _type:"readonly",
-                  _endpoint:"hftp://sandbox.hortonworks.com:50070",
+                  _endpoint:"hftp://localhost:50070",
                   _version:"2.2.0"
                 },
                 {
                   _type:"write",
-                  _endpoint:"hdfs://sandbox.hortonworks.com:8020",
+                  _endpoint:"hdfs://localhost:8020",
                   _version:"2.2.0"
 
                 },
                 {
                   _type:"execute",
-                  _endpoint:"sandbox.hortonworks.com:8050",
+                  _endpoint:"localhost:8050",
                   _version:"2.2.0"
 
                 },
                 {
                   _type:"workflow",
-                  _endpoint:"http://sandbox.hortonworks.com:11000/oozie/",
+                  _endpoint:"http://localhost:11000/oozie/",
                   _version:"4.0.0"
 
                 },
                 {
                   _type:"messaging",
-                  _endpoint:"tcp://sandbox.hortonworks.com:61616?daemon=true",
+                  _endpoint:"tcp://localhost:61616?daemon=true",
                   _version:"5.1.6"
 
                 }
diff --git a/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js b/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js
index 524f3eb..eef9630 100644
--- a/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js
+++ b/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js
@@ -26,12 +26,13 @@
       entityModelArrangeMock = jasmine.createSpyObj('EntityModel', ['arrangeFieldsOrder']),
       entityModel = {clusterModel :
         {cluster:{tags: "",interfaces:{interface:[
-            {_type:"readonly",_endpoint:"hftp://sandbox.hortonworks.com:50070",_version:"2.2.0"},
-            {_type:"write",_endpoint:"hdfs://sandbox.hortonworks.com:8020",_version:"2.2.0"},
-            {_type:"execute",_endpoint:"sandbox.hortonworks.com:8050",_version:"2.2.0"},
-            {_type:"workflow",_endpoint:"http://sandbox.hortonworks.com:11000/oozie/",_version:"4.0.0"},
-            {_type:"messaging",_endpoint:"tcp://sandbox.hortonworks.com:61616?daemon=true",_version:"5.1.6"}
-          ]},locations:{location:[{_name: "staging", _path: ""},{_name: "temp", _path: ""},{_name: "working", _path: ""}]},
+            {_type:"readonly",_endpoint:"hftp://localhost:50070",_version:"2.2.0"},
+            {_type:"write",_endpoint:"hdfs://localhost:8020",_version:"2.2.0"},
+            {_type:"execute",_endpoint:"localhost:8050",_version:"2.2.0"},
+            {_type:"workflow",_endpoint:"http://localhost:11000/oozie/",_version:"4.0.0"},
+            {_type:"messaging",_endpoint:"tcp://localhost:61616?daemon=true",_version:"5.1.6"},
+            {_type:"spark",_endpoint:"",_version:""}
+          ]},locations:{location:[{_name: "staging", _path: ""},{_name: "temp", _path: "/tmp"},{_name: "working", _path: ""}]},
           ACL: {_owner: "",_group: "",_permission: ""},properties: {property: [{ _name: "", _value: ""}]},
           _xmlns:"uri:falcon:cluster:0.1",_name:"",_description:"",_colo:""},
       }},
@@ -57,9 +58,16 @@
         $scope: scope,
         Falcon: falconServiceMock,
         EntityModel: entityModel,
-        $state: stateMock,
+        $state: {
+          current: {
+            name: 'main.forms.custer.general'
+          },
+          go: angular.noop
+        },
         X2jsService: x2jsServiceMock,
-        validationService:ValidationService
+        validationService:ValidationService,
+        $stateParams: {},
+        ClusterModel: {cluster : {}},
       });
       //
     }));
@@ -73,8 +81,8 @@
         expect(scope.secondStep).toEqual(false);
         expect(scope.clusterEntity.clusterModel.cluster.properties.property).toEqual([{ _name: "", _value: ""}]);
 
-        expect(scope.registry).toEqual({ check: false });
-        expect(scope.registry).toEqual({ check: false });
+        // expect(scope.registry).toEqual({ check: true });
+        // expect(scope.registry).toEqual({ check: true });
       });
     });
     describe('tags', function() {
@@ -137,7 +145,7 @@
         it('should init with default locations and correct values', function() {
 
           expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual(
-            [{ _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, { _name : 'working', _path : '' }, { _name : '', _path : '' }]
+            [{ _name : 'staging', _path : '' }, { _name : 'temp', _path : '/tmp' }, { _name : 'working', _path : '' }]
           );
         });
       });
@@ -264,16 +272,16 @@
         it('should delete registry interface only if not checked', function() {
           scope.validations = validationService;
           scope.clusterEntity.clusterModel.cluster.tags = "";
-          expect(scope.registry.check).toBe(true);
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface.length).toEqual(6);
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : '', _version : '' });
+          expect(scope.registry.check).toBe(false);
+          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface.length).toEqual(7);
+          //expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : 'thrift://<hostname>:9083', _version : '' });
           scope.goSummaryStep();
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : '', _version : '' });
+          //expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : 'thrift://<hostname>:9083', _version : '' });
           scope.registry.check = false;
           scope.clusterEntity.clusterModel.cluster.ACL = { _owner : '', _group : '', _permission : '' };
           scope.clusterEntity.clusterModel.cluster.tags = "";
           scope.goSummaryStep();
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toBeUndefined();
+          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[7]).toBeUndefined();
           expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface.length).toEqual(5);
         });
 
@@ -333,4 +341,4 @@
     });
   });
 
-})();
\ No newline at end of file
+})();
diff --git a/falcon-ui/app/test/controllers/feed/FeedGeneralInformationControllerSpec.js b/falcon-ui/app/test/controllers/feed/FeedGeneralInformationControllerSpec.js
index 34c39cb..e89f088 100644
--- a/falcon-ui/app/test/controllers/feed/FeedGeneralInformationControllerSpec.js
+++ b/falcon-ui/app/test/controllers/feed/FeedGeneralInformationControllerSpec.js
@@ -32,6 +32,7 @@
 
       controller = $controller('FeedGeneralInformationController', {
         $scope: scope,
+        clustersList: [],
         $state: {},
         $filter: $filter
       });
diff --git a/falcon-ui/app/test/controllers/feed/FeedLocationControllerSpec.js b/falcon-ui/app/test/controllers/feed/FeedLocationControllerSpec.js
index 8c584af..cc1320f 100644
--- a/falcon-ui/app/test/controllers/feed/FeedLocationControllerSpec.js
+++ b/falcon-ui/app/test/controllers/feed/FeedLocationControllerSpec.js
@@ -31,8 +31,7 @@
            active: true,
            locations: [
              {type: 'data', path: '/'},
-             {type: 'stats', path: '/'},
-             {type: 'meta', path: '/'}
+             {type: 'stats', path: '/'}
            ]
          },
          catalog: {
diff --git a/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js b/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js
index 8514435..1ed2f58 100644
--- a/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js
@@ -26,11 +26,14 @@
     var controllerProvider;
     var falconServiceMock;
 
-    beforeEach(module('app.controllers.feed', 'dateHelper'));
+    beforeEach(module('app.controllers.feed', 'dateHelper', 'routeHelper'));
 
-    beforeEach(inject(function($q, $rootScope, $controller, DateHelper) {
+    beforeEach(inject(function($q, $rootScope, $controller, DateHelper, RouteHelper) {
       scope = $rootScope.$new();
       scope.models = {};
+      scope.$parent = $rootScope.$new();
+      scope.$parent.models = {};
+      scope.$parent.models.feedModel = undefined;
       entityFactoryMock = jasmine.createSpyObj('EntityFactory', ['newEntity']);
       serializerMock = jasmine.createSpyObj('EntitySerializer', ['preDeserialize']);
       falconServiceMock = jasmine.createSpyObj('Falcon', ['postUpdateEntity', 'postSubmitEntity', 'logRequest', 'logResponse']);
@@ -39,12 +42,14 @@
       controller = $controller('FeedController', {
         $scope: scope,
         $state: {
-          $current:{
+          current:{
             name: 'main.forms.feed.general'
           },
           go: angular.noop
         },
-        Falcon: falconServiceMock
+        Falcon: falconServiceMock,
+        FeedModel: {feed : {}},
+        datasourcesList: []
       });
     }));
 
@@ -75,7 +80,7 @@
     describe('loadOrCreateEntity()', function() {
       it('Should deserialize the entity if the xml is found on the scope', function() {
 
-        controller = createController();
+        controller = createController({name: 'FeedName'});
         var createdFeed =  {};
         var deserialzedFeed =  {};
         var feedModel = {name: 'FeedName'};
@@ -93,13 +98,12 @@
       });
 
       it('Should not deserialize the entity if the xml is not found on the scope', function() {
-        controller = createController();
+        controller = createController(undefined);
         var createdFeed =  {};
         var deserialzedFeed =  {};
         serializerMock.preDeserialize.andReturn(deserialzedFeed);
         entityFactoryMock.newEntity.andReturn(createdFeed);
 
-
         var feed = scope.loadOrCreateEntity();
 
         expect(serializerMock.preDeserialize).not.toHaveBeenCalled();
@@ -108,13 +112,13 @@
       });
 
       it('Should clear the feedModel from the scope', function() {
-        controller = createController();
+        controller = createController(undefined);
         entityFactoryMock.newEntity.andReturn({});
         scope.models.feedModel = {};
 
         scope.loadOrCreateEntity();
 
-        expect(scope.models.feedModel).toBe(null);
+        expect(scope.$parent.models.feedModel).toBe(null);
       });
 
 
@@ -139,7 +143,6 @@
 
         scope.saveEntity();
 
-        expect(scope.editingMode).toBe(false);
         expect(falconServiceMock.postSubmitEntity).not.toHaveBeenCalled();
         expect(falconServiceMock.postUpdateEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><feed><clusters><cluster></cluster></clusters></feed>', 'feed', 'FeedOne');
       });
@@ -162,25 +165,26 @@
 
         scope.saveEntity();
 
-        expect(scope.cloningMode).toBe(false);
         expect(falconServiceMock.postSubmitEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><feed><clusters><cluster></cluster></clusters></feed>', 'feed');
         expect(falconServiceMock.postUpdateEntity).not.toHaveBeenCalled();
       });
 
     });
 
-    function createController() {
+    function createController(feedModel) {
       return controllerProvider('FeedController', {
         $scope: scope,
         $state: {
-          $current:{
+          current:{
             name: 'main.forms.feed.general'
           },
           go: angular.noop
         },
         Falcon: {},
         EntityFactory: entityFactoryMock,
-        EntitySerializer: serializerMock
+        EntitySerializer: serializerMock,
+        FeedModel: feedModel,
+        datasourcesList: []
       });
     }
 
diff --git a/falcon-ui/app/test/controllers/feed/FeedSummaryControllerSpec.js b/falcon-ui/app/test/controllers/feed/FeedSummaryControllerSpec.js
index 90d3fb9..f514792 100644
--- a/falcon-ui/app/test/controllers/feed/FeedSummaryControllerSpec.js
+++ b/falcon-ui/app/test/controllers/feed/FeedSummaryControllerSpec.js
@@ -21,9 +21,9 @@
   var controller;
 
   describe('FeedSummaryController', function () {
-    beforeEach(module('app.controllers.feed'));
+    beforeEach(module('app.controllers.feed','dateHelper'));
 
-    beforeEach(inject(function($q, $rootScope, $controller) {
+    beforeEach(inject(function($q, $rootScope, $controller, DateHelper) {
       scope = $rootScope.$new();
       scope.feed = {};
 
diff --git a/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js b/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js
index a6b4d58..f760e0c 100644
--- a/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js
@@ -21,9 +21,9 @@
   var controller;
 
   describe('ProcessClustersCtrl', function () {
-    beforeEach(module('app.controllers.process'));
+    beforeEach(module('app.controllers.process', 'dateHelper'));
 
-    beforeEach(inject(function($q, $rootScope, $controller) {
+    beforeEach(inject(function($q, $rootScope, $controller, DateHelper) {
       scope = $rootScope.$new();
       scope.process = {};
       controller = $controller('ProcessClustersCtrl', {
@@ -36,7 +36,7 @@
       it('Should add date format', function() {
         scope.init();
 
-        expect(scope.dateFormat).toBe('MM/dd/yyyy');
+        expect(scope.dateFormat).not.toBe(null);
       });
     });
 
@@ -52,7 +52,7 @@
 
         scope.openDatePicker(eventMock, container);
 
-        expect(scope.dateFormat).toBe('MM/dd/yyyy');
+        expect(scope.dateFormat).not.toBe(null);
       });
     });
 
diff --git a/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js b/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js
index 6008456..df148c1 100644
--- a/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js
@@ -22,9 +22,9 @@
 
 
   describe('ProcessGeneralInformationCtrl', function () {
-    beforeEach(module('app.controllers.process'));
+    beforeEach(module('app.controllers.process', 'dateHelper'));
 
-    beforeEach(inject(function($q, $rootScope, $controller) {
+    beforeEach(inject(function($q, $rootScope, $controller, DateHelper) {
       scope = $rootScope.$new();
       scope.entityType = 'process';
       scope.process = {
@@ -32,7 +32,9 @@
       };
 
       controller = $controller('ProcessGeneralInformationCtrl', {
-        $scope: scope
+        $scope: scope,
+        clustersList: [],
+        feedsList: []
       });
     }));
 
@@ -79,33 +81,4 @@
     });
   })
 
-  describe('Versions', function() {
-    it('Should display the oozie versions when oozie workflow is selected', function() {
-      var expectedVersions = ['3.1.3-incubating', '3.2.0-incubating', '3.3.0', '3.3.1', '3.3.2', '4.0.0', '4.0.1'];
-      scope.process.workflow = {engine: 'oozie'};
-
-      scope.selectWorkflow();
-
-      expect(scope.versions).toEqual(expectedVersions);
-    });
-
-    it('Should display the pig versions when pig workflow is selected', function() {
-      var expectedVersions = ['pig-0.10.0', 'pig-0.10.1', 'pig-0.11.0', 'pig-0.11.1', 'pig-0.12.0', 'pig-0.12.1', 'pig-0.13.0', 'pig-0.8.0', 'pig-0.8.1', ' pig-0.9.0', ' pig-0.9.1', 'pig-0.9.2'];
-      scope.process.workflow = {engine: 'pig'};
-
-      scope.selectWorkflow();
-
-      expect(scope.versions).toEqual(expectedVersions);
-    });
-
-    it('Should display the hive versions when hive workflow is selected', function() {
-      var expectedVersions = ['hive-0.10.0', 'hive-0.11.0', 'hive-0.12.0', 'hive-0.13.0', 'hive-0.13.1', 'hive-0.6.0', 'hive-0.7.0', 'hive-0.8.0', 'hive-0.8.1', 'hive-0.9.0'];
-      scope.process.workflow = {engine: 'hive'};
-
-      scope.selectWorkflow();
-
-      expect(scope.versions).toEqual(expectedVersions);
-    });
-  });
-
-})();
\ No newline at end of file
+})();
diff --git a/falcon-ui/app/test/controllers/process/ProcessRootCtrlSpec.js b/falcon-ui/app/test/controllers/process/ProcessRootCtrlSpec.js
index 78cf26a..0eec39b 100644
--- a/falcon-ui/app/test/controllers/process/ProcessRootCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/process/ProcessRootCtrlSpec.js
@@ -22,14 +22,21 @@
   var controllerProvider;
   var entityFactoryMock;
   var serializerMock;
+  var falconServiceMock;
 
   describe('ProcessRootCtrl', function () {
 
-    beforeEach(module('app.controllers.process'));
+    beforeEach(module('app.controllers.process','dateHelper','routeHelper'));
 
-    beforeEach(inject(function($q, $rootScope, $controller) {
+    beforeEach(inject(function($q, $rootScope, $controller, DateHelper, RouteHelper) {
+      falconServiceMock = jasmine.createSpyObj('Falcon', ['postUpdateEntity', 'postSubmitEntity', 'logRequest', 'logResponse']);
+
       scope = $rootScope.$new();
       scope.models = {};
+      scope.$parent = $rootScope.$new();
+      scope.$parent.models = {};
+      scope.process = {};
+      scope.entityType = 'process';
       controllerProvider = $controller;
       entityFactoryMock = jasmine.createSpyObj('EntityFactory', ['newEntity']);
       serializerMock = jasmine.createSpyObj('EntitySerializer', ['preDeserialize']);
@@ -37,13 +44,15 @@
       controller = $controller('ProcessRootCtrl', {
         $scope: scope,
         $state: {
-          $current:{
+          current:{
             name: 'forms.process.general'
           },
           go: angular.noop
         },
         EntityFactory: entityFactoryMock,
-        EntitySerializer: serializerMock
+        EntitySerializer: serializerMock,
+        Falcon: falconServiceMock,
+        ProcessModel : undefined
       });
     }));
 
@@ -52,10 +61,11 @@
       expect(scope.entityType).toBe('process');
     });
 
-    it('Should be initialized properly', function() {
-      scope.init();
-
-      expect(scope.editXmlDisabled).toBe(true);
+    describe('init', function() {
+      it('Should be initialized properly', function() {
+        scope.init();
+        expect(scope.editXmlDisabled).toBe(true);
+      });
     });
 
     it('Should toggle editXmlDisable value to true', function() {
@@ -76,7 +86,7 @@
 
     it('Should deserialize the entity if the xml is found on the scope', function() {
 
-      controller = createController();
+      controller = createController({name: 'ProcessName'});
       var createdProcess =  {};
       var deserialzedProcess =  {};
       var processModel = {name: 'ProcessName'};
@@ -92,7 +102,7 @@
     });
 
     it('Should not deserialize the entity if the xml is not found on the scope', function() {
-      controller = createController();
+      controller = createController(undefined);
       var createdProcess =  {};
       var deserialzedProcess =  {};
       serializerMock.preDeserialize.andReturn(deserialzedProcess);
@@ -106,29 +116,70 @@
     });
 
     it('Should clear the processModel from the scope', function() {
-      controller = createController();
+      controller = createController({name: 'ProcessName'});
       entityFactoryMock.newEntity.andReturn({});
       scope.models.processModel = {};
 
       scope.loadOrCreateEntity();
 
-      expect(scope.models.processModel).toBe(null);
+      expect(scope.$parent.models.processModel).toBe(null);
     });
 
 
+    describe('saveEntity', function() {
+      it('Should save the update the entity if in edit mode', function() {
+        falconServiceMock.postUpdateEntity.andReturn(successResponse({}));
+        scope.editingMode = true;//---this line doesnt work
+        scope.$parent.cloningMode = false;
+        scope.process = { name:  'ProcessOne'};
+        scope.xml = '<process/>';
+
+        scope.saveEntity();
+
+        expect(falconServiceMock.postSubmitEntity).not.toHaveBeenCalled();
+        expect(falconServiceMock.postUpdateEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><process/>', 'process', 'ProcessOne');
+      });
+
+      it('Should save the update the entity if in cloning mode', function() {
+        falconServiceMock.postSubmitEntity.andReturn(successResponse({}));
+        scope.cloningMode = true;//---this line doesnt work
+        scope.$parent.cloningMode = true;
+        scope.process = { name:  'ProcessOne'};
+        scope.xml = '<process/>';
+
+        scope.saveEntity();
+
+        expect(falconServiceMock.postSubmitEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><process/>', 'process');
+        expect(falconServiceMock.postUpdateEntity).not.toHaveBeenCalled();
+      });
+
+    });
+
+    function successResponse(value) {
+      var fakePromise = {};
+      fakePromise.success = function(callback) {
+        callback(value);
+        return fakePromise;
+      };
+      fakePromise.error = angular.noop;
+      return fakePromise;
+    }
+
+
   });
 
-  function createController() {
+  function createController(processModel) {
     return controllerProvider('ProcessRootCtrl', {
       $scope: scope,
       $state: {
-        $current:{
+        current:{
           name: 'forms.process.general'
         },
         go: angular.noop
       },
       EntityFactory: entityFactoryMock,
-      EntitySerializer: serializerMock
+      EntitySerializer: serializerMock,
+      ProcessModel : processModel
     });
   }
 
diff --git a/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js b/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js
index a8ee968..ce3a3b2 100644
--- a/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js
@@ -17,72 +17,11 @@
  */
 (function () {
   'use strict';
-  var scope, controller, falconServiceMock;
+  var scope, controller;
 
   describe('ProcessSummaryCtrl', function () {
     beforeEach(module('app.controllers.process'));
 
-    beforeEach(inject(function($q, $rootScope, $controller) {
-      falconServiceMock = jasmine.createSpyObj('Falcon', ['postUpdateEntity', 'postSubmitEntity', 'logRequest', 'logResponse']);
-
-      scope = $rootScope.$new();
-      scope.process = {};
-      scope.entityType = 'process';
-      controller = $controller('ProcessSummaryCtrl', {
-        $scope: scope,
-        Falcon: falconServiceMock,
-        $state: {
-          $current:{
-            name: 'main.forms.feed.general'
-          },
-          go: angular.noop
-        }
-      });
-    }));
-
-
-    describe('saveEntity', function() {
-      it('Should save the update the entity if in edit mode', function() {
-        falconServiceMock.postUpdateEntity.andReturn(successResponse({}));
-        scope.editingMode = true;//---this line doesnt work
-        scope.$parent.cloningMode = false;
-        scope.process = { name:  'ProcessOne'};
-        scope.xml = '<process/>';
-
-        scope.saveEntity();
-
-        expect(scope.editingMode).toBe(false);
-        expect(falconServiceMock.postSubmitEntity).not.toHaveBeenCalled();
-        expect(falconServiceMock.postUpdateEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><process/>', 'process', 'ProcessOne');
-      });
-
-      it('Should save the update the entity if in cloning mode', function() {
-        falconServiceMock.postSubmitEntity.andReturn(successResponse({}));
-        scope.cloningMode = true;//---this line doesnt work
-        scope.$parent.cloningMode = true;
-        scope.process = { name:  'ProcessOne'};
-        scope.xml = '<process/>';
-
-        scope.saveEntity();
-
-        expect(scope.cloningMode).toBe(false);
-        expect(falconServiceMock.postSubmitEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><process/>', 'process');
-        expect(falconServiceMock.postUpdateEntity).not.toHaveBeenCalled();
-      });
-
-    });
-
-    function successResponse(value) {
-      var fakePromise = {};
-      fakePromise.success = function(callback) {
-        callback(value);
-        return fakePromise;
-      };
-      fakePromise.error = angular.noop;
-      return fakePromise;
-    }
-
-
   });
 
-})();
\ No newline at end of file
+})();
diff --git a/falcon-ui/app/test/e2e/protractor.js b/falcon-ui/app/test/e2e/protractor.js
index 6c2d97e..37d6e65 100644
--- a/falcon-ui/app/test/e2e/protractor.js
+++ b/falcon-ui/app/test/e2e/protractor.js
@@ -1,25 +1,7 @@
-/**
- * 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.
- */
-
 exports.config = {
   chromeDriver: '../../../node_modules/protractor/selenium/chromedriver',
 
   jasmineNodeOpts: {
     showColors: true
   }
-};
+};
\ No newline at end of file
diff --git a/falcon-ui/app/test/services/EntitySerializerSpec.js b/falcon-ui/app/test/services/EntitySerializerSpec.js
index 5f83225..74d69fa 100644
--- a/falcon-ui/app/test/services/EntitySerializerSpec.js
+++ b/falcon-ui/app/test/services/EntitySerializerSpec.js
@@ -136,9 +136,9 @@
 
         var feed = serializer.preDeserialize(feedModel, 'feed');
 
-        expect(feed.lateArrival.active).toBe(false);
+        expect(feed.lateArrival.active).toBe(true);
         expect(feed.lateArrival.cutOff.unit).toBe('hours');
-        expect(feed.lateArrival.cutOff.quantity).toBe(null);
+        expect(feed.lateArrival.cutOff.quantity).toBe(4);
       });
 
       it('Should copy availabilityFlag', function() {
@@ -160,7 +160,7 @@
 
         var feed = serializer.preDeserialize(feedModel, 'feed');
 
-        expect(feed.availabilityFlag).toBe(null);
+        expect(feed.availabilityFlag).toBe("_success");
       });
 
       it('Should copy custom properties', function() {
@@ -213,7 +213,7 @@
 
         var feed = serializer.preDeserialize(feedModel, 'feed');
 
-        expect(feed.properties.length).toBe(6);
+        expect(feed.properties.length).toBe(5);
         expect(feed.properties[0].key).toBe('queueName');
         expect(feed.properties[0].value).toBe('QueueName');
       });
@@ -232,31 +232,14 @@
 
         var feed = serializer.preDeserialize(feedModel, 'feed');
 
-        expect(feed.properties.length).toBe(6);
+        expect(feed.properties.length).toBe(5);
+
         expect(feed.properties[0].key).toBe('queueName');
-        expect(feed.properties[0].value).toBe('');
+        expect(feed.properties[0].value).toBe('default');
         expect(feed.properties[1].key).toBe('jobPriority');
         expect(feed.properties[1].value).toBe('MEDIUM');
       });
 
-      it('Should copy timeout as a Frequency Object', function() {
-        var feedModel = {
-          feed: {
-            properties: {property: [
-              {_name: 'queueName', _value: 'QueueName'},
-              {_name: 'timeout', _value: 'days(4)'}
-            ]}
-          }
-        };
-
-        var feed = serializer.preDeserialize(feedModel, 'feed');
-
-        expect(feed.properties.length).toBe(6);
-        expect(feed.properties[2].key).toBe('timeout');
-        expect(feed.properties[2].value.quantity).toBe('4');
-        expect(feed.properties[2].value.unit).toBe('days');
-      });
-
       it('Should copy file system locations', function() {
         var feedModel = {
           feed: {
@@ -270,7 +253,6 @@
         var feed = serializer.preDeserialize(feedModel, 'feed');
         var locations = feed.storage.fileSystem.locations;
 
-        expect(feed.storage.fileSystem.active).toBe(true);
         expect(locations.length).toBe(2);
         expect(locations[0].type).toBe('data');
         expect(locations[0].path).toBe('/none1');
@@ -281,55 +263,24 @@
       it('Should not copy file system locations if they are not defined and keep the defaults', function() {
         var feedModel = {
           feed: {
-          }
-        };
-
-        var feed = serializer.preDeserialize(feedModel, 'feed');
-        var locations = feed.storage.fileSystem.locations;
-
-        expect(feed.storage.fileSystem.active).toBe(false);
-        expect(locations.length).toBe(3);
-        expect(locations[0].type).toBe('data');
-        expect(locations[0].path).toBe('/');
-        expect(locations[1].type).toBe('stats');
-        expect(locations[1].path).toBe('/');
-        expect(locations[2].type).toBe('meta');
-        expect(locations[2].path).toBe('/');
-      });
-
-      it('Should set file system active flag as false if there are no locations are', function() {
-        var feedModel = {
-          feed: {}
-        };
-
-        var feed = serializer.preDeserialize(feedModel, 'feed');
-
-        expect(feed.storage.fileSystem.active).toBe(false);
-      });
-
-      it('Should copy catalog uri', function() {
-        var feedModel = {
-          feed: {
-            "table": {
-              _uri : 'table:uri'
-            }
+            dataTransferType: 'hdfs',
           }
         };
 
         var feed = serializer.preDeserialize(feedModel, 'feed');
 
-        expect(feed.storage.catalog.active).toBe(true);
-        expect(feed.storage.catalog.catalogTable.uri).toBe('table:uri');
+        expect(feed.storage.fileSystem.locations).toBe(null);
       });
 
       it('Should not copy catalog uri if not present', function() {
         var feedModel = {
-          feed: {}
+          feed: {
+            dataTransferType: 'hive',
+          }
         };
 
         var feed = serializer.preDeserialize(feedModel, 'feed');
 
-        expect(feed.storage.catalog.active).toBe(false);
         expect(feed.storage.catalog.catalogTable.uri).toBe(null);
       });
 
@@ -418,12 +369,12 @@
       it('Should copy clusters locations', function() {
         var feedModel = {
           feed: {
+            dataTransferType: 'hdfs',
             clusters: {cluster: [{_name: 'ClusterOne', _type: 'target',
               locations: {
                 location: [
-                  {_type: 'stats', _path: '/path1'},
-                  {_type: 'data', _path: '/path2'},
-                  {_type: 'tmp', _path: '/path3'}
+                  {_type: 'data', _path: '/path1'},
+                  {_type: 'stats', _path: '/path2'}
                 ]}
             }]}
           }
@@ -432,64 +383,45 @@
         var feed = serializer.preDeserialize(feedModel, 'feed');
         var locations = feed.clusters[0].storage.fileSystem.locations;
 
-        expect(feed.clusters[0].storage.fileSystem.active).toBe(true);
-        expect(locations.length).toBe(3);
-        expect(locations[0].type).toBe('stats');
+        expect(locations.length).toBe(2);
+        expect(locations[0].type).toBe('data');
         expect(locations[0].path).toBe('/path1');
-        expect(locations[1].type).toBe('data');
+        expect(locations[1].type).toBe('stats');
         expect(locations[1].path).toBe('/path2');
-        expect(locations[2].type).toBe('tmp');
-        expect(locations[2].path).toBe('/path3');
       });
 
       it('filesystem should be inactive if there are no locations', function() {
         var feedModel = {
           feed: {
-            clusters: {cluster: [{_name: 'ClusterOne', _type: 'target'}]}
+            dataTransferType: 'hdfs',
+            clusters: {cluster: [{_name: 'ClusterOne', _type: 'target',
+              locations: {
+                location: []}
+            }]}
           }
         };
 
         var feed = serializer.preDeserialize(feedModel, 'feed');
         var locations = feed.clusters[0].storage.fileSystem.locations;
-
-        expect(feed.clusters[0].storage.fileSystem.active).toBe(false);
-        expect(locations.length).toBe(3);
+        expect(locations.length).toBe(0);
       });
 
       it('Should copy catalog uri', function() {
         var feedModel = {
           feed: {
             clusters: {cluster: [{_name: 'ClusterOne', _type: 'target',
-              "table": {
+              table: {
                 _uri : 'table:uri'
               }
             }]}
           }
         };
 
-
         var feed = serializer.preDeserialize(feedModel, 'feed');
         var catalogStorage = feed.clusters[0].storage.catalog;
-
-        expect(catalogStorage.active).toBe(true);
         expect(catalogStorage.catalogTable.uri).toBe('table:uri');
       });
 
-      it('Should set catalog storage as inactive when not present in the xml', function() {
-        var feedModel = {
-          feed: {
-            clusters: {cluster: [{_name: 'ClusterOne', _type: 'target'}]}
-          }
-        };
-
-
-        var feed = serializer.preDeserialize(feedModel, 'feed');
-        var catalogStorage = feed.clusters[0].storage.catalog;
-
-        expect(catalogStorage.active).toBe(false);
-        expect(catalogStorage.catalogTable.uri).toBe(null);
-      });
-
       it('Should copy timezone', function() {
         var feedModel = {
           feed: {
@@ -705,7 +637,7 @@
           properties: [
             {key: 'queueName', value: null},
             {key: 'jobPriority', value: 'HIGH'},
-            {key: 'timeout', value: {quantity: null, unit: 'weeks'}}
+            {key: 'timeout', value: {quantity: 2, unit: 'months'}}
           ]
         };
 
@@ -715,6 +647,7 @@
             "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" +
             "<properties>" +
             "<property name='jobPriority' value='HIGH'></property>" +
+            "<property name='timeout' value='months(2)'></property>" +
             "</properties>" +
             "</feed>"
         );
@@ -723,13 +656,13 @@
 
       it('Should transform locations properly if file system storage is active', function () {
         var feed = {name: 'FeedName',
+          dataTransferType: 'hdfs',
           storage: {
             fileSystem: {
               active: true,
               locations: [
                 {type: 'data', path: '/none1'},
-                {type: 'stats', path: '/none2'},
-                {type: 'meta', path: '/none3'}
+                {type: 'stats', path: '/none2'}
               ]
             }
           }
@@ -742,7 +675,6 @@
             "<locations>" +
             "<location type='data' path='/none1'></location>" +
             "<location type='stats' path='/none2'></location>" +
-            "<location type='meta' path='/none3'></location>" +
             "</locations>" +
             "</feed>"
         );
@@ -756,8 +688,7 @@
               active: false,
               locations: [
                 {type: 'data', path: '/none1'},
-                {type: 'stats', path: '/none2'},
-                {type: 'meta', path: '/none3'}
+                {type: 'stats', path: '/none2'}
               ]
             }
           }
@@ -773,6 +704,7 @@
 
       it('Should transform catalog properly if catalog storage is active', function () {
         var feed = {name: 'FeedName',
+          dataTransferType: 'hive',
           storage: {
             catalog: {
               active: true,
@@ -828,8 +760,7 @@
                   active: true,
                   locations: [
                     {type: 'data', path: '/none1'},
-                    {type: 'stats', path: '/none2'},
-                    {type: 'meta', path: '/none3'}
+                    {type: 'stats', path: '/none2'}
                   ]
                 },
                 catalog: {
@@ -848,8 +779,7 @@
                   active: true,
                   locations: [
                     {type: 'data', path: '/none4'},
-                    {type: 'stats', path: '/none5'},
-                    {type: 'meta', path: '/none6'}
+                    {type: 'stats', path: '/none5'}
                   ]
                 },
                 catalog: {
@@ -872,7 +802,6 @@
             "<locations>" +
             "<location type='data' path='/none1'></location>" +
             "<location type='stats' path='/none2'></location>" +
-            "<location type='meta' path='/none3'></location>" +
             "</locations>" +
             "<table uri='/primaryuri'/>" +
             "</cluster>" +
@@ -882,7 +811,6 @@
             "<locations>" +
             "<location type='data' path='/none4'></location>" +
             "<location type='stats' path='/none5'></location>" +
-            "<location type='meta' path='/none6'></location>" +
             "</locations>" +
             "<table uri='/secondaryuri'/>" +
             "</cluster>" +
@@ -1282,4 +1210,4 @@
     }
 
   });
-})();
\ No newline at end of file
+})();
diff --git a/falcon-ui/app/test/services/ValdationServiceSpec.js b/falcon-ui/app/test/services/ValdationServiceSpec.js
index bd43927..18f9f01 100644
--- a/falcon-ui/app/test/services/ValdationServiceSpec.js
+++ b/falcon-ui/app/test/services/ValdationServiceSpec.js
@@ -40,7 +40,7 @@
     describe('patterns', function () {
       it('Should return an object with the validation patterns', function () {
         expect(validationService.patterns).toBeDefined();
-        expect(validationService.patterns.name).toEqual(/^[a-zA-Z0-9-_]{1,60}$/);
+        expect(validationService.patterns.name).toEqual(/^[a-zA-Z][\-a-zA-Z0-9]{1,39}$/);
 
       });
     });
diff --git a/falcon-ui/express-data/mockData.js b/falcon-ui/express-data/mockData.js
index 1c52358..9457df8 100644
--- a/falcon-ui/express-data/mockData.js
+++ b/falcon-ui/express-data/mockData.js
@@ -118,6 +118,10 @@
       {"type":"process","name":"hive-databases-mirror-test","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HIVE","runsOn=target"]}},
       {"type":"process","name":"hive-db-tables-mirror-test","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HIVE","runsOn=source"]}},
       {"type":"process","name":"mirror4","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HDFS","runsOn=source"]}}
+    ]},
+	datasource:{"entity":[
+	  {"type":"DATASOURCE","name":"testConn1","status":"SUBMITTED","tags":null},
+	  {"type":"DATASOURCE","name":"testConn2","status":"SUBMITTED","tags":null}
     ]}
   },
     definitions = {
@@ -281,8 +285,49 @@
 
         'hive-db-tables-mirror-test': "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><process xmlns='uri:falcon:process:0.1' name='hive-db-tables-mirror-test'><tags>_falcon_mirroring_type=HIVE,runsOn=source</tags><clusters><cluster name='completeCluster'><validity start='2015-05-01T09:42:00.000Z' end='2016-04-09T09:04:00.000Z'/></cluster></clusters><parallel>1</parallel><order>LAST_ONLY</order><frequency>months(7)</frequency><timezone>GMT+00:00</timezone><properties><property name='oozie.wf.subworkflow.classpath.inheritance' value='true'></property><property name='distcpMaxMaps' value='111'></property><property name='distcpMapBandwidth' value='678'></property><property name='targetCluster' value='primaryCluster'></property><property name='sourceCluster' value='completeCluster'></property><property name='targetHiveServer2Uri' value='some/path/staging'></property><property name='sourceHiveServer2Uri' value='thrift://localhost:10000'></property><property name='sourceStagingPath' value='/apps/falcon/backupCluster/staging'></property><property name='targetStagingPath' value='/apps/falcon/some/staging'></property><property name='targetNN' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='sourceNN' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='sourceServicePrincipal' value='hive'></property><property name='targetServicePrincipal' value='hive'></property><property name='targetMetastoreUri' value=''></property><property name='sourceMetastoreUri' value='thrift://localhost:9083'></property><property name='sourceTable' value='table1,table2,table3'></property><property name='sourceDatabase' value='database1'></property><property name='maxEvents' value='-10'></property><property name='replicationMaxMaps' value='52'></property><property name='clusterForJobRun' value='completeCluster'></property><property name='clusterForJobRunWriteEP' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='drJobName' value='hive-db-tables-mirror-test'></property><property name='drNotifyEmail' value='hive-tables@test.com'></property></properties><workflow name='falcon-dr-hive-workflow' engine='oozie' path='hdfs://node-1.example.com:8020/apps/falcon/recipe/hive-disaster-recovery/resources/runtime/hive-disaster-recovery-workflow.xml' lib=''/><retry policy='PERIODIC' delay='months(60)' attempts='15'/><ACL owner='ambari-qa' group='users' permission='0x755'/></process>"
 
-      }
-
+      },
+	  DATASOURCE: {
+		 testConn1 :
+			"<datasource xmlns='uri:falcon:datasource:0.1' colo='testColo' type='mysql' name='testConn1'>" +
+				"<interfaces>" +
+					"<interface type='readonly' endpoint='jdbc:mysql://localhost:3306/test'>" +
+						"<credential type='password-text'>" +
+							"<userName>user1</userName>" +
+							"<passwordText>password1</passwordText>" +
+						"</credential>" +
+					"</interface>" +
+					"<credential type='password-text'>" +
+						"<userName>user1</userName>" +
+						"<passwordText>password1</passwordText>" +
+					"</credential>" +
+				"</interfaces>" +
+				"<driver>" +
+					"<clazz>com.mysql.jdbc.Driver</clazz>" +
+					"<jar>abc</jar>" +
+				"</driver>" +
+				"<ACL owner='root' group='users' permission='0x755'/>" +
+			"</datasource>",
+		testConn2 :
+			"<datasource xmlns='uri:falcon:datasource:0.1' colo='testColo' type='mysql' name='testConn2'>" +
+				"<interfaces>" +
+					"<interface type='readonly' endpoint='jdbc:mysql://localhost:3306/test'>" +
+						"<credential type='password-text'>" +
+							"<userName>user1</userName>" +
+							"<passwordText>password1</passwordText>" +
+						"</credential>" +
+					"</interface>" +
+					"<credential type='password-text'>" +
+						"<userName>user1</userName>" +
+						"<passwordText>password1</passwordText>" +
+					"</credential>" +
+				"</interfaces>" +
+				"<driver>" +
+					"<clazz>com.mysql.jdbc.Driver</clazz>" +
+					"<jar>abc</jar>" +
+				"</driver>" +
+				"<ACL owner='root' group='users' permission='0x755'/>" +
+			"</datasource>"
+	  }
     },
     instancesList = {
       FEED: [
@@ -582,7 +627,8 @@
     },
     verticesDirection = [
       {"results":[{"_id":"2wm3-aqU-4u","_type":"edge","_outV":40108,"_inV":16,"_label":"owned-by"},{"_id":"2wm1-aqU-5o","_type":"edge","_outV":40108,"_inV":4,"_label":"runs-on"},{"_id":"2wm7-apq-5w","_type":"edge","_outV":40016,"_inV":40108,"_label":"input"},{"_id":"2wm5-aqU-5E","_type":"edge","_outV":40108,"_inV":40012,"_label":"output"},{"_id":"2wlZ-aqU-86","_type":"edge","_outV":40108,"_inV":32,"_label":"instance-of"}],"totalSize":5},
-      {"results":[{"timestamp":"2015-03-26T02:45Z","name":"ambari-qa","type":"user","_id":16,"_type":"vertex"},{"timestamp":"2015-03-26T02:42Z","name":"primaryCluster","type":"cluster-entity","_id":4,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed1\/yearno=2014\/monthno=11","type":"feed-instance","_id":40016,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed6\/yearno=2014\/monthno=11","type":"feed-instance","_id":40012,"_type":"vertex"},{"timestamp":"2015-03-26T02:46Z","name":"SampleProcess3","type":"process-entity","version":"1.0","_id":32,"_type":"vertex"}],"totalSize":5},
+     //{"results":[{"timestamp":"2015-03-26T02:45Z","name":"ambari-qa","type":"user","_id":16,"_type":"vertex"},{"timestamp":"2015-03-26T02:42Z","name":"primaryCluster","type":"cluster-entity","_id":4,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed1\/yearno=2014\/monthno=11","type":"feed-instance","_id":40016,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed6\/yearno=2014\/monthno=11","type":"feed-instance","_id":40012,"_type":"vertex"},{"timestamp":"2015-03-26T02:46Z","name":"SampleProcess3","type":"process-entity","version":"1.0","_id":32,"_type":"vertex"}],"totalSize":5},
+      {"results":[{"timestamp":"2015-03-26T02:45Z","name":"ambari-qa","type":"user","_id":16,"_type":"vertex"},{"timestamp":"2015-03-26T02:42Z","name":"primaryCluster","type":"cluster-entity","_id":4,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed1\/yearno=2014\/monthno=11","type":"feed-instance","_id":40016,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed6-654351354651351684vd5svdv65fv6s5v61vs616sd51vsxd61v6\/yearno=2014\/monthno=11","type":"feed-instance","_id":40012,"_type":"vertex"},{"timestamp":"2015-03-26T02:46Z","name":"SampleProcess3","type":"process-entity","version":"1.0","_id":32,"_type":"vertex"}],"totalSize":5},
       {"results":[{"_id":"2w9d-apm-4u","_type":"edge","_outV":40012,"_inV":16,"_label":"owned-by"},{"_id":"2w9b-apm-4S","_type":"edge","_outV":40012,"_inV":4,"_label":"stored-in"},{"_id":"2whH-aqo-5E","_type":"edge","_outV":40076,"_inV":40012,"_label":"output"},{"_id":"2wif-aqs-5E","_type":"edge","_outV":40080,"_inV":40012,"_label":"output"},{"_id":"2w9f-api-5E","_type":"edge","_outV":40008,"_inV":40012,"_label":"output"},{"_id":"2wiN-aqw-5E","_type":"edge","_outV":40084,"_inV":40012,"_label":"output"},{"_id":"2wa1-apu-5E","_type":"edge","_outV":40020,"_inV":40012,"_label":"output"},{"_id":"2wjl-aqA-5E","_type":"edge","_outV":40088,"_inV":40012,"_label":"output"},{"_id":"2waz-apy-5E","_type":"edge","_outV":40024,"_inV":40012,"_label":"output"},{"_id":"2wjT-aqE-5E","_type":"edge","_outV":40092,"_inV":40012,"_label":"output"},{"_id":"2wb7-apC-5E","_type":"edge","_outV":40028,"_inV":40012,"_label":"output"},{"_id":"2wkr-aqI-5E","_type":"edge","_outV":40096,"_inV":40012,"_label":"output"},{"_id":"2wbF-apG-5E","_type":"edge","_outV":40032,"_inV":40012,"_label":"output"},{"_id":"2wkZ-aqM-5E","_type":"edge","_outV":40100,"_inV":40012,"_label":"output"},{"_id":"2wcd-apK-5E","_type":"edge","_outV":40036,"_inV":40012,"_label":"output"},{"_id":"2wlx-aqQ-5E","_type":"edge","_outV":40104,"_inV":40012,"_label":"output"},{"_id":"2wcL-apO-5E","_type":"edge","_outV":40040,"_inV":40012,"_label":"output"},{"_id":"2wm5-aqU-5E","_type":"edge","_outV":40108,"_inV":40012,"_label":"output"},{"_id":"2wdj-apS-5E","_type":"edge","_outV":40044,"_inV":40012,"_label":"output"},{"_id":"2wdR-apW-5E","_type":"edge","_outV":40048,"_inV":40012,"_label":"output"},{"_id":"2wep-aq0-5E","_type":"edge","_outV":40052,"_inV":40012,"_label":"output"},{"_id":"2weX-aq4-5E","_type":"edge","_outV":40056,"_inV":40012,"_label":"output"},{"_id":"2wfv-aq8-5E","_type":"edge","_outV":40060,"_inV":40012,"_label":"output"},{"_id":"2wg3-aqc-5E","_type":"edge","_outV":40064,"_inV":40012,"_label":"output"},{"_id":"2wgB-aqg-5E","_type":"edge","_outV":40068,"_inV":40012,"_label":"output"},{"_id":"2wh9-aqk-5E","_type":"edge","_outV":40072,"_inV":40012,"_label":"output"},{"_id":"2w99-apm-86","_type":"edge","_outV":40012,"_inV":28,"_label":"instance-of"}],"totalSize":27},
       {"results":[{"_id":"2w9t-apq-4u","_type":"edge","_outV":40016,"_inV":16,"_label":"owned-by"},{"_id":"2w9r-apq-4S","_type":"edge","_outV":40016,"_inV":4,"_label":"stored-in"},{"_id":"2wih-apq-5w","_type":"edge","_outV":40016,"_inV":40080,"_label":"input"},{"_id":"2wiP-apq-5w","_type":"edge","_outV":40016,"_inV":40084,"_label":"input"},{"_id":"2wa3-apq-5w","_type":"edge","_outV":40016,"_inV":40020,"_label":"input"},{"_id":"2wjn-apq-5w","_type":"edge","_outV":40016,"_inV":40088,"_label":"input"},{"_id":"2waB-apq-5w","_type":"edge","_outV":40016,"_inV":40024,"_label":"input"},{"_id":"2w9v-apq-5w","_type":"edge","_outV":40016,"_inV":40008,"_label":"input"},{"_id":"2wjV-apq-5w","_type":"edge","_outV":40016,"_inV":40092,"_label":"input"},{"_id":"2wb9-apq-5w","_type":"edge","_outV":40016,"_inV":40028,"_label":"input"},{"_id":"2wkt-apq-5w","_type":"edge","_outV":40016,"_inV":40096,"_label":"input"},{"_id":"2wbH-apq-5w","_type":"edge","_outV":40016,"_inV":40032,"_label":"input"},{"_id":"2wl1-apq-5w","_type":"edge","_outV":40016,"_inV":40100,"_label":"input"},{"_id":"2wcf-apq-5w","_type":"edge","_outV":40016,"_inV":40036,"_label":"input"},{"_id":"2wlz-apq-5w","_type":"edge","_outV":40016,"_inV":40104,"_label":"input"},{"_id":"2wcN-apq-5w","_type":"edge","_outV":40016,"_inV":40040,"_label":"input"},{"_id":"2wm7-apq-5w","_type":"edge","_outV":40016,"_inV":40108,"_label":"input"},{"_id":"2wdl-apq-5w","_type":"edge","_outV":40016,"_inV":40044,"_label":"input"},{"_id":"2wdT-apq-5w","_type":"edge","_outV":40016,"_inV":40048,"_label":"input"},{"_id":"2wer-apq-5w","_type":"edge","_outV":40016,"_inV":40052,"_label":"input"},{"_id":"2weZ-apq-5w","_type":"edge","_outV":40016,"_inV":40056,"_label":"input"},{"_id":"2wfx-apq-5w","_type":"edge","_outV":40016,"_inV":40060,"_label":"input"},{"_id":"2wg5-apq-5w","_type":"edge","_outV":40016,"_inV":40064,"_label":"input"},{"_id":"2wgD-apq-5w","_type":"edge","_outV":40016,"_inV":40068,"_label":"input"},{"_id":"2whb-apq-5w","_type":"edge","_outV":40016,"_inV":40072,"_label":"input"},{"_id":"2whJ-apq-5w","_type":"edge","_outV":40016,"_inV":40076,"_label":"input"},{"_id":"2w9p-apq-86","_type":"edge","_outV":40016,"_inV":12,"_label":"instance-of"}],"totalSize":27}
     ],
diff --git a/falcon-ui/karma.conf.js b/falcon-ui/karma.conf.js
index 776249f..11189e8 100644
--- a/falcon-ui/karma.conf.js
+++ b/falcon-ui/karma.conf.js
@@ -1,21 +1,3 @@
-/**
- * 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.
- */
-
 // Karma configuration
 // Generated on Wed Sep 24 2014 21:15:41 GMT-0500 (CDT)
 
diff --git a/falcon-ui/pom.xml b/falcon-ui/pom.xml
index bbb917c..f15af2b 100644
--- a/falcon-ui/pom.xml
+++ b/falcon-ui/pom.xml
@@ -15,8 +15,7 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.apache.falcon</groupId>
@@ -33,7 +32,7 @@
       <plugin>
         <groupId>com.github.eirslett</groupId>
         <artifactId>frontend-maven-plugin</artifactId>
-        <version>0.0.23</version>
+        <version>0.0.14</version>
         <executions>
 
           <execution>
@@ -76,6 +75,27 @@
               <arguments>test</arguments>
             </configuration>
           </execution>
+
+	  <execution>
+            <id>grunt copy webapp</id>
+            <goals>
+              <goal>grunt</goal>
+            </goals>
+            <configuration>
+              <arguments>copy:webapp</arguments>
+            </configuration>
+          </execution>
+
+	  <execution>
+            <id>grunt copy ambariview</id>
+            <goals>
+              <goal>grunt</goal>
+            </goals>
+            <configuration>
+              <arguments>copy:ambariview</arguments>
+            </configuration>
+          </execution>
+
         </executions>
       </plugin>
 
@@ -84,7 +104,9 @@
         <artifactId>apache-rat-plugin</artifactId>
         <configuration>
           <excludes>
+            <exclude>.git*</exclude>
             <exclude>app/js/lib/**</exclude>
+            <exclude>app/css/*.css</exclude>
             <exclude>app/css/bootstrap/**</exclude>
             <exclude>app/test/lib/**</exclude>
             <exclude>app/css/fonts/**</exclude>
@@ -98,7 +120,6 @@
             <exclude>bower.json</exclude>
             <exclude>karma.conf.js</exclude>
             <exclude>bower.json</exclude>
-            <exclude>app/css/main.css</exclude>
 	    <exclude>app/css/img/**</exclude>
             <exclude>app/test/e2e/protractor.js</exclude>
             <exclude>app/js/directives/ng-tags-input.js</exclude>
diff --git a/falcon-ui/server.js b/falcon-ui/server.js
index 298e10a..7cd0ab0 100644
--- a/falcon-ui/server.js
+++ b/falcon-ui/server.js
@@ -23,7 +23,7 @@
     mockData = require('./express-data/mockData.js'),
     chartData = require('./express-data/chartData.js'),
     server = express(),
-    PORT = 3000;
+    PORT = process.env.PORT || 3000;
 
   server.use('/', express.static(__dirname + '/dist'));
   server.use(bodyParser());
@@ -152,6 +152,27 @@
     }
   });
 
+  server.get('/api/entities/status/:type/:name', function(req, res) {
+	var responseMessage = {
+          "status": "SUCCEEDED",
+          "message": "default/SUBMITTED\n",
+          "requestId": "default/2009721512@qtp-1933075111-15 - 96165552-6fec-46c5-9646-8b28887d09b0\n"
+        };
+	 res.json(200, responseMessage);
+  });
+
+  server.post('/api/entities/validate/:type', function (req, res) {
+    var type = req.params.type.toLowerCase(),
+	  text = req.text,
+      name = req.params.name,
+      responseMessage = {
+        "status": "SUCCEEDED",
+        "message": "default/Validated successfully (" + type + ") " + "\n",
+        "requestId": "default/546cbe05-2cb3-4e5c-8e7a-b1559d866c99\n"
+      };
+    res.json(200, responseMessage);
+  });
+
   server.post('/api/entities/submit/:type', function (req, res) {
     var type = req.params.type.toUpperCase(),
       text = req.text,
@@ -239,6 +260,8 @@
         "requestId": "falcon/default/13015853-8e40-4923-9d32-6d01053c31c6\n\n"
       },
       indexInArray = mockData.findByNameInList(type, name);
+
+	delete mockData.definitions[type.toUpperCase()][name];
     mockData.entitiesList[type].entity.splice(indexInArray, 1);
     res.json(200, responseMessage);
   });
@@ -474,7 +497,7 @@
         res.send(200, response);
       } else {
         res.send(404, response);
-      }
+      }cls
 
     } else {
       console.log('error');
@@ -508,6 +531,7 @@
   server.get('/api/admin/version', function(req, res) {
     setTimeout(function(){
       res.send(200, mockData.server);
+      //res.send(401);
     }, 3000);
   });
 
diff --git a/pom.xml b/pom.xml
index 8e836da..e468476 100644
--- a/pom.xml
+++ b/pom.xml
@@ -369,6 +369,7 @@
 
     <modules>
         <module>falcon-ui</module>
+        <module>falcon-ambari-view</module>
         <module>build-tools</module>
         <module>client</module>
         <module>cli</module>