diff --git a/nuvem-amazon/pom.xml b/nuvem-amazon/pom.xml
index 8345338..d4e664c 100644
--- a/nuvem-amazon/pom.xml
+++ b/nuvem-amazon/pom.xml
@@ -57,7 +57,8 @@
                 <inherited>true</inherited>
                 <configuration>
                     <excludes>
-                        <exclude>**/AmazonDataServiceImplTestCase.java</exclude>                        
+                        <exclude>**/AmazonDataServiceImplTestCase.java</exclude>
+                        <exclude>**/AmazonMessageQueueServiceImplTestCase.java</exclude>                             
                     </excludes>                    
                 </configuration>
             </plugin>
diff --git a/nuvem-amazon/src/main/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceImpl.java b/nuvem-amazon/src/main/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceImpl.java
new file mode 100644
index 0000000..3272983
--- /dev/null
+++ b/nuvem-amazon/src/main/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceImpl.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.nuvem.cloud.messageQueueService.impl;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+import org.apache.nuvem.cloud.messageQueueService.MessageQueueService;
+import org.apache.nuvem.cloud.messageQueueService.QueueMessage;
+import org.apache.nuvem.cloud.messageQueueService.QueueMessageHandle;
+import org.apache.nuvem.cloud.messageQueueService.MessageQueueServiceException;
+
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.auth.PropertiesCredentials;
+import com.amazonaws.AmazonClientException;
+import com.amazonaws.AmazonServiceException;
+import com.amazonaws.auth.PropertiesCredentials;
+
+import com.amazonaws.services.sqs.AmazonSQS;
+import com.amazonaws.services.sqs.AmazonSQSClient;
+import com.amazonaws.services.sqs.model.DeleteMessageRequest;
+import com.amazonaws.services.sqs.model.Message;
+import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
+import com.amazonaws.services.sqs.model.SendMessageRequest;
+import com.amazonaws.services.sqs.model.SendMessageResult;
+import com.amazonaws.services.sqs.model.GetQueueUrlRequest;
+import com.amazonaws.services.sqs.model.GetQueueUrlResult;
+
+/**
+ *The AmazonMessageQueueServiceImpl class
+ */
+public class AmazonMessageQueueServiceImpl implements MessageQueueService {
+	
+	public static final String AMAZON_CREDENTIALS_CONFIG_FILE_NAME = "AwsCredentials.properties";
+	public static final String AMAZON_ACCESS_KEY = "accessKey";
+	public static final String AMAZON_SECRET_KEY = "secretKey";
+	public static final String AMAZON_QUEUE_CONFIG_FILE_NAME = "queue.properties";
+	public static final String AMAZON_QUEUE_NAME = "QueueName";
+	public static final String AMAZON_DEFAULT_QUEUE_NAME = "MyQueue";
+	
+	private AmazonSQS sqsClient;
+	private String queueURL;
+	private String queueName;
+	
+	/**
+	 * Instantiates a new AmazonMessageQueueServiceImpl
+	 */
+	public AmazonMessageQueueServiceImpl() {
+		try {
+			this.sqsClient = new AmazonSQSClient(new PropertiesCredentials(
+					AmazonMessageQueueServiceImpl.class.
+	                		getResourceAsStream(AMAZON_CREDENTIALS_CONFIG_FILE_NAME)));
+			
+			this.queueName = AMAZON_DEFAULT_QUEUE_NAME;
+			setQueueURl(queueName);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Instantiates a new AmazonMessageQueueServiceImpl
+	 * 
+	 * @param accessKey The Amazon access key 
+	 * @param secretKey The Amazon secret key
+	 */
+	public AmazonMessageQueueServiceImpl(final String accessKey, final String secretKey) {
+		try{
+			AWSCredentials amazonCredentials = new AWSCredentials() {
+				@Override
+				public String getAWSAccessKeyId() {
+					return accessKey;
+				}
+				
+				@Override
+				public String getAWSSecretKey() {
+					return secretKey;
+				}
+			};
+			
+			sqsClient = new AmazonSQSClient(amazonCredentials);
+			this.queueName = AMAZON_DEFAULT_QUEUE_NAME;
+			setQueueURl(queueName);
+		}catch(Exception e){
+			e.printStackTrace();
+		}		
+	}
+	
+	/**
+	 * Instantiates a new AmazonMessageQueueServiceImpl
+	 * 
+	 * @param configAmazonCredentials Amazon credential configuration
+	 */
+	public AmazonMessageQueueServiceImpl(final Map configAmazonCredentials) {
+		try{
+			AWSCredentials amazonCredentials = new AWSCredentials() {
+				@Override
+				public String getAWSAccessKeyId() {
+					return (String) configAmazonCredentials.get(AMAZON_ACCESS_KEY);
+				}
+				
+				@Override
+				public String getAWSSecretKey() {
+					return (String) configAmazonCredentials.get(AMAZON_SECRET_KEY);
+				}
+			};
+			
+			sqsClient = new AmazonSQSClient(amazonCredentials);
+			this.queueName = AMAZON_DEFAULT_QUEUE_NAME;
+			setQueueURl(queueName);
+		}catch(Exception e){
+			e.printStackTrace();
+		}		
+	}
+	
+	/**
+	 * Instantiates a new AmazonMessageQueueServiceImpl
+	 * 
+	 * @param sqsClient The AmazonSQS client
+	 */
+	public AmazonMessageQueueServiceImpl(AmazonSQSClient sqsClient) {
+		try{
+			this.sqsClient = sqsClient;
+			this.queueName = AMAZON_DEFAULT_QUEUE_NAME;
+			setQueueURl(queueName);
+		}catch(Exception e){
+			e.printStackTrace();
+		}		
+	}
+	
+	/**
+	 * Sets the queueURL using queueName
+	 * 
+	 * @param queueName the queue name
+	 */
+	private void setQueueURl(String queueName) throws IOException  {		
+		GetQueueUrlRequest getQueueUrlRequest = new GetQueueUrlRequest(queueName);
+        GetQueueUrlResult getQueueUrlResult= sqsClient.getQueueUrl(getQueueUrlRequest);
+        this.queueURL = getQueueUrlResult.getQueueUrl();
+	}
+	
+	/**
+	 * Gets the queue name from property file	 
+	 */
+	private String getQueueName() throws IOException {
+		Properties queueProperties = new Properties();
+		queueProperties.load(AmazonMessageQueueServiceImpl.class.
+				getResourceAsStream(AMAZON_QUEUE_CONFIG_FILE_NAME));
+		return queueProperties.getProperty(AMAZON_QUEUE_NAME);
+	}
+	
+	/**
+	 * Sends the message
+	 * 
+	 * @param queueMessage the queue message
+	 * @return the queue message handle
+	 * @throws MessageQueueServiceException
+	 */
+	@Override
+	public QueueMessageHandle sendMessage(QueueMessage queueMessage) throws MessageQueueServiceException {
+		try{
+			SendMessageRequest sendMessageRequest = new SendMessageRequest(queueURL, queueMessage.getMessageBody());
+			SendMessageResult sendMessageResult = sqsClient.sendMessage(sendMessageRequest);
+			QueueMessageHandle queueMessageHandle = new QueueMessageHandle();
+			queueMessageHandle.setId(sendMessageResult.getMessageId());
+			queueMessageHandle.setMessageBody(queueMessage.getMessageBody());
+			return queueMessageHandle;
+		}catch(Exception e){
+			throw new MessageQueueServiceException(e);
+		}
+	}
+	
+	/**
+	 * Receive Messages
+	 * 
+	 * @param numMessages number of messages to receive
+	 * @return list of queue messages
+	 * @throws MessageQueueServiceException
+	 */
+	@Override
+	public List<QueueMessage> receiveMessage(int numMessages) throws MessageQueueServiceException{
+		try{
+			ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(this.queueURL);
+			receiveMessageRequest.setMaxNumberOfMessages(numMessages);
+	        List<Message> messages = sqsClient.receiveMessage(receiveMessageRequest).getMessages();
+	        List<QueueMessage> queueMessages = new ArrayList<QueueMessage>(messages.size());
+	        Iterator messageIterator = messages.iterator();
+	        Message message;
+	        while(messageIterator.hasNext()){
+	        	message = (Message)messageIterator.next();
+	        	queueMessages.add(new QueueMessage(message.getReceiptHandle(), message.getBody()));	        	
+	        }
+	        return queueMessages;
+		}catch(Exception e){			
+			throw new MessageQueueServiceException(e);
+		}
+	}
+	
+	/**
+	 * Deletes the message
+	 * 
+	 * @param queueMessage the message to delete
+	 * @return true, if deleting message is successful
+	 * @throws MessageQueueServiceException
+	 */
+	@Override
+	public boolean deleteMessage(QueueMessage queueMessage) throws MessageQueueServiceException{
+		try{
+			String messageRecieptHandle = queueMessage.getId();
+			sqsClient.deleteMessage(new DeleteMessageRequest(this.queueURL, messageRecieptHandle));
+			return true;
+		}catch(Exception e){
+			throw new MessageQueueServiceException(e);
+		}
+	}
+}
diff --git a/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceClient.java b/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceClient.java
new file mode 100644
index 0000000..b640e6b
--- /dev/null
+++ b/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceClient.java
@@ -0,0 +1,29 @@
+
+package org.apache.nuvem.cloud.messageQueueService.impl;
+
+import com.amazonaws.AmazonWebServiceClient;
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.services.sqs.AmazonSQSClient;
+
+public class AmazonMessageQueueServiceClient {
+	
+	public static AmazonWebServiceClient getAmazonSQSClient(final String accessKey, final String secretKey) {	
+		
+		if(accessKey == null || secretKey == null){
+			return new MockAmazonSQSClient();
+		}
+		
+		AWSCredentials awsCredentials = new AWSCredentials() {
+			@Override
+			public String getAWSAccessKeyId() {
+				return accessKey;
+			}
+			@Override
+			public String getAWSSecretKey() {
+				return secretKey;
+			}
+		};
+		
+		return  new AmazonSQSClient(awsCredentials);
+	}
+}
\ No newline at end of file
diff --git a/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceImplTestCase.java b/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceImplTestCase.java
new file mode 100644
index 0000000..fae4acf
--- /dev/null
+++ b/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/AmazonMessageQueueServiceImplTestCase.java
@@ -0,0 +1,149 @@
+
+package org.apache.nuvem.cloud.messageQueueService.impl;
+
+import static org.junit.Assert.*;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+import java.net.URL;
+
+import org.apache.nuvem.cloud.messageQueueService.MessageQueueService;
+import org.apache.nuvem.cloud.messageQueueService.QueueMessage;
+import org.apache.nuvem.cloud.messageQueueService.QueueMessageHandle;
+import org.apache.nuvem.cloud.messageQueueService.MessageQueueServiceException;
+
+import com.amazonaws.services.sqs.AmazonSQS;
+import com.amazonaws.services.sqs.AmazonSQSClient;
+import com.amazonaws.services.sqs.model.DeleteMessageRequest;
+import com.amazonaws.services.sqs.model.Message;
+import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
+import com.amazonaws.services.sqs.model.ReceiveMessageResult;
+import com.amazonaws.services.sqs.model.SendMessageRequest;
+import com.amazonaws.services.sqs.model.SendMessageResult;
+import com.amazonaws.services.sqs.model.GetQueueUrlRequest;
+import com.amazonaws.services.sqs.model.GetQueueUrlResult;
+import com.amazonaws.services.sqs.model.QueueDoesNotExistException;
+import com.amazonaws.services.sqs.model.InvalidMessageContentsException;
+import com.amazonaws.services.sqs.model.OverLimitException;
+import com.amazonaws.services.sqs.model.ReceiptHandleIsInvalidException;
+import com.amazonaws.services.sqs.model.InvalidIdFormatException;
+
+public class AmazonMessageQueueServiceImplTestCase {
+		
+		private MessageQueueService messageQueueService; 
+		
+		@Before
+		public void setUp() throws Exception {
+			AmazonSQSClient sqsClient =  getSQSClient();
+			messageQueueService = new  AmazonMessageQueueServiceImpl(sqsClient);
+		}
+
+		private AmazonSQSClient getSQSClient() {
+			try {
+				Properties awsCredentialsProperties = new Properties();
+				URL url = ClassLoader.getSystemResource("test.properties");
+				awsCredentialsProperties.load(url.openStream());
+				final String accessKey = awsCredentialsProperties.getProperty("accessKey");
+				final String secretKey = awsCredentialsProperties.getProperty("secretKey");
+				
+				return (AmazonSQSClient) AmazonMessageQueueServiceClient.getAmazonSQSClient(accessKey,secretKey);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			return null;
+		}
+		
+		@After
+		public void tearDown() throws Exception {
+			messageQueueService = null;
+		}
+		
+		@Test
+		public void testSendMessage() throws MessageQueueServiceException {
+			QueueMessage qMessage = new QueueMessage();
+			qMessage.setId("1");
+			qMessage.setMessageBody("Message");
+			
+			assertNotNull(qMessage);
+			
+			QueueMessageHandle qMessageHandle = new QueueMessageHandle();
+			qMessageHandle = messageQueueService.sendMessage(qMessage);
+			
+			assertNotNull(qMessageHandle);
+			assertEquals("Message", qMessageHandle.getMessageBody());
+		}
+		
+		@Test
+		public void testReceiveMessage() throws MessageQueueServiceException {
+			
+			AmazonSQSClient amazonSQSClient = getSQSClient();
+			GetQueueUrlRequest getQueueUrlRequest = new GetQueueUrlRequest("MyQueue");
+			GetQueueUrlResult getQueueUrlResult= amazonSQSClient.getQueueUrl(getQueueUrlRequest);
+			String queueURL = getQueueUrlResult.getQueueUrl();
+			
+			assertNotNull(getQueueUrlRequest);
+			assertNotNull(getQueueUrlResult);
+			assertNotNull(queueURL);
+			
+			SendMessageRequest sendMessageRequest1 = new SendMessageRequest(
+																	queueURL, "Message 01");
+			SendMessageResult sendMessageResult1 = amazonSQSClient.sendMessage(sendMessageRequest1);
+			SendMessageRequest sendMessageRequest2 = new SendMessageRequest(
+																	queueURL, "Message 02");
+			SendMessageResult sendMessageResult2 = amazonSQSClient.sendMessage(sendMessageRequest2);
+			
+			assertNotNull(sendMessageRequest1);
+			assertNotNull(sendMessageResult1);
+			assertNotNull(sendMessageRequest2);
+			assertNotNull(sendMessageResult2);
+			
+			int numberOfMessages = 3;
+			
+			List<QueueMessage> qMessages = messageQueueService.receiveMessage(numberOfMessages);
+			
+			System.out.println(numberOfMessages);
+			assertNotNull(qMessages);
+			assertEquals(3, qMessages.size());
+			assertNotNull(qMessages.get(qMessages.size()-1));
+		}
+		
+		@Test
+		public void testDeleteMessage() throws MessageQueueServiceException {
+			
+			AmazonSQSClient amazonSQSClient = getSQSClient();
+			GetQueueUrlRequest getQueueUrlRequest = new GetQueueUrlRequest("MyQueue");
+			GetQueueUrlResult getQueueUrlResult= amazonSQSClient.getQueueUrl(getQueueUrlRequest);
+			String queueURL = getQueueUrlResult.getQueueUrl();
+			
+			assertNotNull(getQueueUrlRequest);
+			assertNotNull(getQueueUrlResult);
+			assertNotNull(queueURL);
+			
+			ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueURL);
+	        List<Message> messages = amazonSQSClient.receiveMessage(receiveMessageRequest).getMessages();
+			
+	        assertNotNull(receiveMessageRequest);
+			assertNotNull(messages);
+			
+			Message message = messages.get(0);
+			
+			assertNotNull(message);
+			
+			QueueMessage qMessage = new QueueMessage(message.getReceiptHandle(), message.getBody());
+			
+			assertNotNull(qMessage);
+			
+			boolean deleteResult = messageQueueService.deleteMessage(qMessage);
+	        
+			assertNotNull(deleteResult);
+			
+			assertEquals(true, deleteResult);
+			
+		}
+		
+}
diff --git a/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/MockAmazonSQSClient.java b/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/MockAmazonSQSClient.java
new file mode 100644
index 0000000..23b9572
--- /dev/null
+++ b/nuvem-amazon/src/test/java/org/apache/nuvem/cloud/messageQueueService/impl/MockAmazonSQSClient.java
@@ -0,0 +1,158 @@
+
+package org.apache.nuvem.cloud.messageQueueService.impl;
+
+import com.amazonaws.AmazonWebServiceRequest;
+import com.amazonaws.AmazonWebServiceClient;
+import com.amazonaws.AmazonClientException;
+import com.amazonaws.AmazonServiceException;
+import com.amazonaws.ResponseMetadata;
+import com.amazonaws.auth.PropertiesCredentials;
+import com.amazonaws.services.sqs.AmazonSQS;
+import com.amazonaws.services.sqs.AmazonSQSClient;
+import com.amazonaws.services.sqs.model.CreateQueueRequest;
+import com.amazonaws.services.sqs.model.CreateQueueResult;
+import com.amazonaws.services.sqs.model.DeleteMessageRequest;
+import com.amazonaws.services.sqs.model.Message;
+import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
+import com.amazonaws.services.sqs.model.ReceiveMessageResult;
+import com.amazonaws.services.sqs.model.SendMessageRequest;
+import com.amazonaws.services.sqs.model.SendMessageResult;
+import com.amazonaws.services.sqs.model.GetQueueUrlRequest;
+import com.amazonaws.services.sqs.model.GetQueueUrlResult;
+import com.amazonaws.services.sqs.model.ListQueuesResult;
+import com.amazonaws.services.sqs.model.AddPermissionRequest;
+import com.amazonaws.services.sqs.model.DeleteMessageBatchResult;
+import com.amazonaws.services.sqs.model.DeleteMessageBatchRequest;
+import com.amazonaws.services.sqs.model.ListQueuesResult;
+import com.amazonaws.services.sqs.model.ListQueuesRequest;
+import com.amazonaws.services.sqs.model.DeleteQueueRequest;
+import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;
+import com.amazonaws.services.sqs.model.ChangeMessageVisibilityBatchResult;
+import com.amazonaws.services.sqs.model.ChangeMessageVisibilityBatchRequest;
+import com.amazonaws.services.sqs.model.ChangeMessageVisibilityRequest;
+import com.amazonaws.services.sqs.model.RemovePermissionRequest;
+import com.amazonaws.services.sqs.model.SendMessageBatchResult;
+import com.amazonaws.services.sqs.model.SendMessageBatchRequest;
+import com.amazonaws.services.sqs.model.GetQueueAttributesResult;
+import com.amazonaws.services.sqs.model.GetQueueAttributesRequest;
+import com.amazonaws.services.sqs.model.QueueDoesNotExistException;
+import com.amazonaws.services.sqs.model.InvalidMessageContentsException;
+import com.amazonaws.services.sqs.model.OverLimitException;
+import com.amazonaws.services.sqs.model.ReceiptHandleIsInvalidException;
+import com.amazonaws.services.sqs.model.InvalidIdFormatException;
+
+public class MockAmazonSQSClient extends AmazonWebServiceClient implements AmazonSQS {
+	
+	public MockAmazonSQSClient() {
+		super(null);
+	}
+	
+	@Override 
+	public GetQueueUrlResult getQueueUrl(GetQueueUrlRequest getQueueUrlRequest)
+            throws QueueDoesNotExistException, AmazonServiceException, AmazonClientException {
+		return (null);
+	}
+	
+	@Override
+	public SendMessageResult sendMessage(SendMessageRequest sendMessageRequest)
+            throws InvalidMessageContentsException, AmazonServiceException, AmazonClientException {
+		return (null);
+	}
+	
+	@Override
+	public ReceiveMessageResult receiveMessage(ReceiveMessageRequest receiveMessageRequest)
+            throws OverLimitException, AmazonServiceException, AmazonClientException {
+		return (null);
+	}
+	
+	@Override
+	public void deleteMessage(DeleteMessageRequest deleteMessageRequest)
+            throws ReceiptHandleIsInvalidException, InvalidIdFormatException, AmazonServiceException, AmazonClientException {
+	}
+	
+	@Override
+	public ResponseMetadata getCachedResponseMetadata(AmazonWebServiceRequest request) {
+		return (null);
+	}
+	
+	@Override
+	public ListQueuesResult listQueues() throws AmazonServiceException, AmazonClientException {
+		return (null);
+	}
+	
+	@Override
+	public void addPermission(AddPermissionRequest addPermissionRequest) 
+            					throws AmazonServiceException, AmazonClientException {
+	}
+	
+	@Override
+	public CreateQueueResult createQueue(CreateQueueRequest createQueueRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		return (null); 
+	}
+	
+	@Override
+	public DeleteMessageBatchResult deleteMessageBatch(DeleteMessageBatchRequest deleteMessageBatchRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		return (null); 
+	}
+	
+	@Override
+	public ListQueuesResult listQueues(ListQueuesRequest listQueuesRequest) 
+								throws AmazonServiceException, AmazonClientException {
+		return (null); 
+	}
+	
+	@Override
+	public void deleteQueue(DeleteQueueRequest deleteQueueRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		
+	}
+	
+	@Override
+	public void setEndpoint(String endpoint) throws IllegalArgumentException {
+		
+	}
+	
+	@Override
+	public void setQueueAttributes(SetQueueAttributesRequest setQueueAttributesRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		
+	}
+	
+	@Override
+	public ChangeMessageVisibilityBatchResult changeMessageVisibilityBatch(ChangeMessageVisibilityBatchRequest changeMessageVisibilityBatchRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		return (null);
+	}
+	
+	@Override
+	public void changeMessageVisibility(ChangeMessageVisibilityRequest changeMessageVisibilityRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		
+	}
+	
+	@Override
+	public void removePermission(RemovePermissionRequest removePermissionRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		
+	}
+	
+	@Override
+	public GetQueueAttributesResult getQueueAttributes(GetQueueAttributesRequest getQueueAttributesRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		return (null);
+	}
+	
+	@Override
+	public SendMessageBatchResult sendMessageBatch(SendMessageBatchRequest sendMessageBatchRequest)
+            					throws AmazonServiceException, AmazonClientException {
+		return (null);
+	}
+	
+	@Override
+	public void shutdown() {
+		
+	}
+	
+}
\ No newline at end of file
diff --git a/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/MessageQueueService.java b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/MessageQueueService.java
new file mode 100644
index 0000000..0011e9a
--- /dev/null
+++ b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/MessageQueueService.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.nuvem.cloud.messageQueueService;
+
+import java.util.List;
+import org.oasisopen.sca.annotation.Remotable;
+
+/**
+ * The Interface MessageQueueService defines services provide by Nuvem Message Queue
+ * Component and also acts as the abraction layer for cloud platform specific
+ * message queueing services. QueueMessage holds attribute values of a message sent to a message
+ * queue. 
+ */
+
+@Remotable
+public interface MessageQueueService {
+
+	/**
+	 * Send message
+	 * 
+	 * @param queueMessage the message
+	 * @return QueueMessageHandle 
+	 * @throws MessageQueueServiceException the message queue service exception
+	 */
+	public QueueMessageHandle sendMessage(QueueMessage queueMessage) throws MessageQueueServiceException;
+	
+	/**
+	 * Receives messages
+	 * 
+	 * @param numMessages number of messages to receive
+	 * @return list of messages
+	 * @throws MessageQueueServiceException the message queue service exception
+	 */
+	public List<QueueMessage> receiveMessage(int numMessages) throws MessageQueueServiceException; 
+	
+	/**
+	 * Deletes the message
+	 *  
+	 *  @param queueMessage the message
+	 *  @return true, if message deleted sucessfully
+	 *  @throws MessageQueueServiceException the message queue service exception
+	 */
+	public boolean deleteMessage(QueueMessage queueMessage) throws MessageQueueServiceException;
+	
+}
diff --git a/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/MessageQueueServiceException.java b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/MessageQueueServiceException.java
new file mode 100644
index 0000000..7022656
--- /dev/null
+++ b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/MessageQueueServiceException.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.nuvem.cloud.messageQueueService;
+
+/**
+ *The MessageQueueServiceException class
+ */
+public class MessageQueueServiceException extends Exception{
+
+	/**
+	 * Instantiates a new message queue service exception.
+	 */
+	public MessageQueueServiceException(){
+		
+	}
+	
+	/**
+	 * Instantiates a new message queue service exception.
+	 */
+	public MessageQueueServiceException(Throwable cause){
+		super(cause);
+	}
+	
+}
diff --git a/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/QueueMessage.java b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/QueueMessage.java
new file mode 100644
index 0000000..6ee653b
--- /dev/null
+++ b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/QueueMessage.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.nuvem.cloud.messageQueueService;
+
+/**
+ * The QueueMessage class
+ */
+public class QueueMessage {
+	
+	/** The id */
+	private String id;	
+	
+	/** The message body */
+	private String messageBody;
+	
+	/**
+	 * Instantiates a new QueueMessage
+	 */
+	public QueueMessage (){
+		
+	}
+	
+	/**
+	 * Instantiates a new QueueMessage
+	 * 
+	 * @param id the id
+	 * @param messageBody the message body
+	 */
+	public QueueMessage (String id, String messageBody){
+		this.messageBody = messageBody;
+		this.id = id;		
+	}
+	
+	/**
+	 * Instantiates a new QueueMessage
+	 * 
+	 * @param messageBody the message body
+	 */
+	public QueueMessage (String messageBody) {
+		this.messageBody = messageBody;
+	}
+	
+	/**
+	 * Gets the Id
+	 * 
+	 * @return the id
+	 */
+	public String getId(){
+		return id;
+	}
+	
+	/**
+	 * Sets the Id
+	 * 
+	 * @param id the id
+	 */
+	public void setId(String id){
+		this.id = id;
+	}
+	
+	/**
+	 * Gets the message body
+	 * 
+	 * @return the messages body
+	 */
+	public String getMessageBody(){
+		return messageBody;		
+	}
+	
+	/**
+	 * Sets the message body
+	 * 
+	 * @param messageBody the message body
+	 */
+	public void setMessageBody(String messageBody){
+		this.messageBody = messageBody;
+	}
+	
+}
diff --git a/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/QueueMessageHandle.java b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/QueueMessageHandle.java
new file mode 100644
index 0000000..610762d
--- /dev/null
+++ b/nuvem-api/src/main/java/org/apache/nuvem/cloud/messageQueueService/QueueMessageHandle.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.nuvem.cloud.messageQueueService;
+
+/**
+ *The QueueMessageHandle class
+ */
+public class QueueMessageHandle {
+	
+	/** The id */
+	private String id;
+	
+	/** The message body */
+	private String messageBody;
+	
+	/**
+	 * Instantiates a new QueueMessagHandle
+	 */
+	public QueueMessageHandle(){
+		
+	}
+	
+	/**
+	 * Gets the Id
+	 * 
+	 * @return the id
+	 */
+	public String getId(){
+		return this.id;
+	}
+	
+	/**
+	 * Sets the Id
+	 * 
+	 * @param id the id
+	 */
+	public void setId(String id){
+		this.id = id;
+	}
+	
+	/**
+	 * Gets the message body
+	 * 
+	 * @return the messages body
+	 */
+	public String getMessageBody(){
+		return this.messageBody;
+	}
+	
+	/**
+	 * Sets the message body
+	 * 
+	 * @param messageBody the message body
+	 */
+	public void setMessageBody(String messageBody){
+		this.messageBody = messageBody;
+	}
+}
