Index: store/CassandraMessageStore.java
===================================================================
--- store/CassandraMessageStore.java	(revision 11629)
+++ store/CassandraMessageStore.java	(working copy)
@@ -32,6 +32,8 @@
 import org.wso2.andes.server.logging.LogSubject;
 import org.wso2.andes.server.message.AMQMessage;
 import org.wso2.andes.server.message.MessageMetaData;
+import org.wso2.andes.server.message.MessageMetaData_0_10;
+import org.wso2.andes.server.message.MessageTransferMessage;
 import org.wso2.andes.server.protocol.AMQProtocolSession;
 import org.wso2.andes.server.queue.*;
 import org.wso2.andes.server.virtualhost.VirtualHostConfigSynchronizer;
@@ -84,6 +86,7 @@
     private final static String QMD_ROW_NAME = "qpidMetaData";
 
     private final static String MSG_CONTENT_IDS_ROW = "messageContentIds";
+    private final static String TOPIC_EXCHANGE_MESSAGE_IDS = "TopicExchangeMessageIds";
 
     private final AtomicLong _messageId = new AtomicLong(0);
     private CassandraGlobalQueueManager cassandraGlobalQueueManager;
@@ -458,6 +461,7 @@
         createColumnFamily(MESSAGE_QUEUE_MAPPING_COLUMN_FAMILY, UTF8_TYPE, def);
         createColumnFamily(GLOBAL_QUEUES_COLUMN_FAMILY, UTF8_TYPE, def);
         createColumnFamily(GLOBAL_QUEUE_LIST_COLUMN_FAMILY, UTF8_TYPE, def);
+        createColumnFamily(TOPIC_EXCHANGE_MESSAGE_IDS,LONG_TYPE,def);
 
         //Create keyspace in client side
         keyspace = HFactory.createKeyspace("QpidKeySpace", cluster);
@@ -814,6 +818,72 @@
 
     }
 
