From 38f720752af4d4aad8c4e467a288d9048659f688 Mon Sep 17 00:00:00 2001
From: Rob Daugherty <rd472p@att.com>
Date: Wed, 14 Mar 2018 02:07:32 -0400
Subject: AT&T 1712 and 1802 release code

This is code from AT&T's 1712 and 1802 releases.

Change-Id: Ie1e85851e94bc66c4d9514a0226c221939531a04
Issue-ID: SO-425
Signed-off-by: Rob Daugherty <rd472p@att.com>
---
 .../base/client/CloudifyBaseException.java         |  43 +++
 .../mso/cloudify/base/client/CloudifyClient.java   | 130 ++++++++
 .../base/client/CloudifyClientConnector.java       |  28 ++
 .../base/client/CloudifyClientTokenProvider.java   |  85 +++++
 .../base/client/CloudifyConnectException.java      |  39 +++
 .../mso/cloudify/base/client/CloudifyRequest.java  | 188 +++++++++++
 .../mso/cloudify/base/client/CloudifyResponse.java |  38 +++
 .../base/client/CloudifyResponseException.java     |  61 ++++
 .../base/client/CloudifyResponseStatus.java        |  37 +++
 .../base/client/CloudifySimpleTokenProvider.java   |  40 +++
 .../base/client/CloudifyTokenProvider.java         |  29 ++
 .../openecomp/mso/cloudify/base/client/Entity.java |  71 +++++
 .../mso/cloudify/base/client/HttpMethod.java       |  25 ++
 .../connector/http/HttpClientConnector.java        | 245 ++++++++++++++
 .../connector/http/HttpClientException.java        |  42 +++
 .../connector/http/HttpClientRedirectStrategy.java | 106 +++++++
 .../connector/http/HttpClientResponse.java         | 107 +++++++
 .../mso/cloudify/v3/client/BlueprintsResource.java | 103 ++++++
 .../openecomp/mso/cloudify/v3/client/Cloudify.java |  83 +++++
 .../cloudify/v3/client/DeploymentsResource.java    |  90 ++++++
 .../mso/cloudify/v3/client/ExecutionsResource.java | 106 +++++++
 .../cloudify/v3/client/NodeInstancesResource.java  |  70 ++++
 .../mso/cloudify/v3/client/TokensResource.java     |  50 +++
 .../openecomp/mso/cloudify/v3/model/Blueprint.java | 160 ++++++++++
 .../mso/cloudify/v3/model/Blueprints.java          |  54 ++++
 .../cloudify/v3/model/CancelExecutionParams.java   |  53 ++++
 .../mso/cloudify/v3/model/CloudifyError.java       |  74 +++++
 .../cloudify/v3/model/CreateDeploymentParams.java  |  62 ++++
 .../mso/cloudify/v3/model/Deployment.java          | 351 +++++++++++++++++++++
 .../mso/cloudify/v3/model/DeploymentOutputs.java   |  90 ++++++
 .../mso/cloudify/v3/model/Deployments.java         |  54 ++++
 .../openecomp/mso/cloudify/v3/model/Execution.java | 174 ++++++++++
 .../mso/cloudify/v3/model/Executions.java          |  54 ++++
 .../openecomp/mso/cloudify/v3/model/Metadata.java  |  84 +++++
 .../mso/cloudify/v3/model/NodeInstance.java        | 205 ++++++++++++
 .../mso/cloudify/v3/model/NodeInstances.java       |  54 ++++
 .../mso/cloudify/v3/model/OpenstackConfig.java     |  89 ++++++
 .../mso/cloudify/v3/model/ParameterDefinition.java |  58 ++++
 .../cloudify/v3/model/StartExecutionParams.java    |  98 ++++++
 .../org/openecomp/mso/cloudify/v3/model/Token.java |  67 ++++
 .../cloudify/v3/model/UpdateExecutionParams.java   |  50 +++
 .../v3/model/UpdateNodeInstanceParams.java         |  76 +++++
 42 files changed, 3723 insertions(+)
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyBaseException.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientConnector.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientTokenProvider.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyConnectException.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyRequest.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponse.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseException.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseStatus.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifySimpleTokenProvider.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyTokenProvider.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/Entity.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/HttpMethod.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientConnector.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientException.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientRedirectStrategy.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientResponse.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/BlueprintsResource.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/Cloudify.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/DeploymentsResource.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/ExecutionsResource.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/NodeInstancesResource.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/TokensResource.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprint.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprints.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CancelExecutionParams.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CloudifyError.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CreateDeploymentParams.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployment.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/DeploymentOutputs.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployments.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Execution.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Executions.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Metadata.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstance.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstances.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/OpenstackConfig.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/ParameterDefinition.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/StartExecutionParams.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Token.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateExecutionParams.java
 create mode 100644 cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateNodeInstanceParams.java

(limited to 'cloudify-client/src/main')

diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyBaseException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyBaseException.java
new file mode 100644
index 0000000000..1fe933b174
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyBaseException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+/**
+ * A common abstract parent of all Openstack Exception types, allowing
+ * calling classes the choice to catch all error exceptions together.
+ */
+public abstract class CloudifyBaseException extends RuntimeException
+{
+	private static final long serialVersionUID = 1L;
+
+	/*
+	 * Implement only the basic constructors
+	 */
+	public CloudifyBaseException () {}
+	
+	public CloudifyBaseException(String message) {
+		super(message);
+	}
+
+	public CloudifyBaseException(String message, Throwable cause) {
+		super(message, cause);
+	}
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java
new file mode 100644
index 0000000000..03f5a9907b
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java
@@ -0,0 +1,130 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+import java.util.Properties;
+
+import org.openecomp.mso.cloudify.connector.http.HttpClientConnector;
+
+public class CloudifyClient {
+	
+	protected String managerEndpoint;
+	protected String tenant = "default_tenant";	// Note - only default_tenant supported in community edition
+	
+	protected CloudifyTokenProvider tokenProvider;
+
+	protected static int AUTHENTICATION_RETRIES = 1;
+
+	protected CloudifyClientConnector connector;
+	
+	protected Properties properties = new Properties();
+
+	public CloudifyClient(String managerEndpoint) {
+		this.managerEndpoint = managerEndpoint;
+		this.connector = new HttpClientConnector();
+	}
+
+	public CloudifyClient(String managerEndpoint, String tenant) {
+		this.managerEndpoint = managerEndpoint;
+		this.tenant = tenant;
+		this.connector = new HttpClientConnector();
+	}
+
+	public CloudifyClient(String managerEndpoint, CloudifyClientConnector connector) {
+		this.managerEndpoint = managerEndpoint;
+		this.connector = connector;
+	}
+
+	/**
+	 * Execute a Cloudify request by making the REST API call.  Return the
+	 * complete CloudifyResponse structure, which includes the complete
+	 * HTTP response.
+	 * @param request a CloudifyRequest object
+	 * @return a CloudifyResponse object
+	 */
+	public <T> CloudifyResponse request(CloudifyRequest<T> request) {
+		CloudifyResponseException authException = null;
+
+		for (int i = 0; i <= AUTHENTICATION_RETRIES; i++) {
+			request.endpoint(managerEndpoint);
+			request.header("Tenant", tenant);
+			if (tokenProvider != null)
+				request.header("Authentication-Token", tokenProvider.getToken());
+
+			try {
+				return connector.request(request);
+			} catch (CloudifyResponseException e) {
+				if (e.getStatus() != CloudifyResponseStatus.NOT_AUTHORIZED
+						|| tokenProvider == null) {
+					throw e;
+				}
+				authException = e;
+				tokenProvider.expireToken();
+			}
+		}
+
+		throw authException;
+	}
+
+	/**
+	 * Execute a CloudifyRequest by sending the REST API call to the Cloudify
+	 * Manager endpoint.  The return type is a JSON POJO object containing the
+	 * response body entity.
+	 * @param request
+	 * @return a JSON POJO object specific to the request type
+	 */
+	public <T> T execute(CloudifyRequest<T> request) {
+		CloudifyResponse response =  request(request);
+		return (request.returnType() != null && request.returnType() != Void.class) ? response.getEntity(request.returnType()) : null;
+	}
+
+	public void property(String property, String value) {
+		properties.put(property, value);
+	}
+
+	/**
+	 * Set a Token Provider.  This class should be able to produce an
+	 * authentication token on-demand.
+	 * @param tokenProvider
+	 */
+	public void setTokenProvider(CloudifyTokenProvider tokenProvider) {
+		this.tokenProvider = tokenProvider;
+	}
+	
+	/**
+	 * Manually set the authentication token to use for this client.
+	 * @param token
+	 */
+	public void setToken(String token) {
+		setTokenProvider(new CloudifySimpleTokenProvider(token));
+	}
+	
+	/**
+	 * Perform a simple GET request with no request message body
+	 * @param path
+	 * @param returnType
+	 * @return An object of Class <R>
+	 */
+	public <R> CloudifyRequest<R> get(String path, Class<R> returnType) {
+		return new CloudifyRequest<R>(this, HttpMethod.GET, path, null, returnType);
+	}
+	
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientConnector.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientConnector.java
new file mode 100644
index 0000000000..12162c3d4f
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientConnector.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+
+public interface CloudifyClientConnector {
+
+	public <T> CloudifyResponse request(CloudifyRequest<T> request);
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientTokenProvider.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientTokenProvider.java
new file mode 100644
index 0000000000..946720bb45
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientTokenProvider.java
@@ -0,0 +1,85 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+import java.util.Date;
+
+import org.apache.commons.lang.time.DateUtils;
+
+import org.openecomp.mso.cloudify.v3.client.Cloudify;
+import org.openecomp.mso.cloudify.v3.client.TokensResource.GetToken;
+import org.openecomp.mso.cloudify.v3.model.Token;
+
+/**
+ * Cloudify Token Provider that uses the Cloudify client API itself to obtain a token
+ * 
+ * @author JC1348
+ *
+ */
+public class CloudifyClientTokenProvider implements CloudifyTokenProvider {
+
+	String user;
+	String password;
+	String token;
+	Date expiration;
+	Cloudify cloudify = null;
+
+	public CloudifyClientTokenProvider(String cloudifyEndpoint, String user, String password) {
+		this.user = user;
+		this.password = password;
+		
+		cloudify = new Cloudify (cloudifyEndpoint);
+	}
+
+	@Override
+	public String getToken() {
+		Date now = new Date();
+		if (token != null && expiration != null && expiration.after(now)) {
+			return token;
+		}
+
+		// Create a "Get Token" request.  Force basic authentication to acquire the token itself.
+		GetToken tokenRequest = cloudify.tokens().token();
+		tokenRequest.setBasicAuthentication(user, password);
+		Token newToken = tokenRequest.execute();
+		
+		token = newToken.getValue();
+		
+		if (expiration == null) {
+			expiration = new Date();
+		}
+		// TODO:  Make this property driven (or see if it comes back somehow in response)
+		expiration = DateUtils.addMinutes(expiration, 10);
+		
+		return token;
+	}
+
+	@Override
+	/**
+	 * This doesn't actually expire the token in Cloudify.  It just prevents this token provider
+	 * from using it.
+	 */
+	public void expireToken() {
+		expiration = null;
+		token = null;
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyConnectException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyConnectException.java
new file mode 100644
index 0000000000..3b28b6e3f9
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyConnectException.java
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+/**
+ * Custom RuntimeException to report connection errors to Openstack endpoints.
+ * Must be a RuntimeException to conform with OpenstackClient interface, which
+ * does not declare specific Exceptions.
+ */
+public class CloudifyConnectException extends CloudifyBaseException {
+
+	private static final long serialVersionUID = 7294957362769575271L;
+
+	public CloudifyConnectException(String message) {
+		super(message);
+	}
+
+	public CloudifyConnectException(String message, Throwable cause) {
+		super(message, cause);
+	}
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyRequest.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyRequest.java
new file mode 100644
index 0000000000..6b0a4c1d13
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyRequest.java
@@ -0,0 +1,188 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+
+public class CloudifyRequest<R> {
+	
+	private CloudifyClient client;
+	
+	public CloudifyRequest() {
+		
+	}
+	
+	public CloudifyRequest(CloudifyClient client, HttpMethod method, CharSequence path, Entity<?> entity, Class<R> returnType) {
+		this.client = client;
+		this.method = method;
+		this.path = new StringBuilder(path);
+		this.entity = entity;
+		this.returnType = returnType;
+		header("Accept", "application/json");
+	}
+	
+	private String endpoint;
+	
+	private HttpMethod method;
+	
+	private StringBuilder path = new StringBuilder();
+	
+	private Map<String, List<Object>> headers = new HashMap<String, List<Object>>();
+	
+	private Entity<?> entity;
+	
+	private Class<R> returnType;
+	
+	private boolean basicAuth = false;
+	private String user = null;
+	private String password = null;
+	
+	public CloudifyRequest<R> endpoint(String endpoint) {
+		this.endpoint = endpoint;
+		return this;
+	}
+	
+	public String endpoint() {
+		return endpoint;
+	}
+
+	public CloudifyRequest<R> method(HttpMethod method) {
+		this.method = method;
+		return this;
+	}
+	
+	public HttpMethod method() {
+		return method;
+	}
+	
+	public CloudifyRequest<R> path(String path) {
+		this.path.append(path);
+		return this;
+	}
+	
+	public String path() {
+		return path.toString();
+	}
+
+	public CloudifyRequest<R> header(String name, Object value) {
+		if(value != null) {
+			headers.put(name, Arrays.asList(value));
+		}
+		return this;
+	}
+	
+	public Map<String, List<Object>> headers() {
+		return headers;
+	}
+	
+	public <T> Entity<T> entity(T entity, String contentType) {
+		return new Entity<T>(entity, contentType);
+	}
+	
+	public Entity<?> entity() {
+		return entity;
+	}
+	
+	public <T> Entity<T> json(T entity) {
+		return entity(entity, "application/json");
+	}
+	
+	public void returnType(Class<R> returnType) {
+		this.returnType = returnType;
+	}
+	
+	public Class<R> returnType() {
+		return returnType;
+	}
+	
+	/*
+	 * Use Basic Authentication for this request.  If not set, the client will use Token authentication
+	 * if a token provider is defined.  Otherwise, no authentication will be applied.
+	 */
+	public void setBasicAuthentication (String user, String password) {
+		this.basicAuth = true;
+		this.user = user;
+		this.password= password;
+	}
+	
+	public boolean isBasicAuth () {
+		return this.basicAuth;
+	}
+	
+	public String getUser() {
+		return user;
+	}
+	
+	public String getPassword() {
+		return password;
+	}
+	
+	public R execute() {
+		return client.execute(this);
+	}
+	
+	public CloudifyResponse request() {
+		return client.request(this);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		return "CloudifyRequest [endpoint=" + endpoint + ", method=" + method
+				+ ", path=" + path + ", headers=" + headers + ", entity="
+				+ entity + ", returnType=" + returnType + "]";
+	}
+
+	private Map<String, List<Object> > queryParams = new LinkedHashMap<String, List<Object> >();
+
+	public Map<String, List<Object> > queryParams() {
+		return queryParams;
+	}
+
+	public CloudifyRequest<R> queryParam(String key, Object value) {
+		if (queryParams.containsKey(key)) {
+			List<Object> values = queryParams.get(key);
+			values.add(value);
+		} else {
+			List<Object> values = new ArrayList<Object>();
+			values.add(value);
+			queryParams.put(key, values);
+		}
+
+		return this;
+    }
+	
+	protected static String buildPath(String ... elements) {
+	    StringBuilder stringBuilder = new StringBuilder();
+	    for (String element : elements) {
+            stringBuilder.append(element);
+        }
+
+	    return stringBuilder.toString();
+	}
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponse.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponse.java
new file mode 100644
index 0000000000..7ddeaa8c4b
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponse.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+import java.io.InputStream;
+import java.util.Map;
+
+public interface CloudifyResponse {
+
+	public <T> T getEntity(Class<T> returnType);
+
+	public <T> T getErrorEntity(Class<T> returnType);
+
+	public InputStream getInputStream();
+
+	public String getHeader(String name);
+	
+	public Map<String, String> headers();
+	
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseException.java
new file mode 100644
index 0000000000..27e61f9581
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseException.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+import org.openecomp.mso.cloudify.v3.model.CloudifyError;
+
+public class CloudifyResponseException extends CloudifyBaseException {
+
+	private static final long serialVersionUID = 7294957362769575271L;
+
+	protected String message;
+	protected int status;
+	
+	// Make the response available for exception handling (includes body)
+	protected CloudifyResponse response;
+
+	public CloudifyResponseException(String message, int status) {
+		this.message = message;
+		this.status = status;
+		this.response = null;
+	}
+
+	// Include the response message itself.  The body is a CloudifyError JSON structure.
+	public CloudifyResponseException(String message, int status, CloudifyResponse response) {
+		CloudifyError error = response.getErrorEntity(CloudifyError.class);
+		this.message = message + ": " + error.getErrorCode();
+		this.status = status;
+		this.response = response;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public int getStatus() {
+		return status;
+	}
+
+	public CloudifyResponse getResponse() {
+		return response;
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseStatus.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseStatus.java
new file mode 100644
index 0000000000..38079d6f26
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseStatus.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+public class CloudifyResponseStatus {
+
+	public static final int OK = 200;
+
+	public static final int ACCEPTED = 201;
+
+	public static final int BAD_REQUEST = 400;
+
+	public static final int NOT_AUTHORIZED = 401;
+
+	public static final int NOT_FOUND = 404;
+
+	public static final int CONFLICT = 409;
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifySimpleTokenProvider.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifySimpleTokenProvider.java
new file mode 100644
index 0000000000..8f37e069d9
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifySimpleTokenProvider.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+public class CloudifySimpleTokenProvider implements CloudifyTokenProvider {
+
+	String token;
+
+	public CloudifySimpleTokenProvider(String token) {
+		this.token = token;
+	}
+
+	@Override
+	public String getToken() {
+		return this.token;
+	}
+
+	@Override
+	public void expireToken() {
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyTokenProvider.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyTokenProvider.java
new file mode 100644
index 0000000000..ee32f9321d
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyTokenProvider.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+public interface CloudifyTokenProvider {
+
+	String getToken();
+
+	void expireToken();
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/Entity.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/Entity.java
new file mode 100644
index 0000000000..db2587937b
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/Entity.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+public class Entity<T> {
+	
+	private T entity;
+	
+	private String contentType;
+	
+	public static <T> Entity<T> json(T entity) {
+		return new Entity<T>(entity, "application/json");
+	}
+	
+	public static <T> Entity<T> stream(T entity) {
+		return new Entity<T>(entity, "application/octet-stream");
+	}
+
+	public Entity(T entity, String contentType) {
+		super();
+		this.entity = entity;
+		this.contentType = contentType;
+	}
+
+	/**
+	 * @return the entity
+	 */
+	public T getEntity() {
+		return entity;
+	}
+
+	/**
+	 * @param entity the entity to set
+	 */
+	public void setEntity(T entity) {
+		this.entity = entity;
+	}
+
+	/**
+	 * @return the contentType
+	 */
+	public String getContentType() {
+		return contentType;
+	}
+
+	/**
+	 * @param contentType the contentType to set
+	 */
+	public void setContentType(String contentType) {
+		this.contentType = contentType;
+	}
+	
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/HttpMethod.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/HttpMethod.java
new file mode 100644
index 0000000000..a8c0cab2d8
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/HttpMethod.java
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.base.client;
+
+public enum HttpMethod {
+	HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientConnector.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientConnector.java
new file mode 100644
index 0000000000..421f62a437
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientConnector.java
@@ -0,0 +1,245 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.connector.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.HttpResponseException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.openecomp.mso.cloudify.base.client.CloudifyClientConnector;
+import org.openecomp.mso.cloudify.base.client.CloudifyConnectException;
+import org.openecomp.mso.cloudify.base.client.CloudifyRequest;
+import org.openecomp.mso.cloudify.base.client.CloudifyResponse;
+import org.openecomp.mso.cloudify.base.client.CloudifyResponseException;
+import org.openecomp.mso.logger.MsoLogger;
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+public class HttpClientConnector implements CloudifyClientConnector {
+
+	public static ObjectMapper DEFAULT_MAPPER;
+	public static ObjectMapper WRAPPED_MAPPER;
+	
+    private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
+
+	static {
+		DEFAULT_MAPPER = new ObjectMapper();
+
+		DEFAULT_MAPPER.setSerializationInclusion(Include.NON_NULL);
+		DEFAULT_MAPPER.disable(SerializationFeature.INDENT_OUTPUT);
+		DEFAULT_MAPPER.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+		DEFAULT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+
+		WRAPPED_MAPPER = new ObjectMapper();
+
+		WRAPPED_MAPPER.setSerializationInclusion(Include.NON_NULL);
+		WRAPPED_MAPPER.disable(SerializationFeature.INDENT_OUTPUT);
+		WRAPPED_MAPPER.enable(SerializationFeature.WRAP_ROOT_VALUE);
+		WRAPPED_MAPPER.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
+		WRAPPED_MAPPER.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+		WRAPPED_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+	}
+	
+	protected static <T> ObjectMapper getObjectMapper (Class<T> type) {
+		return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER;
+	}
+
+	public <T> CloudifyResponse request(CloudifyRequest<T> request) {
+
+		CloseableHttpClient httpClient = null; //HttpClients.createDefault();
+
+		if (request.isBasicAuth()) {
+			// Use Basic Auth for this request.
+			CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+			credentialsProvider.setCredentials(AuthScope.ANY,
+					new UsernamePasswordCredentials (request.getUser(), request.getPassword()));
+
+			httpClient = HttpClients.custom().setRedirectStrategy(new HttpClientRedirectStrategy()).setDefaultCredentialsProvider(credentialsProvider).build();
+		}
+		else {
+			// Don't use basic authentication.  The Client will attempt Token-based authentication
+			httpClient = HttpClients.custom().setRedirectStrategy(new HttpClientRedirectStrategy()).build();
+		}
+		
+		URI uri = null;
+		
+		// Build the URI with query params
+		try {
+			URIBuilder uriBuilder = new URIBuilder(request.endpoint() + request.path());
+
+			for(Map.Entry<String, List<Object> > entry : request.queryParams().entrySet()) {
+				for (Object o : entry.getValue()) {
+					uriBuilder.setParameter(entry.getKey(), String.valueOf(o));
+				}
+			}
+			
+			uri = uriBuilder.build();
+		} catch (URISyntaxException e) {
+			throw new HttpClientException (e);
+		}
+
+		HttpEntity entity = null;
+		if (request.entity() != null) {
+			// Special handling for streaming input
+			if (request.entity().getEntity() instanceof InputStream) {
+				// Entity is an InputStream
+				entity = new InputStreamEntity ((InputStream) request.entity().getEntity());
+			}
+			else {
+				// Assume to be JSON.  Flatten the entity to a Json string					
+				try {
+			    	// Get appropriate mapper, based on existence of a root element in Entity class
+					ObjectMapper mapper = getObjectMapper (request.entity().getEntity().getClass());
+	
+					String entityJson = mapper.writeValueAsString (request.entity().getEntity());
+					entity = new StringEntity(entityJson, ContentType.create(request.entity().getContentType()));
+					
+					LOGGER.debug ("Request JSON Body: " + entityJson.replaceAll("\"password\":\"[^\"]*\"", "\"password\":\"***\""));
+	
+				} catch (JsonProcessingException e) {
+					throw new HttpClientException ("Json processing error on request entity", e);
+				} catch (IOException e) {
+					throw new HttpClientException ("Json IO error on request entity", e);
+				}
+			}
+		}
+		
+		// Determine the HttpRequest class based on the method
+		HttpUriRequest httpRequest;
+		
+		switch (request.method()) {
+		case POST:
+			HttpPost post = new HttpPost(uri);
+			post.setEntity (entity);
+			httpRequest = post;
+			break;
+			
+		case GET:
+			httpRequest = new HttpGet(uri);
+			break;
+
+		case PUT:
+			HttpPut put = new HttpPut(uri);
+			put.setEntity (entity);
+			httpRequest = put;
+			break;
+			
+		case DELETE:
+			httpRequest = new HttpDelete(uri);
+			break;
+			
+		default:
+			throw new HttpClientException ("Unrecognized HTTP Method: " + request.method());
+		}
+		
+		for (Entry<String, List<Object>> h : request.headers().entrySet()) {
+			StringBuilder sb = new StringBuilder();
+			for (Object v : h.getValue()) {
+				sb.append(String.valueOf(v));
+			}
+			httpRequest.addHeader(h.getKey(), sb.toString());
+		}
+
+		// Get the Response.  But don't get the body entity yet, as this response
+		// will be wrapped in an HttpClientResponse.  The HttpClientResponse
+		// buffers the body in constructor, so can close the response here.
+		HttpClientResponse httpClientResponse = null;
+		CloseableHttpResponse httpResponse = null;
+		
+		// Catch known HttpClient exceptions, and wrap them in OpenStack Client Exceptions
+		// so calling functions can distinguish.  Only RuntimeExceptions are allowed.
+		try {
+			httpResponse = httpClient.execute(httpRequest);
+
+			LOGGER.debug ("Response status: " + httpResponse.getStatusLine().getStatusCode());
+			
+			httpClientResponse = new HttpClientResponse (httpResponse);
+
+			int status = httpResponse.getStatusLine().getStatusCode();
+			if (status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED ||
+				status == HttpStatus.SC_NO_CONTENT || status == HttpStatus.SC_ACCEPTED)
+			{
+				return httpClientResponse;
+			}
+		}
+		catch (HttpResponseException e) {
+			// What exactly does this mean?  It does not appear to get thrown for
+			// non-2XX responses as documented.
+			throw new CloudifyResponseException(e.getMessage(), e.getStatusCode());
+		}
+		catch (UnknownHostException e) {
+			throw new CloudifyConnectException("Unknown Host: " + e.getMessage());
+		}
+		catch (IOException e) {
+			// Catch all other IOExceptions and throw as OpenStackConnectException
+			throw new CloudifyConnectException(e.getMessage());
+		}
+		catch (Exception e) {
+			// Catchall for anything else, must throw as a RuntimeException
+			e.printStackTrace();
+			throw new RuntimeException("Unexpected client exception", e);
+		}
+		finally {
+			// Have the body.  Close the stream
+			if (httpResponse != null)
+				try {
+					httpResponse.close();
+				} catch (IOException e) {
+					LOGGER.debug("Unable to close HTTP Response: " + e);
+				}
+		}
+		
+		// Get here on an error response (4XX-5XX)
+		throw new CloudifyResponseException(httpResponse.getStatusLine().getReasonPhrase(),
+											httpResponse.getStatusLine().getStatusCode(),
+											httpClientResponse);
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientException.java
new file mode 100644
index 0000000000..d5eb675257
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientException.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.connector.http;
+
+/*
+ * Declare a RuntimeException since the Interface does not declare any
+ * throwables.  Any caught exception will be wrapped in HttpClientException
+ */
+public class HttpClientException extends RuntimeException {
+
+	private static final long serialVersionUID = 1L;
+
+	public HttpClientException (String s) {
+		super (s);
+	}
+	
+	public HttpClientException (Exception e) {
+		super ("Caught nested exception in HttpClient", e);
+	}
+	
+	public HttpClientException (String s, Exception e) {
+		super (s, e);
+	}
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientRedirectStrategy.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientRedirectStrategy.java
new file mode 100644
index 0000000000..809c5d0175
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientRedirectStrategy.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.connector.http;
+
+import java.net.URI;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.ProtocolException;
+import org.apache.http.annotation.Immutable;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpHead;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.apache.http.protocol.HttpContext;
+
+/**
+ * Custom {@link org.apache.http.client.RedirectStrategy} implementation
+ * that automatically redirects all HEAD, GET and DELETE requests.
+ * The {@link org.apache.http.client.DefaultRedirectStrategy} only
+ * redirects GET and HEAD automatically, per the HTTP specification
+ * (POST and PUT typically have bodies and thus cannot be redirected).
+ * 
+ * A custom strategy is needed for the Openstack API, which can also send
+ * 302 on a DELETE (by name) request, expecting the client to follow the
+ * redirect to perform the actual deletion. 
+ */
+@Immutable
+public class HttpClientRedirectStrategy extends DefaultRedirectStrategy {
+
+    /**
+     * Redirectable methods.
+     */
+    private static final String[] REDIRECT_METHODS = new String[] {
+        HttpGet.METHOD_NAME,
+        HttpDelete.METHOD_NAME,
+        HttpHead.METHOD_NAME
+    };
+
+    /**
+     * Determine if the request should be redirected.
+     * This may not actually be needed, since the REDIRECT_METHODS
+     * array has been updated with the DELETE.
+     */
+    @Override
+    protected boolean isRedirectable(final String method) {
+        for (final String m: REDIRECT_METHODS) {
+            if (m.equalsIgnoreCase(method)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Override the default redirect handling method.  As implemented
+     * in HttpClient, it does not preserve the method on 301 or 302
+     * responses, always redirecting to a GET.
+     */
+    @Override
+    public HttpUriRequest getRedirect(
+            final HttpRequest request,
+            final HttpResponse response,
+            final HttpContext context) throws ProtocolException {
+    	
+        final URI uri = getLocationURI(request, response, context);
+        final String method = request.getRequestLine().getMethod();
+        if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {
+            return new HttpHead(uri);
+        } else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {
+            return new HttpGet(uri);
+        } else {
+
+            final int status = response.getStatusLine().getStatusCode();
+            
+        	HttpUriRequest newRequest = null;
+        	if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_TEMPORARILY) {
+                newRequest = RequestBuilder.copy(request).setUri(uri).build();
+            } else {
+                newRequest =  new HttpGet(uri);
+            }
+        	return newRequest;
+        }
+    }
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientResponse.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientResponse.java
new file mode 100644
index 0000000000..a49f96cf0d
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientResponse.java
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.connector.http;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.openecomp.mso.cloudify.base.client.CloudifyResponse;
+import org.openecomp.mso.logger.MsoLogger;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HttpClientResponse implements CloudifyResponse {
+
+    private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
+	
+    private HttpResponse response = null;
+    private String entityBody = null;
+
+    public HttpClientResponse(HttpResponse response)
+    {
+        this.response = response;
+        
+        // Read the body so InputStream can be closed
+        if (response.getEntity() == null) {
+        	// No body
+        	LOGGER.debug ("No Response Body");
+        	return;
+        }
+        
+		ByteArrayOutputStream responseBody = new ByteArrayOutputStream();
+		try {
+			response.getEntity().writeTo(responseBody);
+		} catch (IOException e) {
+			throw new HttpClientException ("Error Reading Response Body", e);
+		}
+		entityBody = responseBody.toString();
+		LOGGER.debug (entityBody);
+    }
+
+    
+    @Override
+	public <T> T getEntity (Class<T> returnType) {
+    	// Get appropriate mapper, based on existence of a root element
+		ObjectMapper mapper = HttpClientConnector.getObjectMapper (returnType);
+
+		T resp = null;
+		try {
+			resp = mapper.readValue(entityBody, returnType);
+		} catch (Exception e) {
+			throw new HttpClientException ("Caught exception in getEntity", e);
+		}
+		return resp;
+    }
+
+    @Override
+    public <T> T getErrorEntity(Class<T> returnType) {
+        return getEntity(returnType);
+    }
+
+    @Override
+    public InputStream getInputStream() {
+   		return new ByteArrayInputStream (entityBody.getBytes());
+    }
+
+    @Override
+    public String getHeader(String name) {
+        return response.getFirstHeader(name).getValue();
+    }
+
+    @Override
+    public Map<String, String> headers() {
+        Map<String, String> headers = new HashMap<String, String>();
+
+        Header responseHeaders[] = response.getAllHeaders();
+        for (Header h : responseHeaders) {
+            headers.put(h.getName(), h.getValue());
+        }
+
+        return headers;
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/BlueprintsResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/BlueprintsResource.java
new file mode 100644
index 0000000000..988f8214d1
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/BlueprintsResource.java
@@ -0,0 +1,103 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.client;
+
+import java.io.InputStream;
+
+import org.openecomp.mso.cloudify.v3.model.Blueprint;
+import org.openecomp.mso.cloudify.v3.model.Blueprints;
+import org.openecomp.mso.cloudify.base.client.Entity;
+import org.openecomp.mso.cloudify.base.client.HttpMethod;
+import org.openecomp.mso.cloudify.base.client.CloudifyClient;
+import org.openecomp.mso.cloudify.base.client.CloudifyRequest;
+
+public class BlueprintsResource {
+
+    private final CloudifyClient client;
+
+    public BlueprintsResource(CloudifyClient client) {
+        this.client = client;
+    }
+
+    /*
+     * Upload a blueprint package directly.  The blueprint must be a ZIP archive.
+     * However, this method will not validate this.  
+     */
+    public UploadBlueprint uploadFromStream (String blueprintId, String mainFileName, InputStream blueprint) {
+        return new UploadBlueprint (blueprintId, mainFileName, blueprint, null);
+    }
+
+    public UploadBlueprint uploadFromUrl (String blueprintId, String mainFileName, String blueprintUrl) {
+        return new UploadBlueprint (blueprintId, mainFileName, null, blueprintUrl);
+    }
+
+    public ListBlueprints list() {
+        return new ListBlueprints();
+    }
+
+    public GetBlueprint getById(String id) {
+        return new GetBlueprint(id, null);
+    }
+
+    // Return all of the metadata, but not the plan
+    public GetBlueprint getMetadataById(String id) {
+        return new GetBlueprint(id, "?_include=id,main_file_name,description,tenant_name,created_at,updated_at");
+    }
+
+    public DeleteBlueprint deleteById(String id) {
+        return new DeleteBlueprint(id);
+    }
+
+    public class UploadBlueprint extends CloudifyRequest<Blueprint> {
+        public UploadBlueprint(String blueprintId, String mainFileName, InputStream blueprint, String blueprintUrl) {
+        	// Initialize the request elements dynamically.
+        	// Either a blueprint input stream or a URL will be provided.
+        	// If a URL is provided, add it to the query string
+        	// If a Stream is provided, set it as the Entity body
+        	super(client, HttpMethod.PUT,
+        			"/api/v3/blueprints/" + blueprintId + "?application_file_name=" + mainFileName + ((blueprintUrl != null) ? "&blueprint_archive=" + blueprintUrl : ""),
+        			((blueprint != null) ? Entity.stream(blueprint) : null),
+        			Blueprint.class);
+        }
+    }
+
+    public class DeleteBlueprint extends CloudifyRequest<Blueprint> {
+        public DeleteBlueprint(String blueprintId) {
+            super(client, HttpMethod.DELETE, "/api/v3/blueprints/" + blueprintId, null, Blueprint.class);
+        }
+    }
+
+    public class GetBlueprint extends CloudifyRequest<Blueprint> {
+        public GetBlueprint(String id, String queryArgs) {
+            super(client, HttpMethod.GET, "/api/v3/blueprints/" + id + queryArgs, null, Blueprint.class);
+        }
+    }
+
+    public class ListBlueprints extends CloudifyRequest<Blueprints> {
+        public ListBlueprints() {
+            super(client, HttpMethod.GET, "/api/v3/blueprints", null, Blueprints.class);
+       }
+    }
+
+    // TODO:  DownloadBlueprint is not supported, as it needs to return an input stream
+    //        containing the full blueprint ZIP.
+    //        For a full client library, this will require returning an open stream as the entity...
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/Cloudify.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/Cloudify.java
new file mode 100644
index 0000000000..c0669b9919
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/Cloudify.java
@@ -0,0 +1,83 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.client;
+
+import org.openecomp.mso.cloudify.base.client.CloudifyClient;
+import org.openecomp.mso.cloudify.base.client.CloudifyClientConnector;
+
+/**
+ * Reference: http://docs.getcloudify.org/api/v3/
+ */
+public class Cloudify extends CloudifyClient {
+
+    private final DeploymentsResource deployments;
+    private final BlueprintsResource blueprints;
+    private final TokensResource tokens;
+    private final NodeInstancesResource nodeInstances;
+    private final ExecutionsResource executions;
+
+/* Not supporting dynamic connectors
+    public Cloudify(String endpoint, CloudifyClientConnector connector) {
+        super(endpoint, connector);
+        deployments = new DeploymentsResource(this);
+        blueprints = new BlueprintsResource(this);
+        nodeInstances = new NodeInstancesResource(this);
+        tokens = new TokensResource(this);
+    }
+*/
+    public Cloudify(String endpoint, String tenant) {
+        super(endpoint, tenant);
+        deployments = new DeploymentsResource(this);
+        blueprints = new BlueprintsResource(this);
+        nodeInstances = new NodeInstancesResource(this);
+        executions = new ExecutionsResource(this);
+        tokens = new TokensResource(this);
+    }
+
+    public Cloudify(String endpoint) {
+    	super(endpoint);
+        deployments = new DeploymentsResource(this);
+        blueprints = new BlueprintsResource(this);
+        nodeInstances = new NodeInstancesResource(this);
+        executions = new ExecutionsResource(this);
+        tokens = new TokensResource(this);
+    }
+
+    public DeploymentsResource deployments() {
+        return this.deployments;
+    }
+
+    public BlueprintsResource blueprints() {
+        return this.blueprints;
+    }
+
+    public NodeInstancesResource nodeInstances() {
+        return this.nodeInstances;
+    }
+
+    public ExecutionsResource executions() {
+        return this.executions;
+    }
+
+    public TokensResource tokens() {
+        return this.tokens;
+    }
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/DeploymentsResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/DeploymentsResource.java
new file mode 100644
index 0000000000..e115370243
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/DeploymentsResource.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.client;
+
+import org.openecomp.mso.cloudify.v3.model.CreateDeploymentParams;
+import org.openecomp.mso.cloudify.v3.model.Deployment;
+import org.openecomp.mso.cloudify.v3.model.DeploymentOutputs;
+import org.openecomp.mso.cloudify.v3.model.Deployments;
+import org.openecomp.mso.cloudify.base.client.Entity;
+import org.openecomp.mso.cloudify.base.client.HttpMethod;
+import org.openecomp.mso.cloudify.base.client.CloudifyClient;
+import org.openecomp.mso.cloudify.base.client.CloudifyRequest;
+
+public class DeploymentsResource {
+
+    private final CloudifyClient client;
+
+    public DeploymentsResource(CloudifyClient client) {
+        this.client = client;
+    }
+
+    public CreateDeployment create(String deploymentId, CreateDeploymentParams body) {
+        return new CreateDeployment(deploymentId, body);
+    }
+
+    public ListDeployments list() {
+        return new ListDeployments();
+    }
+
+    public GetDeployment byId(String id) {
+        return new GetDeployment(id);
+    }
+
+    public GetDeploymentOutputs outputsById(String id) {
+        return new GetDeploymentOutputs(id);
+    }
+
+    public DeleteDeployment deleteByName(String name) {
+        return new DeleteDeployment(name);
+    }
+
+    public class CreateDeployment extends CloudifyRequest<Deployment> {
+        public CreateDeployment(String deploymentId, CreateDeploymentParams body) {
+            super(client, HttpMethod.PUT, "/api/v3/deployments/" + deploymentId, Entity.json(body), Deployment.class);
+        }
+    }
+
+    public class DeleteDeployment extends CloudifyRequest<Deployment> {
+        public DeleteDeployment(String deploymentId) {
+            super(client, HttpMethod.DELETE, "/api/v3/deployments/" + deploymentId, null, Deployment.class);
+        }
+    }
+
+    public class GetDeployment extends CloudifyRequest<Deployment> {
+        public GetDeployment(String id) {
+            super(client, HttpMethod.GET, "/api/v3/deployments/" + id, null, Deployment.class);
+        }
+    }
+
+    public class GetDeploymentOutputs extends CloudifyRequest<DeploymentOutputs> {
+        public GetDeploymentOutputs(String id) {
+            super(client, HttpMethod.GET, "/api/v3/deployments/" + id + "/outputs", null, DeploymentOutputs.class);
+        }
+    }
+
+    public class ListDeployments extends CloudifyRequest<Deployments> {
+        public ListDeployments() {
+            super(client, HttpMethod.GET, "/api/v3/deployments", null, Deployments.class);
+       }
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/ExecutionsResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/ExecutionsResource.java
new file mode 100644
index 0000000000..43bc82b0b3
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/ExecutionsResource.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.client;
+
+import org.openecomp.mso.cloudify.v3.model.CancelExecutionParams;
+import org.openecomp.mso.cloudify.v3.model.Execution;
+import org.openecomp.mso.cloudify.v3.model.Executions;
+import org.openecomp.mso.cloudify.v3.model.StartExecutionParams;
+import org.openecomp.mso.cloudify.v3.model.UpdateExecutionParams;
+import org.openecomp.mso.cloudify.base.client.Entity;
+import org.openecomp.mso.cloudify.base.client.HttpMethod;
+import org.openecomp.mso.cloudify.base.client.CloudifyClient;
+import org.openecomp.mso.cloudify.base.client.CloudifyRequest;
+
+public class ExecutionsResource {
+
+    private final CloudifyClient client;
+
+    public ExecutionsResource(CloudifyClient client) {
+        this.client = client;
+    }
+
+    public ListExecutions list() {
+        return new ListExecutions(null);
+    }
+
+    public ListExecutions listSorted (String sortBy) {
+        return new ListExecutions("?_sort=" + sortBy);
+    }
+    
+    // Return a filtered list.
+    // The filter parameter should be a query string of filter criteria (without leading "?")
+    public ListExecutions listFiltered (String filter, String sortBy) {
+    	String listParams = "?" + filter;
+    	if (sortBy != null)  listParams += "&_sort=" + sortBy;
+        return new ListExecutions(listParams);
+    }
+    
+    public GetExecution byId(String id) {
+        return new GetExecution(id);
+    }
+
+    public StartExecution start(StartExecutionParams params) {
+        return new StartExecution(params);
+    }
+    
+    public UpdateExecution updateStatus(String id, String status) {
+    	UpdateExecutionParams params = new UpdateExecutionParams();
+    	params.setStatus(status);
+        return new UpdateExecution(id, params);
+    }
+
+    public CancelExecution cancel(String executionId, CancelExecutionParams params) {
+        return new CancelExecution(executionId, params);
+    }
+    
+
+    public class GetExecution extends CloudifyRequest<Execution> {
+        public GetExecution (String id) {
+            super(client, HttpMethod.GET, "/api/v3/executions/" + id, null, Execution.class);
+        }
+    }
+
+    public class ListExecutions extends CloudifyRequest<Executions> {
+        public ListExecutions(String listParams) {
+            super(client, HttpMethod.GET, "/api/v3/executions" + ((listParams!=null) ? listParams : ""), null, Executions.class);
+       }
+    }
+
+    public class StartExecution extends CloudifyRequest<Execution> {
+        public StartExecution(StartExecutionParams body) {
+            super(client, HttpMethod.POST, "/api/v3/executions", Entity.json(body), Execution.class);
+        }
+    }
+
+    public class UpdateExecution extends CloudifyRequest<Execution> {
+        public UpdateExecution(String executionId, UpdateExecutionParams body) {
+            super(client, HttpMethod.PATCH, "/api/v3/executions/" + executionId, Entity.json(body), Execution.class);
+        }
+    }
+
+    public class CancelExecution extends CloudifyRequest<Execution> {
+        public CancelExecution(String executionId, CancelExecutionParams body) {
+            super(client, HttpMethod.POST, "/api/v3/executions/" + executionId, Entity.json(body), Execution.class);
+        }
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/NodeInstancesResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/NodeInstancesResource.java
new file mode 100644
index 0000000000..19f7958434
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/NodeInstancesResource.java
@@ -0,0 +1,70 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.client;
+
+import org.openecomp.mso.cloudify.v3.model.UpdateNodeInstanceParams;
+import org.openecomp.mso.cloudify.v3.model.NodeInstance;
+import org.openecomp.mso.cloudify.v3.model.NodeInstances;
+import org.openecomp.mso.cloudify.base.client.Entity;
+import org.openecomp.mso.cloudify.base.client.HttpMethod;
+import org.openecomp.mso.cloudify.base.client.CloudifyClient;
+import org.openecomp.mso.cloudify.base.client.CloudifyRequest;
+
+public class NodeInstancesResource {
+
+    private final CloudifyClient client;
+
+    public NodeInstancesResource(CloudifyClient client) {
+        this.client = client;
+    }
+
+    public ListNodeInstances list() {
+        return new ListNodeInstances();
+    }
+
+    public GetNodeInstance byId(String id) {
+        return new GetNodeInstance(id);
+    }
+
+    public UpdateNodeInstance update(String id, UpdateNodeInstanceParams params) {
+        return new UpdateNodeInstance(id, params);
+    }
+
+
+    public class GetNodeInstance extends CloudifyRequest<NodeInstance> {
+        public GetNodeInstance (String id) {
+            super(client, HttpMethod.GET, "/api/v3/node-instances/" + id, null, NodeInstance.class);
+        }
+    }
+
+    public class ListNodeInstances extends CloudifyRequest<NodeInstances> {
+        public ListNodeInstances() {
+            super(client, HttpMethod.GET, "/api/v3/node-instances", null, NodeInstances.class);
+       }
+    }
+
+    public class UpdateNodeInstance extends CloudifyRequest<NodeInstance> {
+        public UpdateNodeInstance(String nodeInstanceId, UpdateNodeInstanceParams body) {
+            super(client, HttpMethod.PATCH, "/api/v3/node-instances/" + nodeInstanceId, Entity.json(body), NodeInstance.class);
+        }
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/TokensResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/TokensResource.java
new file mode 100644
index 0000000000..80e5fb0065
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/TokensResource.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.client;
+
+import org.openecomp.mso.cloudify.v3.model.Token;
+import org.openecomp.mso.cloudify.base.client.HttpMethod;
+import org.openecomp.mso.cloudify.base.client.CloudifyClient;
+import org.openecomp.mso.cloudify.base.client.CloudifyRequest;
+
+public class TokensResource {
+
+    private final CloudifyClient client;
+
+    public TokensResource(CloudifyClient client) {
+        this.client = client;
+    }
+
+    /*
+     * Get a new token for a user
+     * TODO:  User ID/Password logic need to be in the Client.
+     * Results of a token query should also be able to add to the Client
+     */
+    public GetToken token() {
+        return new GetToken();
+    }
+
+    public class GetToken extends CloudifyRequest<Token> {
+        public GetToken() {
+            super(client, HttpMethod.GET, "/api/v3/tokens", null, Token.class);
+        }
+    }
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprint.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprint.java
new file mode 100644
index 0000000000..a33c5206f2
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprint.java
@@ -0,0 +1,160 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+//@JsonRootName("blueprint")
+public class Blueprint implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonProperty("created_at")
+    private Date createdAt;
+
+    @JsonProperty("description")
+    private String description;
+
+    @JsonProperty("id")
+    private String id;
+    
+    @JsonProperty("main_file_name")
+    private String mainFileName;
+    
+    @JsonProperty("plan")
+    private Map<String, Object> plan = null;
+    
+    @JsonProperty("tenant_name")
+    private String tenantName;
+    
+    @JsonProperty("updated_at")
+    private Date updatedAt;
+    
+    // ObjectMapper instance to parse Json stack outputs
+    @JsonIgnore
+	private static ObjectMapper mapper = new ObjectMapper();
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+    
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getMainFileName() {
+        return mainFileName;
+    }
+
+    public void setMainFileName(String mainFileName) {
+        this.mainFileName = mainFileName;
+    }
+    
+    public Map<String, Object> getPlan() {
+    	return this.plan;
+    }
+    
+    public void setPlan(Map<String, Object> plan) {
+    	this.plan = plan;
+    }
+
+    public String getTenantName() {
+		return tenantName;
+	}
+
+	public void setTenantName(String tenantName) {
+		this.tenantName = tenantName;
+	}
+
+	public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+
+	/*
+	 * Return an  output as a Json-mapped Object of the provided type.
+	 * This is useful for json-object outputs.
+	 */
+	public <T> T getMapValue (Map<String,Object> map, String key, Class<T> type)
+	{
+		if (map.containsKey(key)) {
+			try {
+				String s = mapper.writeValueAsString(map.get(key));
+				return (mapper.readValue(s, type));
+			}
+			catch (IOException e) {
+				return null;
+			}
+		}
+		return null;
+	}
+
+	@Override
+    public String toString() {
+        return "Deployment{" +
+                "id='" + id + '\'' +
+                ", description='" + description + '\'' +
+                ", createdAt=" + createdAt +
+                ", updatedAt=" + updatedAt +
+                ", mainFileName='" + mainFileName + '\'' +
+                ", tenantName='" + tenantName + '\'' +
+                '}';
+    }
+
+    /*  Add a definition of the Cloudify "plan" attribute once we know what it is.
+
+	@JsonIgnoreProperties(ignoreUnknown=true)
+	public static final class Plan {
+	}
+	
+*/
+    
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprints.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprints.java
new file mode 100644
index 0000000000..bf9b376eaa
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprints.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class Blueprints implements Serializable{
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonProperty("items")
+	private List<Blueprint> items;
+	
+	@JsonProperty("metadata")
+	private Metadata metadata;
+	
+	public List<Blueprint> getItems() {
+		return items;
+	}
+
+	public void setItems(List<Blueprint> items) {
+		this.items = items;
+	}
+
+	public Metadata getMetadata() {
+		return metadata;
+	}
+
+	public void setMetadata(Metadata metadata) {
+		this.metadata = metadata;
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CancelExecutionParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CancelExecutionParams.java
new file mode 100644
index 0000000000..5d7672549b
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CancelExecutionParams.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class CancelExecutionParams implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("action")
+    private String action;
+    
+    public final static String CANCEL_ACTION = "cancel";
+    public final static String FORCE_CANCEL_ACTION = "force-cancel";
+    
+    public String getAction() {
+		return action;
+	}
+
+	public void setAction(String action) {
+		this.action = action;
+	}
+
+
+	@Override
+    public String toString() {
+        return "CancelExecutionParams{" +
+                "action='" + action + '\'' +
+                '}';
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CloudifyError.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CloudifyError.java
new file mode 100644
index 0000000000..fcd9120c78
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CloudifyError.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * This class represents a generic Cloudify error response body.
+ * These responses have a common format:
+ * {
+ *     "message": "<error message>",
+ *     "error_code": "<cloudify error id string>".
+ *     "server_traceback": "<Python traceback>"
+ * }
+ * 
+ * @author jc1348
+ */
+public class CloudifyError implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@JsonProperty("message")
+	private String message;
+	
+	@JsonProperty("error_code")
+	private String errorCode;
+	
+	@JsonProperty("server_traceback")
+	private String serverTraceback;
+	
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public String getErrorCode() {
+		return errorCode;
+	}
+
+	public void setErrorCode(String errorCode) {
+		this.errorCode = errorCode;
+	}
+
+	public String getServerTraceback() {
+		return serverTraceback;
+	}
+
+	public void setServerTraceback(String serverTraceback) {
+		this.serverTraceback = serverTraceback;
+	}
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CreateDeploymentParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CreateDeploymentParams.java
new file mode 100644
index 0000000000..f33b7afe4c
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CreateDeploymentParams.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public class CreateDeploymentParams implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("blueprint_id")
+    private String blueprintId;
+
+    @JsonProperty("inputs")
+    private Map<String, Object> inputs;
+
+	public String getBlueprintId() {
+		return blueprintId;
+	}
+
+	public void setBlueprintId(String blueprintId) {
+		this.blueprintId = blueprintId;
+	}
+
+	public Map<String, Object> getInputs() {
+		return inputs;
+	}
+
+	public void setInputs(Map<String, Object> inputs) {
+		this.inputs = inputs;
+	}
+
+    @Override
+    public String toString() {
+        return "CreateDeploymentBody{" +
+                "blueprintId='" + blueprintId + '\'' +
+                ", inputs=" + inputs +
+                '}';
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployment.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployment.java
new file mode 100644
index 0000000000..453dd3f692
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployment.java
@@ -0,0 +1,351 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+//@JsonRootName("deployment")
+public class Deployment implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("blueprint_id")
+    private String blueprintId;
+
+    @JsonProperty("created_at")
+    private Date createdAt;
+
+    @JsonProperty("created_by")
+    private String createdBy;
+
+    @JsonProperty("description")
+    private String description;
+
+    @JsonProperty("groups")
+    private Map<String, Group> groups = null;
+    
+    @JsonProperty("id")
+    private String id;
+    
+    @JsonProperty("inputs")
+    private Map<String, Object> inputs = null;
+    
+    // TODO: Expand the definition of a PolicyTrigger
+    @JsonProperty("policy_triggers")
+    private List<Object> policyTriggers;
+
+    // TODO: Expand the definition of a PolicyType
+    @JsonProperty("policy_types")
+    private List<Object> policyTypes;
+
+    @JsonProperty("scaling_groups")
+    private Map<String, ScalingGroup> scalingGroups = null;
+    
+    @JsonProperty("tenant_name")
+    private String tenantName;
+
+    @JsonProperty("updated_at")
+    private Date updatedAt;
+
+    @JsonProperty("workflows")
+    private List<Workflow> workflows;
+
+    // ObjectMapper instance to parse Json object outputs
+    @JsonIgnore
+	private static ObjectMapper mapper = new ObjectMapper();
+
+    public String getBlueprintId() {
+        return blueprintId;
+    }
+
+    public void setBlueprintId(String blueprintId) {
+        this.blueprintId = blueprintId;
+    }
+   
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public String getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(String createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+    
+    public Map<String, Group> getGroups() {
+    	return this.groups;
+    }
+    
+    public void setGroups(Map<String, Group> groups) {
+    	this.groups = groups;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Map<String, Object> getInputs() {
+    	return this.inputs;
+    }
+    public void setInputs(Map<String, Object> inputs) {
+    	this.inputs = inputs;
+    }
+
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+
+    public Map<String, ScalingGroup> getScalingGroups() {
+		return scalingGroups;
+	}
+
+	public void setScalingGroups(Map<String, ScalingGroup> scalingGroups) {
+		this.scalingGroups = scalingGroups;
+	}
+
+	public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public List<Workflow> getWorkflows() {
+        return workflows;
+    }
+
+    public void setWorkflows(List<Workflow> workflows) {
+        this.workflows = workflows;
+    }
+
+    /*
+     * Nested subclasses for Group definitions
+     */
+    public static final class Group {
+    	@JsonProperty ("policies")
+    	Object policies;
+    	
+    	@JsonProperty("members")
+    	List<String> members;
+
+		public Object getPolicies() {
+			return policies;
+		}
+
+		public void setPolicies(Object policies) {
+			this.policies = policies;
+		}
+
+		public List<String> getMembers() {
+			return members;
+		}
+
+		public void setMembers(List<String> members) {
+			this.members = members;
+		}
+    }
+
+    /*
+     * Nested subclasses for Scaling Group definitions
+     */
+    public static final class ScalingGroup {
+    	@JsonProperty ("properties")
+    	ScalingGroupProperties properties;
+    	
+    	@JsonProperty("members")
+    	List<String> members;
+
+		public ScalingGroupProperties getProperties() {
+			return properties;
+		}
+
+		public void setProperties(ScalingGroupProperties properties) {
+			this.properties = properties;
+		}
+
+		public List<String> getMembers() {
+			return members;
+		}
+
+		public void setMembers(List<String> members) {
+			this.members = members;
+		}
+    }
+
+    public static final class ScalingGroupProperties {
+    	@JsonProperty("current_instances")
+    	int currentInstances;
+    	
+    	@JsonProperty("default_instances")
+    	int defaultInstances;
+    	
+    	@JsonProperty("max_instances")
+    	int maxInstances;
+    	
+    	@JsonProperty("min_instances")
+    	int minInstances;
+    	
+    	@JsonProperty("planned_instances")
+    	int plannedInstances;
+
+		public int getCurrentInstances() {
+			return currentInstances;
+		}
+
+		public void setCurrentInstances(int currentInstances) {
+			this.currentInstances = currentInstances;
+		}
+
+		public int getDefaultInstances() {
+			return defaultInstances;
+		}
+
+		public void setDefaultInstances(int defaultInstances) {
+			this.defaultInstances = defaultInstances;
+		}
+
+		public int getMaxInstances() {
+			return maxInstances;
+		}
+
+		public void setMaxInstances(int maxInstances) {
+			this.maxInstances = maxInstances;
+		}
+
+		public int getMinInstances() {
+			return minInstances;
+		}
+
+		public void setMinInstances(int minInstances) {
+			this.minInstances = minInstances;
+		}
+
+		public int getPlannedInstances() {
+			return plannedInstances;
+		}
+
+		public void setPlannedInstances(int plannedInstances) {
+			this.plannedInstances = plannedInstances;
+		}
+    }
+    
+    /*
+     * Nested subclass for Deployment Workflow entities.
+     * Note that Blueprint class also contains a slightly different Workflow structure.
+     */
+    public static final class Workflow {
+    	@JsonProperty("name")
+    	private String name;
+    	@JsonProperty("created_at")
+    	private Date createdAt;
+    	@JsonProperty("parameters")
+    	private Map<String,ParameterDefinition> parameters;
+    	
+    	public Workflow() {}
+    	
+		public String getName() {
+			return name;
+		}
+		public void setName(String name) {
+			this.name = name;
+		}
+		public Date getCreatedAt() {
+			return createdAt;
+		}
+		public void setCreatedAt(Date createdAt) {
+			this.createdAt = createdAt;
+		}
+		public Map<String, ParameterDefinition> getParameters() {
+			return parameters;
+		}
+		public void setParameters(Map<String, ParameterDefinition> parameters) {
+			this.parameters = parameters;
+		}
+    }
+    
+	/*
+	 * Return an  output as a Json-mapped Object of the provided type.
+	 * This is useful for json-object outputs.
+	 */
+	public <T> T getMapValue (Map<String,Object> map, String key, Class<T> type)
+	{
+		if (map.containsKey(key)) {
+			try {
+				String s = mapper.writeValueAsString(map.get(key));
+				return (mapper.readValue(s, type));
+			}
+			catch (IOException e) {
+				return null;
+			}
+		}
+		return null;
+	}
+
+	@Override
+    public String toString() {
+        return "Deployment{" +
+                "id='" + id + '\'' +
+                ", description='" + description + '\'' +
+                ", blueprintId='" + blueprintId + '\'' +
+                ", createdBy='" + createdBy + '\'' +
+                ", tenantName='" + tenantName + '\'' +
+                ", createdAt=" + createdAt +
+                ", updatedAt=" + updatedAt +
+                ", inputs='" + inputs + '\'' +
+                ", workflows=" + workflows +
+                ", groups=" + groups +
+                '}';
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/DeploymentOutputs.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/DeploymentOutputs.java
new file mode 100644
index 0000000000..11fe7faae0
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/DeploymentOutputs.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+//@JsonRootName("outputs")
+public class DeploymentOutputs implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("deployment_id")
+    private String deploymentId;
+    
+    @JsonProperty("outputs")
+    private Map<String, Object> outputs = null;
+    
+
+    // ObjectMapper instance to parse Json object outputs
+    @JsonIgnore
+	private static ObjectMapper mapper = new ObjectMapper();
+
+
+    public Map<String, Object> getOutputs() {
+    	return this.outputs;
+    }
+    public void setOutputs(Map<String, Object> outputs) {
+    	this.outputs = outputs;
+    }
+    
+	public String getDeploymentId() {
+		return deploymentId;
+	}
+	public void setDeploymentId(String deploymentId) {
+		this.deploymentId = deploymentId;
+	}
+	
+	/*
+	 * Return an  output as a Json-mapped Object of the provided type.
+	 * This is useful for json-object outputs.
+	 */
+	public <T> T getMapValue (Map<String,Object> map, String key, Class<T> type)
+	{
+		if (map.containsKey(key)) {
+			try {
+				String s = mapper.writeValueAsString(map.get(key));
+				return (mapper.readValue(s, type));
+			}
+			catch (IOException e) {
+				return null;
+			}
+		}
+		return null;
+	}
+
+	@Override
+    public String toString() {
+        return "DeploymentOutputs{" +
+                "deploymentId='" + deploymentId + '\'' +
+                ", outputs='" + outputs + '\'' +
+                '}';
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployments.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployments.java
new file mode 100644
index 0000000000..eb49848869
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployments.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class Deployments implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@JsonProperty("items")
+	private List<Deployment> items;
+	
+	@JsonProperty("metadata")
+	private Metadata metadata;
+	
+	public List<Deployment> getItems() {
+		return items;
+	}
+
+	public void setItems(List<Deployment> items) {
+		this.items = items;
+	}
+
+	public Metadata getMetadata() {
+		return metadata;
+	}
+
+	public void setMetadata(Metadata metadata) {
+		this.metadata = metadata;
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Execution.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Execution.java
new file mode 100644
index 0000000000..65a1015539
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Execution.java
@@ -0,0 +1,174 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+// @JsonRootName("execution")
+public class Execution implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("blueprint_id")
+    private String blueprintId;
+
+    @JsonProperty("created_at")
+    private Date createdAt;
+
+    @JsonProperty("created_by")
+    private String createdBy;
+
+    @JsonProperty("deployment_id")
+    private String deploymentId;
+
+    @JsonProperty("error")
+    private String error;
+    
+    @JsonProperty("id")
+    private String id;
+    
+    @JsonProperty("is_system_workflow")
+    private boolean isSystemWorkflow;
+    
+    @JsonProperty("parameters")
+    private Map<String, Object> parameters;
+    
+    @JsonProperty("status")
+    private String status;
+    
+    @JsonProperty("tenant_name")
+    private String tenantName;
+    
+    @JsonProperty("workflow_id")
+    private String workflowId;
+
+	public String getBlueprintId() {
+		return blueprintId;
+	}
+
+	public void setBlueprintId(String blueprintId) {
+		this.blueprintId = blueprintId;
+	}
+
+	public Date getCreatedAt() {
+		return createdAt;
+	}
+
+	public void setCreatedAt(Date createdAt) {
+		this.createdAt = createdAt;
+	}
+
+	public String getCreatedBy() {
+		return createdBy;
+	}
+
+	public void setCreatedBy(String createdBy) {
+		this.createdBy = createdBy;
+	}
+
+	public String getDeploymentId() {
+		return deploymentId;
+	}
+
+	public void setDeploymentId(String deploymentId) {
+		this.deploymentId = deploymentId;
+	}
+
+	public String getError() {
+		return error;
+	}
+
+	public void setError(String error) {
+		this.error = error;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public boolean isSystemWorkflow() {
+		return isSystemWorkflow;
+	}
+
+	public void setSystemWorkflow(boolean isSystemWorkflow) {
+		this.isSystemWorkflow = isSystemWorkflow;
+	}
+
+	public Map<String, Object> getParameters() {
+		return parameters;
+	}
+
+	public void setParameters(Map<String, Object> parameters) {
+		this.parameters = parameters;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public String getTenantName() {
+		return tenantName;
+	}
+
+	public void setTenantName(String tenantName) {
+		this.tenantName = tenantName;
+	}
+
+	public String getWorkflowId() {
+		return workflowId;
+	}
+
+	public void setWorkflowId(String workflowId) {
+		this.workflowId = workflowId;
+	}
+
+	@Override
+    public String toString() {
+        return "Execution{" +
+                "id='" + id + '\'' +
+                ", blueprintId='" + blueprintId + '\'' +
+                ", createdBy='" + createdBy + '\'' +
+                ", createdAt=" + createdAt +
+                ", deploymentId='" + deploymentId + '\'' +
+                ", error=" + error +
+                ", isSystemWorkflow=" + isSystemWorkflow +
+                ", status=" + status +
+                ", tenantName='" + tenantName + '\'' +
+                ", parameters=" + parameters +
+                '}';
+    }
+
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Executions.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Executions.java
new file mode 100644
index 0000000000..a1d9077864
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Executions.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class Executions implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@JsonProperty("items")
+	private List<Execution> items;
+	
+	@JsonProperty("metadata")
+	private Metadata metadata;
+	
+	public List<Execution> getItems() {
+		return items;
+	}
+
+	public void setItems(List<Execution> items) {
+		this.items = items;
+	}
+
+	public Metadata getMetadata() {
+		return metadata;
+	}
+
+	public void setMetadata(Metadata metadata) {
+		this.metadata = metadata;
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Metadata.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Metadata.java
new file mode 100644
index 0000000000..d44e92b1bc
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Metadata.java
@@ -0,0 +1,84 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+
+/**
+ * This class represents a generic Cloudify response to a GET command.
+ * These responses have a common format:
+ * {
+ *     "items": [
+ *          List of objects of the requested type
+ *     ],
+ *     "metadata": {
+ *     }
+ * }
+ * 
+ * @author jc1348
+ *
+ */
+public class Metadata implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@JsonProperty("pagination")
+	private Pagination pagination;
+	
+
+	public Pagination getPagination() {
+		return pagination;
+	}
+
+	public void setPagination(Pagination pagination) {
+		this.pagination = pagination;
+	}
+
+	public class Pagination {
+		@JsonProperty("total")
+		private int total;
+		@JsonProperty("offset")
+		private int offset;
+		@JsonProperty("size")
+		private int size;
+		
+		public int getTotal() {
+			return total;
+		}
+		public void setTotal(int total) {
+			this.total = total;
+		}
+		public int getOffset() {
+			return offset;
+		}
+		public void setOffset(int offset) {
+			this.offset = offset;
+		}
+		public int getSize() {
+			return size;
+		}
+		public void setSize(int size) {
+			this.size = size;
+		}
+	}
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstance.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstance.java
new file mode 100644
index 0000000000..f23d9bebd5
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstance.java
@@ -0,0 +1,205 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonRootName("node_instance")
+public class NodeInstance implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@JsonProperty("created_by")
+    private String createdBy;
+
+    @JsonProperty("deployment_id")
+    private String deploymentId;
+
+    @JsonProperty("host_id")
+    private String hostId;
+
+    @JsonProperty("id")
+    private String id;
+    
+    @JsonProperty("node_id")
+    private String nodeId;
+    
+    @JsonProperty("relationships")
+    private List<Object> relationships = null;
+    
+    @JsonProperty("runtime_properties")
+    private Map<String, Object> runtimeProperties = null;
+    
+    @JsonProperty("scaling_groups")
+    private List<ScalingGroupIdentifier> scalingGroups;
+    
+    @JsonProperty("state")
+    private String state;
+
+    @JsonProperty("tenant_name")
+    private String tenantName;
+
+    @JsonProperty("version")
+    private String version;
+
+	public String getCreatedBy() {
+		return createdBy;
+	}
+
+	public void setCreatedBy(String createdBy) {
+		this.createdBy = createdBy;
+	}
+
+	public String getDeploymentId() {
+		return deploymentId;
+	}
+
+	public void setDeploymentId(String deploymentId) {
+		this.deploymentId = deploymentId;
+	}
+
+	public String getHostId() {
+		return hostId;
+	}
+
+	public void setHostId(String hostId) {
+		this.hostId = hostId;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getNodeId() {
+		return nodeId;
+	}
+
+	public void setNodeId(String nodeId) {
+		this.nodeId = nodeId;
+	}
+
+	public List<Object> getRelationships() {
+		return relationships;
+	}
+
+	public void setRelationships(List<Object> relationships) {
+		this.relationships = relationships;
+	}
+
+	public Map<String, Object> getRuntimeProperties() {
+		return runtimeProperties;
+	}
+
+	public void setRuntimeProperties(Map<String, Object> runtimeProperties) {
+		this.runtimeProperties = runtimeProperties;
+	}
+
+	public List<ScalingGroupIdentifier> getScalingGroups() {
+		return scalingGroups;
+	}
+
+	public void setScalingGroups(List<ScalingGroupIdentifier> scalingGroups) {
+		this.scalingGroups = scalingGroups;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getTenantName() {
+		return tenantName;
+	}
+
+	public void setTenantName(String tenantName) {
+		this.tenantName = tenantName;
+	}
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	/*
+	 * Nested structure representing scaling groups in which this node is a member
+	 */
+	public static final class ScalingGroupIdentifier
+	{
+		@JsonProperty("name")
+		private String name;
+		
+		@JsonProperty("id")
+		private String id;
+		
+		public String getName() {
+			return name;
+		}
+		public void setName(String name) {
+			this.name = name;
+		}
+		public String getId() {
+			return id;
+		}
+		public void setId(String id) {
+			this.id = id;
+		}
+		
+		public String toString() {
+			return "Scaling Group{ name=" + name + ", id=" + id + "}";
+		}
+	}
+	
+	@Override
+    public String toString() {
+        return "Deployment{" +
+                "id='" + id + '\'' +
+                "nodeId='" + nodeId + '\'' +
+                ", createdBy='" + createdBy + '\'' +
+                ", tenantName='" + tenantName + '\'' +
+                ", state=" + state +
+                ", deploymentId=" + deploymentId +
+                ", hostId='" + hostId + '\'' +
+                ", version='" + version + '\'' +
+                ", relationships=" + relationships +
+                ", runtimeProperties=" + runtimeProperties +
+                ", scalingGroups=" + scalingGroups +
+                '}';
+    }
+
+	// TODO:  Need an object structure for Relationships
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstances.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstances.java
new file mode 100644
index 0000000000..bac826cda0
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstances.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class NodeInstances implements Serializable{
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonProperty("items")
+	private List<NodeInstance> items;
+	
+	@JsonProperty("metadata")
+	private Metadata metadata;
+	
+	public List<NodeInstance> getItems() {
+		return items;
+	}
+
+	public void setItems(List<NodeInstance> items) {
+		this.items = items;
+	}
+
+	public Metadata getMetadata() {
+		return metadata;
+	}
+
+	public void setMetadata(Metadata metadata) {
+		this.metadata = metadata;
+	}
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/OpenstackConfig.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/OpenstackConfig.java
new file mode 100644
index 0000000000..2d927e64e6
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/OpenstackConfig.java
@@ -0,0 +1,89 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class OpenstackConfig implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@JsonProperty("username")
+	String username;
+
+	@JsonProperty("password")
+	String password;
+
+	@JsonProperty("tenant_name")
+	String tenantName;
+
+	@JsonProperty("auth_url")
+	String authUrl;
+
+	@JsonProperty("region")
+	String region;
+
+	// NOTE:  Not supporting "custom_configuration"
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getTenantName() {
+		return tenantName;
+	}
+
+	public void setTenantName(String tenantName) {
+		this.tenantName = tenantName;
+	}
+
+	public String getAuthUrl() {
+		return authUrl;
+	}
+
+	public void setAuthUrl(String authUrl) {
+		this.authUrl = authUrl;
+	}
+
+	public String getRegion() {
+		return region;
+	}
+
+	public void setRegion(String region) {
+		this.region = region;
+	}
+
+	
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/ParameterDefinition.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/ParameterDefinition.java
new file mode 100644
index 0000000000..677c982621
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/ParameterDefinition.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ParameterDefinition implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@JsonProperty("type")
+	private String type;
+	@JsonProperty("description")
+	private String description;
+	@JsonProperty("default")
+	private Object defaultValue;
+	
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public Object getDefaultValue() {
+		return defaultValue;
+	}
+	public void setDefaultValue(Object defaultValue) {
+		this.defaultValue = defaultValue;
+	}
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/StartExecutionParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/StartExecutionParams.java
new file mode 100644
index 0000000000..397f867e7d
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/StartExecutionParams.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class StartExecutionParams implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("workflow_id")
+    private String workflowId;
+    
+    @JsonProperty("deployment_id")
+    private String deploymentId;
+
+    @JsonProperty("allow_custom_parameters")
+    private boolean allowCustomParameters;
+
+    @JsonProperty("force")
+    private boolean force;
+
+    @JsonProperty("parameters")
+    private Map<String, Object> parameters;
+    
+	public String getWorkflowId() {
+		return workflowId;
+	}
+
+	public void setWorkflowId(String workflowId) {
+		this.workflowId = workflowId;
+	}
+
+	public String getDeploymentId() {
+		return deploymentId;
+	}
+
+	public void setDeploymentId(String deploymentId) {
+		this.deploymentId = deploymentId;
+	}
+
+	public boolean isAllowCustomParameters() {
+		return allowCustomParameters;
+	}
+
+	public void setAllowCustomParameters(boolean allowCustomParameters) {
+		this.allowCustomParameters = allowCustomParameters;
+	}
+
+	public boolean isForce() {
+		return force;
+	}
+
+	public void setForce(boolean force) {
+		this.force = force;
+	}
+
+	public Map<String, Object> getParameters() {
+		return parameters;
+	}
+
+	public void setParameters(Map<String, Object> parameters) {
+		this.parameters = parameters;
+	}
+
+	@Override
+    public String toString() {
+        return "UpdateExecutionParams{" +
+                "workflowId='" + workflowId + '\'' +
+                "deploymentId='" + deploymentId + '\'' +
+                "allowCustomParameters='" + allowCustomParameters + '\'' +
+                "force='" + force + '\'' +
+                "parameters='" + parameters + '\'' +
+                '}';
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Token.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Token.java
new file mode 100644
index 0000000000..ddf264c290
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Token.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+//@JsonRootName("token")
+// The Token object is returned without a root element
+public class Token implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonProperty("role")
+    private String role;
+
+    @JsonProperty("value")
+    private String value;
+    
+    //  Any expiration?  Maybe something in the Headers?
+    
+	public String getRole() {
+		return role;
+	}
+
+	public void setRole(String role) {
+		this.role = role;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+
+	@Override
+    public String toString() {
+        return "Token{" +
+                "role='" + role + '\'' +
+                ", value='" + value + '\'' +
+                '}';
+    }
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateExecutionParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateExecutionParams.java
new file mode 100644
index 0000000000..db827e9761
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateExecutionParams.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class UpdateExecutionParams implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("status")
+    private String status;
+    
+    public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+
+	@Override
+    public String toString() {
+        return "UpdateExecutionParams{" +
+                "status='" + status + '\'' +
+                '}';
+    }
+
+}
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateNodeInstanceParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateNodeInstanceParams.java
new file mode 100644
index 0000000000..c7f6557f7c
--- /dev/null
+++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateNodeInstanceParams.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.cloudify.v3.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public class UpdateNodeInstanceParams implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+    @JsonProperty("state")
+    private String state;
+
+    @JsonProperty("version")
+    private String version;
+
+    @JsonProperty("runtime_properties")
+    private Map<String, Object> runtimeProperties;
+
+
+    public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public Map<String, Object> getRuntimeProperties() {
+		return runtimeProperties;
+	}
+
+	public void setRuntimeProperties(Map<String, Object> runtimeProperties) {
+		this.runtimeProperties = runtimeProperties;
+	}
+
+
+	@Override
+    public String toString() {
+        return "UpdateNodeInstanceParams{" +
+                "state='" + state + '\'' +
+                "version='" + version + '\'' +
+                ", runtimeProperties=" + runtimeProperties +
+                '}';
+    }
+
+}
-- 
cgit