+    public void addTopicExchangeMessageIds(String topic,long messageId) {
+        if (keyspace == null) {
+            return;
+        }
+        try {
+
+            Mutator<String> mutator = HFactory.createMutator(keyspace, StringSerializer.get());
+
+
+            LongSerializer ls = LongSerializer.get();
+            long columnName = messageId;
+            long columnValue = messageId;
+
+            mutator.insert(topic, TOPIC_EXCHANGE_MESSAGE_IDS,
+                    HFactory.createColumn(columnName, columnValue, ls, ls));
+            mutator.execute();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private List<Long> getTopicMessageIds(String topic, long lastDeliveredMid)  {
+        List<Long> idList = new ArrayList<Long>();
+        try {
+            lastDeliveredMid++;
+            LongSerializer ls = LongSerializer.get();
+            StringSerializer ss = StringSerializer.get();
+
+            SliceQuery<String, Long, Long> sliceQuery = HFactory.createSliceQuery(keyspace, ss, ls, ls);
+            sliceQuery.setKey(topic);
+            sliceQuery.setColumnFamily(TOPIC_EXCHANGE_MESSAGE_IDS);
+            sliceQuery.setRange( lastDeliveredMid,Long.MAX_VALUE,false, 1000);
+
+            QueryResult<ColumnSlice<Long, Long>> result = sliceQuery.execute();
+            ColumnSlice<Long, Long> columnSlice = result.get();
+            for (HColumn<Long, Long> column : columnSlice.getColumns()) {
+                idList.add(column.getValue());
+            }
+            if(lastDeliveredMid == 1 && idList.size()>0){
+                Long[] ids =  new Long[idList.size()];
+                idList.toArray(ids);
+                int index = idList.size() -1;
+                idList.clear();
+                idList.add(ids[index]);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return idList;
+    }
+
+    public List<MessageTransferMessage> getStoredMessages(AMQQueue queue ,String topic, long lastDeliveredMessageId){
+        List<MessageTransferMessage> messages = new ArrayList<MessageTransferMessage>();
+        List<Long>  messageIds =  getTopicMessageIds(topic,lastDeliveredMessageId);
+        if (messageIds.size() > 0) {
+            SimpleQueueEntryList list = new SimpleQueueEntryList(queue);
+            for (long messageId : messageIds) {
+                StorableMessageMetaData messageMetaData = getMetaData(messageId);
+                StoredCassandraMessage storedCassandraMessage = new StoredCassandraMessage(messageId,messageMetaData,true);
+                MessageTransferMessage message = new MessageTransferMessage(storedCassandraMessage, null);
+                messages.add(message);
+            }
+        }
+        return messages;
+    }
+
     public void synchBindings(VirtualHostConfigSynchronizer vhcs) {
         try {
 
@@ -1204,9 +1274,13 @@
 
     @Override
     public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData) {
+         long timeStamp = 0;
+        if(metaData instanceof MessageMetaData){
+           timeStamp = ((MessageMetaData) metaData).getArrivalTime();
+        }else {
+             timeStamp = ((MessageMetaData_0_10) metaData).getArrivalTime();
+        }
 
-        long timeStamp = ((MessageMetaData) metaData).getArrivalTime();
-
         StringBuffer midStr = new StringBuffer();
         midStr.append(timeStamp).append(_messageId.incrementAndGet()).append(nodeId);
         long mid = Long.parseLong(midStr.toString());
@@ -1214,6 +1288,7 @@
 
     }
 
+
     @Override
     public boolean isPersistent() {
         return false;
@@ -1406,7 +1481,12 @@
             storeMetaData(_messageId, metaData);
         }
 
+        private StoredCassandraMessage(long messageId, StorableMessageMetaData metaData ,boolean isTopics){
+            this._messageId = messageId;
+            this._metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+        }
 
+
         @Override
         public StorableMessageMetaData getMetaData() {
             StorableMessageMetaData metaData = _metaDataRef.get();
Index: cassandra/CassandraTopicPublisher.java
===================================================================
--- cassandra/CassandraTopicPublisher.java	(revision 0)
+++ cassandra/CassandraTopicPublisher.java	(revision 0)
@@ -0,0 +1,79 @@
+package org.wso2.andes.server.cassandra;
+
+
+import org.wso2.andes.AMQException;
+import org.wso2.andes.server.binding.Binding;
+import org.wso2.andes.server.exchange.AbstractExchange;
+import org.wso2.andes.server.exchange.Exchange;
+import org.wso2.andes.server.exchange.ExchangeRegistry;
+import org.wso2.andes.server.message.MessageTransferMessage;
+import org.wso2.andes.server.protocol.AMQProtocolSession;
+import org.wso2.andes.server.queue.AMQQueue;
+import org.wso2.andes.server.queue.SimpleAMQQueue;
+import org.wso2.andes.server.store.CassandraMessageStore;
+import org.wso2.andes.server.virtualhost.VirtualHost;
+
+import java.util.List;
+
+public class CassandraTopicPublisher extends Thread{
+    private AMQProtocolSession session;
+    private Binding binding ;
+    private SimpleAMQQueue queue;
+    private AbstractExchange exchange;
+    private long lastDeliveredMessageID = 0;
+    private VirtualHost virtualHost;
+
+
+    public CassandraTopicPublisher(Binding binding, AMQQueue queue, Exchange exchange, VirtualHost virtualHost){
+        this.binding = binding;
+        this.exchange = (AbstractExchange) exchange;
+        this.queue = (SimpleAMQQueue) queue;
+        this.virtualHost = virtualHost;
+    }
+
+    @Override
+    public void run() {
+
+        while (true) {
+            List<MessageTransferMessage> messages =
+                    CassandraMessageStore.getInstance().getStoredMessages(queue, binding.getBindingKey(), lastDeliveredMessageID++);
+            System.out.println(" Running CassandraTopicPublisher  ");
+
+            if (messages.size() > 0) {
+
+                for (MessageTransferMessage message : messages) {
+                    try {
+//                        enqueueMessage(message);
+                        lastDeliveredMessageID = message.getMessageNumber();
+                        System.out.println("Sending message  "+ lastDeliveredMessageID +"from cassandra topic publisher");
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+
+            }
+            try {
+                Thread.sleep(10000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+            }
+        }
+    }
+
+    private void enqueueMessage(MessageTransferMessage message) {
+        Exchange exchange;
+        ExchangeRegistry exchangeRegistry = virtualHost.getExchangeRegistry();
+        exchange = exchangeRegistry.getExchange("amq.topic");
+        if (exchange != null) {
+            for(Binding binding: exchange.getBindings()){
+                if(binding.getBindingKey().equalsIgnoreCase(message.getRoutingKey())){
+                    try {
+                        binding.getQueue().enqueue(message);
+                    } catch (AMQException e) {
+                        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+                    }
+                }
+            }
+        }
+    }
+}
Index: binding/BindingFactory.java
===================================================================
--- binding/BindingFactory.java	(revision 11629)
+++ binding/BindingFactory.java	(working copy)
@@ -25,6 +25,7 @@
 import org.wso2.andes.AMQSecurityException;
 import org.wso2.andes.framing.AMQShortString;
 import org.wso2.andes.framing.FieldTable;
+import org.wso2.andes.server.cassandra.CassandraTopicPublisher;
 import org.wso2.andes.server.configuration.BindingConfig;
 import org.wso2.andes.server.configuration.BindingConfigType;
 import org.wso2.andes.server.configuration.ConfigStore;
@@ -34,7 +35,6 @@
 import org.wso2.andes.server.logging.messages.BindingMessages;
 import org.wso2.andes.server.logging.subjects.BindingLogSubject;
 import org.wso2.andes.server.queue.AMQQueue;
-import org.wso2.andes.server.store.CassandraMessageStore;
 import org.wso2.andes.server.store.DurableConfigurationStore;
 import org.wso2.andes.server.virtualhost.VirtualHost;
 
@@ -197,6 +197,10 @@
             exchange.addBinding(b);
             getConfigStore().addConfiguredObject(b);
             b.logCreation();
+            if (exchange.getName().equalsIgnoreCase("amq.topic")) {
+                CassandraTopicPublisher cassandraTopicPublisher = new CassandraTopicPublisher(b,queue,exchange,getVirtualHost());
+                cassandraTopicPublisher.start();
+            }
 
             return true;
         }
