You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2014/12/12 17:32:51 UTC

[4/5] activemq-6 git commit: documentation review fixes

documentation review fixes


Project: http://git-wip-us.apache.org/repos/asf/activemq-6/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-6/commit/b4144013
Tree: http://git-wip-us.apache.org/repos/asf/activemq-6/tree/b4144013
Diff: http://git-wip-us.apache.org/repos/asf/activemq-6/diff/b4144013

Branch: refs/heads/master
Commit: b4144013d9756329c6e748fa213e0257d80e447d
Parents: 1491f4a
Author: Andy Taylor <an...@apache.org>
Authored: Thu Dec 11 12:17:29 2014 +0000
Committer: Andy Taylor <an...@apache.org>
Committed: Fri Dec 12 14:46:30 2014 +0000

----------------------------------------------------------------------
 docs/user-manual/en/SUMMARY.md                 |   4 +-
 docs/user-manual/en/aerogear-integration.md    |  29 +-
 docs/user-manual/en/appserver-integration.md   | 433 +++++++++-----------
 docs/user-manual/en/architecture.md            |  43 +-
 docs/user-manual/en/client-classpath.md        |   9 +-
 docs/user-manual/en/client-reconnection.md     |  16 +-
 docs/user-manual/en/clusters.md                | 171 ++++----
 docs/user-manual/en/configuring-transports.md  |  77 ++--
 docs/user-manual/en/connection-ttl.md          | 109 +++--
 docs/user-manual/en/core-bridges.md            |  18 +-
 docs/user-manual/en/diverts.md                 |   9 +-
 docs/user-manual/en/duplicate-detection.md     |  42 +-
 docs/user-manual/en/embedding-activemq.md      | 162 ++++----
 docs/user-manual/en/filter-expressions.md      |   9 +-
 docs/user-manual/en/flow-control.md            |  85 ++--
 docs/user-manual/en/ha.md                      |  95 ++---
 docs/user-manual/en/intercepting-operations.md |  27 +-
 docs/user-manual/en/interoperability.md        |  58 +--
 docs/user-manual/en/jms-bridge.md              |  34 +-
 docs/user-manual/en/jms-core-mapping.md        |   3 +-
 docs/user-manual/en/large-messages.md          | 156 +++----
 docs/user-manual/en/last-value-queues.md       |  48 ++-
 docs/user-manual/en/libaio.md                  |  14 +-
 docs/user-manual/en/logging.md                 |   9 +-
 docs/user-manual/en/management.md              | 249 ++++++-----
 docs/user-manual/en/message-expiry.md          |  17 +-
 docs/user-manual/en/message-grouping.md        |  26 +-
 docs/user-manual/en/messaging-concepts.md      |  61 +--
 docs/user-manual/en/paging.md                  |  30 +-
 docs/user-manual/en/perf-tuning.md             |  46 +--
 docs/user-manual/en/persistence.md             |  42 +-
 docs/user-manual/en/pre-acknowledge.md         |  12 +-
 docs/user-manual/en/preface.md                 |   9 +-
 docs/user-manual/en/project-info.md            |  42 +-
 docs/user-manual/en/project-info.xml           |  90 ----
 docs/user-manual/en/queue-attributes.md        |  18 +-
 docs/user-manual/en/rest.md                    | 112 ++---
 docs/user-manual/en/scheduled-messages.md      |  24 +-
 docs/user-manual/en/security.md                |  44 +-
 docs/user-manual/en/send-guarantees.md         |  24 +-
 docs/user-manual/en/slow-consumers.md          |   6 +-
 docs/user-manual/en/spring-integration.md      |   5 +-
 docs/user-manual/en/syntax.md                  |  22 +
 docs/user-manual/en/thread-pooling.md          |  46 ++-
 docs/user-manual/en/tools.md                   |   3 +-
 docs/user-manual/en/transaction-config.md      |   3 +-
 docs/user-manual/en/undelivered-messages.md    |  49 +--
 docs/user-manual/en/using-core.md              |  82 ++--
 docs/user-manual/en/using-jms.md               | 171 ++++----
 docs/user-manual/en/using-server.md            |  42 +-
 docs/user-manual/en/vertx-integration.md       |  39 +-
 docs/user-manual/en/wildcard-routing.md        |   3 +-
 docs/user-manual/en/wildcard-syntax.md         |   3 +-
 53 files changed, 1310 insertions(+), 1670 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/SUMMARY.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md
index 79f5d54..bf4804c 100644
--- a/docs/user-manual/en/SUMMARY.md
+++ b/docs/user-manual/en/SUMMARY.md
@@ -1,7 +1,7 @@
 * [Legal Notice](notice.md)
 * [Preface](preface.md)
-* [Project Info](project-info.md)
-* [Messaging Concepts](messaging-concepts.md)
+* [Project Info](project-info/project-info.md)
+* [Messaging Concepts](messaging-concepts/messaging-concepts.md) 
 * [Architecture](architecture.md)
 * [Using the Server](using-server.md)
 * [Using JMS](using-jms.md)

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/aerogear-integration.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/aerogear-integration.md b/docs/user-manual/en/aerogear-integration.md
index e8c24f8..fcc1f05 100644
--- a/docs/user-manual/en/aerogear-integration.md
+++ b/docs/user-manual/en/aerogear-integration.md
@@ -1,5 +1,4 @@
-AeroGear Integration
-====================
+# AeroGear Integration
 
 AeroGears push technology provides support for different push
 notification technologies like Google Cloud Messaging, Apple's APNs or
@@ -8,8 +7,7 @@ Service that will consume messages from a queue and forward them to an
 AeroGear push server and subsequently sent as notifications to mobile
 devices.
 
-Configuring an AeroGear Connector Service
-=========================================
+## Configuring an AeroGear Connector Service
 
 AeroGear Connector services are configured in the connector-services
 configuration:
@@ -64,20 +62,21 @@ parameters
 More in depth explanations of the AeroGear related parameters can be
 found in the [AeroGear Push docs](http://aerogear.org/push/)
 
-How to send a message for AeroGear
-==================================
+## How to send a message for AeroGear
 
 To send a message intended for AeroGear simply send a JMS Message and
 set the appropriate headers, like so
 
-        Message message = session.createMessage();
+``` java
+Message message = session.createMessage();
 
-        message.setStringProperty("AEROGEAR_ALERT", "Hello this is a notification from ActiveMQ");
+message.setStringProperty("AEROGEAR_ALERT", "Hello this is a notification from ActiveMQ");
 
-        producer.send(message);
+producer.send(message);
+```
             
 
-The 'AEROGEAR\_ALERT' property will be the alert sent to the mobile
+The 'AEROGEAR_ALERT' property will be the alert sent to the mobile
 device.
 
 > **Note**
@@ -89,13 +88,17 @@ Its also possible to override any of the other AeroGear parameters by
 simply setting them on the message, for instance if you wanted to set
 ttl of a message you would:
 
-        message.setIntProperty("AEROGEAR_TTL", 1234);
+``` java
+message.setIntProperty("AEROGEAR_TTL", 1234);
+```
             
 
 or if you wanted to set the list of variants you would use:
 
-        message.setStringProperty("AEROGEAR_VARIANTS", "variant1,variant2,variant3");
-            
+``` java
+message.setStringProperty("AEROGEAR_VARIANTS", "variant1,variant2,variant3");
+```            
+```            
 
 Again refer to the AeroGear documentation for a more in depth view on
 how to use these settings

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/appserver-integration.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/appserver-integration.md b/docs/user-manual/en/appserver-integration.md
index 8c4c9d5..e704b89 100644
--- a/docs/user-manual/en/appserver-integration.md
+++ b/docs/user-manual/en/appserver-integration.md
@@ -1,5 +1,4 @@
-Application Server Integration and Java EE
-==========================================
+# Application Server Integration and Java EE
 
 ActiveMQ can be easily installed in JBoss Application Server 4 or later.
 For details on installing ActiveMQ in the JBoss Application Server
@@ -18,8 +17,7 @@ JEE components, e.g. EJBs and Servlets.
 This section explains the basics behind configuring the different JEE
 components in the AS.
 
-Configuring Message-Driven Beans
-================================
+## Configuring Message-Driven Beans
 
 The delivery of messages to an MDB using ActiveMQ is configured on the
 JCA Adapter via a configuration file `ra.xml` which can be found under
@@ -32,16 +30,18 @@ All MDBs however need to have the destination type and the destination
 configured. The following example shows how this can be done using
 annotations:
 
-    @MessageDriven(name = "MDBExample", activationConfig =
-    {
-       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
-       @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue")
-    })
-    @ResourceAdapter("activemq-ra.rar")
-    public class MDBExample implements MessageListener
-    {
-       public void onMessage(Message message)...
-    }
+``` java
+@MessageDriven(name = "MDBExample", activationConfig =
+{
+   @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
+   @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue")
+})
+@ResourceAdapter("activemq-ra.rar")
+public class MDBExample implements MessageListener
+{
+   public void onMessage(Message message)...
+}
+```
 
 In this example you can see that the MDB will consume messages from a
 queue that is mapped into JNDI with the binding `queue/testQueue`. This
@@ -77,8 +77,7 @@ file and change `rar-name` element.
 All the examples shipped with the ActiveMQ distribution use the
 annotation.
 
-Using Container-Managed Transactions
-------------------------------------
+### Using Container-Managed Transactions
 
 When an MDB is using Container-Managed Transactions (CMT), the delivery
 of the message is done within the scope of a JTA transaction. The commit
@@ -88,18 +87,20 @@ will kick in (by default, it will try to redeliver the message up to 10
 times before sending to a DLQ). Using annotations this would be
 configured as follows:
 
-    @MessageDriven(name = "MDB_CMP_TxRequiredExample", activationConfig =
-    {
-       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
-       @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue")
-    })
-    @TransactionManagement(value= TransactionManagementType.CONTAINER)
-    @TransactionAttribute(value= TransactionAttributeType.REQUIRED)
-    @ResourceAdapter("activemq-ra.rar")
-    public class MDB_CMP_TxRequiredExample implements MessageListener
-    {
-       public void onMessage(Message message)...
-    }
+``` java
+@MessageDriven(name = "MDB_CMP_TxRequiredExample", activationConfig =
+{
+   @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
+   @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue")
+})
+@TransactionManagement(value= TransactionManagementType.CONTAINER)
+@TransactionAttribute(value= TransactionAttributeType.REQUIRED)
+@ResourceAdapter("activemq-ra.rar")
+public class MDB_CMP_TxRequiredExample implements MessageListener
+{
+   public void onMessage(Message message)...
+}
+```
 
 The `TransactionManagement` annotation tells the container to manage the
 transaction. The `TransactionAttribute` annotation tells the container
@@ -112,59 +113,64 @@ It is also possible to inform the container that it must rollback the
 transaction by calling `setRollbackOnly` on the `MessageDrivenContext`.
 The code for this would look something like:
 
-    @Resource
-    MessageDrivenContextContext ctx;
-
-    public void onMessage(Message message)
-    {
-       try
-       {
-          //something here fails
-       }
-       catch (Exception e)
-       {
-          ctx.setRollbackOnly();
-       }
-    }
+``` java
+@Resource
+MessageDrivenContextContext ctx;
+
+public void onMessage(Message message)
+{
+   try
+   {
+      //something here fails
+   }
+   catch (Exception e)
+   {
+      ctx.setRollbackOnly();
+   }
+}
+```
 
 If you do not want the overhead of an XA transaction being created every
 time but you would still like the message delivered within a transaction
 (i.e. you are only using a JMS resource) then you can configure the MDB
 to use a local transaction. This would be configured as such:
 
-    @MessageDriven(name = "MDB_CMP_TxLocalExample", activationConfig =
-    {
-          @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
-          @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
-          @ActivationConfigProperty(propertyName = "useLocalTx", propertyValue = "true")
-    })
-    @TransactionManagement(value = TransactionManagementType.CONTAINER)
-    @TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
-    @ResourceAdapter("activemq-ra.rar")
-    public class MDB_CMP_TxLocalExample implements MessageListener
-    {
-       public void onMessage(Message message)...
-    }
-
-Using Bean-Managed Transactions
--------------------------------
+``` java
+@MessageDriven(name = "MDB_CMP_TxLocalExample", activationConfig =
+{
+      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
+      @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
+      @ActivationConfigProperty(propertyName = "useLocalTx", propertyValue = "true")
+})
+@TransactionManagement(value = TransactionManagementType.CONTAINER)
+@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
+@ResourceAdapter("activemq-ra.rar")
+public class MDB_CMP_TxLocalExample implements MessageListener
+{
+   public void onMessage(Message message)...
+}
+```
+
+### Using Bean-Managed Transactions
 
 Message-driven beans can also be configured to use Bean-Managed
 Transactions (BMT). In this case a User Transaction is created. This
 would be configured as follows:
 
-    @MessageDriven(name = "MDB_BMPExample", activationConfig =
-    {
-       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
-       @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
-       @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Dups-ok-acknowledge")
-    })
-    @TransactionManagement(value= TransactionManagementType.BEAN)
-    @ResourceAdapter("activemq-ra.rar")
-    public class MDB_BMPExample implements MessageListener
-    {
-       public void onMessage(Message message)
-    }
+``` java
+@MessageDriven(name = "MDB_BMPExample", activationConfig =
+{
+   @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
+   @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
+   @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Dups-ok-acknowledge")
+})
+@TransactionManagement(value= TransactionManagementType.BEAN)
+@ResourceAdapter("activemq-ra.rar")
+public class MDB_BMPExample implements MessageListener
+{
+   public void onMessage(Message message)
+}
+```
 
 When using Bean-Managed Transactions the message delivery to the MDB
 will occur outside the scope of the user transaction and use the
@@ -177,55 +183,57 @@ not cause the message to be redelivered.
 A user would control the life-cycle of the transaction something like
 the following:
 
-    @Resource
-    MessageDrivenContext ctx;
+``` java
+@Resource
+MessageDrivenContext ctx;
 
-    public void onMessage(Message message)
-    {
-       UserTransaction tx;
-       try
-       {
-          TextMessage textMessage = (TextMessage)message;
+public void onMessage(Message message)
+{
+   UserTransaction tx;
+   try
+   {
+      TextMessage textMessage = (TextMessage)message;
 
-          String text = textMessage.getText();
+      String text = textMessage.getText();
 
-          UserTransaction tx = ctx.getUserTransaction();
+      UserTransaction tx = ctx.getUserTransaction();
 
-          tx.begin();
+      tx.begin();
 
-          //do some stuff within the transaction
+      //do some stuff within the transaction
 
-          tx.commit();
+      tx.commit();
 
-       }
-       catch (Exception e)
-       {
-          tx.rollback();
-       }
-    }
+   }
+   catch (Exception e)
+   {
+      tx.rollback();
+   }
+}
+```
 
-Using Message Selectors with Message-Driven Beans
--------------------------------------------------
+### Using Message Selectors with Message-Driven Beans
 
 It is also possible to use MDBs with message selectors. To do this
 simple define your message selector as follows:
 
-    @MessageDriven(name = "MDBMessageSelectorExample", activationConfig =
-    {
-       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
-       @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
-       @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "color = 'RED'")
-    })
-    @TransactionManagement(value= TransactionManagementType.CONTAINER)
-    @TransactionAttribute(value= TransactionAttributeType.REQUIRED)
-    @ResourceAdapter("activemq-ra.rar")
-    public class MDBMessageSelectorExample implements MessageListener
-    {
-       public void onMessage(Message message)....
-    }
-
-Sending Messages from within JEE components
-===========================================
+``` java
+@MessageDriven(name = "MDBMessageSelectorExample", activationConfig =
+{
+   @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
+   @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
+   @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "color = 'RED'")
+})
+@TransactionManagement(value= TransactionManagementType.CONTAINER)
+@TransactionAttribute(value= TransactionAttributeType.REQUIRED)
+@ResourceAdapter("activemq-ra.rar")
+public class MDBMessageSelectorExample implements MessageListener
+{
+   public void onMessage(Message message)....
+}
+```
+
+## Sending Messages from within JEE components
 
 The JCA adapter can also be used for sending messages. The Connection
 Factory to use is configured by default in the `jms-ds.xml` file and is
@@ -237,70 +245,71 @@ This means that if the sending of the message fails the overall
 transaction would rollback and the message be re-sent. Heres an example
 of this from within an MDB:
 
-    @MessageDriven(name = "MDBMessageSendTxExample", activationConfig =
-    {
-       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
-       @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue")
-    })
-    @TransactionManagement(value= TransactionManagementType.CONTAINER)
-    @TransactionAttribute(value= TransactionAttributeType.REQUIRED)
-    @ResourceAdapter("activemq-ra.rar")
-    public class MDBMessageSendTxExample implements MessageListener
-    {
-       @Resource(mappedName = "java:/JmsXA")
-       ConnectionFactory connectionFactory;
-
-       @Resource(mappedName = "queue/replyQueue")
-       Queue replyQueue;
-
-       public void onMessage(Message message)
-       {
-          Connection conn = null;
-          try
-          {
-             //Step 9. We know the client is sending a text message so we cast
-             TextMessage textMessage = (TextMessage)message;
-
-             //Step 10. get the text from the message.
-             String text = textMessage.getText();
-
-             System.out.println("message " + text);
-
-             conn = connectionFactory.createConnection();
-
-             Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
-             MessageProducer producer = sess.createProducer(replyQueue);
-
-             producer.send(sess.createTextMessage("this is a reply"));
-
-          }
-          catch (Exception e)
-          {
-             e.printStackTrace();
-          }
-          finally
-          {
-             if(conn != null)
-             {
-                try
-                {
-                   conn.close();
-                }
-                catch (JMSException e)
-                { 
-                }
-             }
-          }
-       }
-       }
+``` java
+@MessageDriven(name = "MDBMessageSendTxExample", activationConfig =
+{
+   @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
+   @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue")
+})
+@TransactionManagement(value= TransactionManagementType.CONTAINER)
+@TransactionAttribute(value= TransactionAttributeType.REQUIRED)
+@ResourceAdapter("activemq-ra.rar")
+public class MDBMessageSendTxExample implements MessageListener
+{
+   @Resource(mappedName = "java:/JmsXA")
+   ConnectionFactory connectionFactory;
+
+   @Resource(mappedName = "queue/replyQueue")
+   Queue replyQueue;
+
+   public void onMessage(Message message)
+   {
+      Connection conn = null;
+      try
+      {
+         //Step 9. We know the client is sending a text message so we cast
+         TextMessage textMessage = (TextMessage)message;
+
+         //Step 10. get the text from the message.
+         String text = textMessage.getText();
+
+         System.out.println("message " + text);
+
+         conn = connectionFactory.createConnection();
+
+         Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+         MessageProducer producer = sess.createProducer(replyQueue);
+
+         producer.send(sess.createTextMessage("this is a reply"));
+
+      }
+      catch (Exception e)
+      {
+         e.printStackTrace();
+      }
+      finally
+      {
+         if(conn != null)
+         {
+            try
+            {
+               conn.close();
+            }
+            catch (JMSException e)
+            { 
+            }
+         }
+      }
+   }
+}
+```
 
 In JBoss Application Server you can use the JMS JCA adapter for sending
 messages from EJBs (including Session, Entity and Message-Driven Beans),
 Servlets (including jsps) and custom MBeans.
 
-MDB and Consumer pool size
-==========================
+## MDB and Consumer pool size
 
 Most application servers, including JBoss, allow you to configure how
 many MDB's there are in a pool. In JBoss this is configured via the
@@ -314,21 +323,22 @@ limit how many sessions/consumers are created then you need to set the
 `maxSession` parameter either on the resource adapter itself or via an
 an Activation Config Property on the MDB itself
 
-    @MessageDriven(name = "MDBMessageSendTxExample", activationConfig =
-    {
-       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
-       @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
-       @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1")
-    })
-    @TransactionManagement(value= TransactionManagementType.CONTAINER)
-    @TransactionAttribute(value= TransactionAttributeType.REQUIRED)
-    @ResourceAdapter("activemq-ra.rar")
-    public class MyMDB implements MessageListener
-    { ....}
+``` java
+@MessageDriven(name = "MDBMessageSendTxExample", activationConfig =
+{
+   @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
+   @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue"),
+   @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1")
+})
+@TransactionManagement(value= TransactionManagementType.CONTAINER)
+@TransactionAttribute(value= TransactionAttributeType.REQUIRED)
+@ResourceAdapter("activemq-ra.rar")
+public class MyMDB implements MessageListener
+{ ....}
+```
           
 
-Configuring the JCA Adaptor
-===========================
+## Configuring the JCA Adaptor
 
 The Java Connector Architecture (JCA) Adapter is what allows ActiveMQ to
 be integrated with JEE components such as MDBs and EJBs. It configures
@@ -422,8 +432,7 @@ There are three main parts to this configuration.
 3.  The configuration of the inbound part of the adapter. This is used
     for controlling the consumption of messages via MDBs.
 
-Global Properties
------------------
+### Global Properties
 
 The first element you see is `resourceadapter-class` which should be
 left unchanged. This is the ActiveMQ resource adapter class.
@@ -446,7 +455,7 @@ The following table explains what each property is for.
 
   Property Name                                                               Property Type   Property Description
   --------------------------------------------------------------------------- --------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-  ConnectorClassName                                                          String          The Connector class name (see ? for more information). If multiple connectors are needed this should be provided as a comma separated list.
+  ConnectorClassName                                                          String          The Connector class name (see [Configuring the Transport](configuring-transports.md) for more information). If multiple connectors are needed this should be provided as a comma separated list.
   ConnectionParameters                                                        String          The transport configuration. These parameters must be in the form of `key1=val1;key2=val2;` and will be specific to the connector used. If multiple connectors are configured then parameters should be supplied for each connector separated by a comma.
   ha                                                                          boolean         True if high availability is needed.
   useLocalTx                                                                  boolean         True will enable local transaction optimisation.
@@ -485,8 +494,7 @@ The following table explains what each property is for.
 
   : Global Configuration Properties
 
-Adapter Outbound Configuration
-------------------------------
+### Adapter Outbound Configuration
 
 The outbound configuration should remain unchanged as they define
 connection factories that are used by Java EE components. These
@@ -545,8 +553,7 @@ addition to the global configuration properties.
 
   : Outbound Configuration Properties
 
-Adapter Inbound Configuration
------------------------------
+### Adapter Inbound Configuration
 
 The inbound configuration should again remain unchanged. This controls
 what forwards messages onto MDBs. It is possible to override properties
@@ -572,16 +579,13 @@ to the global configuration properties.
 
   : Inbound Configuration Properties
 
-Configuring the adapter to use a standalone ActiveMQ Server
------------------------------------------------------------
+### Configuring the adapter to use a standalone ActiveMQ Server
 
 Sometime you may want your messaging server on a different machine or
 separate from the application server. If this is the case you will only
 need the activemq client libs installed. This section explains what
 config to create and what jar dependencies are needed.
 
-### 
-
 There are two configuration files needed to do this, one for the
 incoming adapter used for MDB's and one for outgoing connections managed
 by the JCA managed connection pool used by outgoing JEE components
@@ -700,15 +704,13 @@ This is a list of the ActiveMQ and third party jars needed
 
   : Jar Dependencies
 
-Configuring the JBoss Application Server to connect to Remote ActiveMQ Server
-=============================================================================
+## Configuring the JBoss Application Server to connect to Remote ActiveMQ Server
 
 This is a step by step guide on how to configure a JBoss application
 server that doesn't have ActiveMQ installed to use a remote instance of
 ActiveMQ
 
-Configuring JBoss 5
--------------------
+### Configuring JBoss 5
 
 Firstly download and install JBoss AS 5 as per the JBoss installation
 guide and ActiveMQ as per the ActiveMQ installation guide. After that
@@ -836,7 +838,7 @@ the following steps are required
 At this point you should be able to now deploy MDB's that consume from
 the remote server. You will however, have to make sure that your MDB's
 have the annotation `@ResourceAdapter("activemq-ra.rar")` added, this is
-illustrated in the ? section. If you don't want to add this annotation
+illustrated in the Configuring Message-Driven Beans section. If you don't want to add this annotation
 then you can delete the generic resource adapter `jms-ra.rar` and rename
 the `activemq-ra.rar` to this.
 
@@ -879,8 +881,7 @@ connections, i.e. sending messages, then do the following:
 Now you should be able to send messages using the JCA JMS connection
 pooling within an XA transaction.
 
-Configuring JBoss 5
--------------------
+### Configuring JBoss 5
 
 The steps to do this are exactly the same as for JBoss 4, you will have
 to create a jboss.xml definition file for your MDB with the following
@@ -896,33 +897,7 @@ section with the following 'Uncomment to use JMS message inflow from
 jmsra.rar' and then comment out the invoker-proxy-binding called
 'message-driven-bean'
 
-High Availability JNDI (HA-JNDI)
-================================
-
-If you are using JNDI to look-up JMS queues, topics and connection
-factories from a cluster of servers, it is likely you will want to use
-HA-JNDI so that your JNDI look-ups will continue to work if one or more
-of the servers in the cluster fail.
-
-HA-JNDI is a JBoss Application Server service which allows you to use
-JNDI from clients without them having to know the exact JNDI connection
-details of every server in the cluster. This service is only available
-if using a cluster of JBoss Application Server instances.
-
-To use it use the following properties when connecting to JNDI.
-
-    Hashtable<String, String> jndiParameters = new Hashtable<String, String>();
-    jndiParameters.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
-    jndiParameters.put("java.naming.factory.url.pkgs=", "org.jboss.naming:org.jnp.interfaces");
-
-    initialContext = new InitialContext(jndiParameters);
-
-For more information on using HA-JNDI see the [JBoss Application Server
-clustering
-documentation](http://www.jboss.org/file-access/default/members/jbossas/freezone/docs/Clustering_Guide/5/html/clustering-jndi.html)
-
-XA Recovery
-===========
+## XA Recovery
 
 *XA recovery* deals with system or application failures to ensure that
 of a transaction are applied consistently to all resources affected by
@@ -938,8 +913,7 @@ crash, the recovery manager will ensure that the transactions are
 recovered and the messages will either be committed or rolled back
 (depending on the transaction outcome) when the server is restarted.
 
-XA Recovery Configuration
--------------------------
+### XA Recovery Configuration
 
 To enable ActiveMQ's XA Recovery, the Recovery Manager must be
 configured to connect to ActiveMQ to recover its resources. The
@@ -971,7 +945,7 @@ to connect to ActiveMQ node under the form `[connector factory class
     mandatory only if the user name is specified
 
 -   `[connector parameters]` is a list of comma-separated key=value pair
-    which are passed to the connector factory (see ? for a list of the
+    which are passed to the connector factory (see [Configuring the transport](configuring-transports.md) for a list of the
     transport parameters).
 
 Also note the `com.arjuna.ats.jta.xaRecoveryNode` parameter. If you want
@@ -984,7 +958,7 @@ id is set to, this is configured in the same file by the
 > ActiveMQ must have a valid acceptor which corresponds to the connector
 > specified in `conf/jbossts-properties.xml`.
 
-### Configuration Settings
+#### Configuration Settings
 
 If ActiveMQ is configured with a default in-vm acceptor:
 
@@ -1024,8 +998,7 @@ Configuring ActiveMQ with an invm acceptor and configuring the Recovery
 Manager with an invm connector is the recommended way to enable XA
 Recovery.
 
-Example
--------
+## Example
 
 See ? which shows how to configure XA Recovery and recover messages
 after a server crash.

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/architecture.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/architecture.md b/docs/user-manual/en/architecture.md
index fe0eb7f..4bccc22 100644
--- a/docs/user-manual/en/architecture.md
+++ b/docs/user-manual/en/architecture.md
@@ -1,11 +1,9 @@
-Architecture
-============
+# Architecture
 
 In this section we will give an overview of the ActiveMQ high level
 architecture.
 
-Core Architecture
-=================
+## Core Architecture
 
 ActiveMQ core is designed simply as set of Plain Old Java Objects
 (POJOs) - we hope you like its clean-cut design.
@@ -16,8 +14,8 @@ other than the standard JDK classes! This is because we use some of the
 netty buffer classes internally.
 
 This allows ActiveMQ to be easily embedded in your own project, or
-instantiated in any dependency injection framework such as JBoss
-Microcontainer, Spring or Google Guice.
+instantiated in any dependency injection framework such as Spring or 
+Google Guice.
 
 Each ActiveMQ server has its own ultra high performance persistent
 journal, which it uses for message and other persistence.
@@ -61,18 +59,16 @@ server. User Application 1 is using the JMS API, while User Application
 You can see from the diagram that the JMS API is implemented by a thin
 facade layer on the client side.
 
-ActiveMQ embedded in your own application
-=========================================
+## ActiveMQ embedded in your own application
 
 ActiveMQ core is designed as a set of simple POJOs so if you have an
 application that requires messaging functionality internally but you
 don't want to expose that as a ActiveMQ server you can directly
 instantiate and embed ActiveMQ servers in your own application.
 
-For more information on embedding ActiveMQ, see ?.
+For more information on embedding ActiveMQ, see [Embedding HornetQ](embedding-hornetq.md).
 
-ActiveMQ integrated with a JEE application server
-=================================================
+## ActiveMQ integrated with a JEE application server
 
 ActiveMQ provides its own fully functional Java Connector Architecture
 (JCA) adaptor which enables it to be integrated easily into any JEE
@@ -118,35 +114,26 @@ time you want to interact from the EJB, which is an anti-pattern.
 
 ![ActiveMQ architecture2](images/architecture2.jpg)
 
-For more information on using the JCA adaptor, please see ?.
+For more information on using the JCA adaptor, please see [Application Server Integration and Java EE](appserver-integration.md).
 
-ActiveMQ stand-alone server
-===========================
+## ActiveMQ stand-alone server
 
 ActiveMQ can also be deployed as a stand-alone server. This means a
 fully independent messaging server not dependent on a JEE application
 server.
 
 The standard stand-alone messaging server configuration comprises a core
-messaging server, a JMS service and a JNDI service.
+messaging server and a JMS service.
 
 The role of the JMS Service is to deploy any JMS Queue, Topic and
 ConnectionFactory instances from any server side `activemq-jms.xml`
 configuration files. It also provides a simple management API for
-creating and destroying Queues, Topics and ConnectionFactory instances
+creating and destroying Queues and Topics
 which can be accessed via JMX or the connection. It is a separate
 service to the ActiveMQ core server, since the core server is JMS
-agnostic. If you don't want to deploy any JMS Queue, Topic or
-ConnectionFactory instances via server side XML configuration and don't
-require a JMS management API on the server side then you can disable
-this service.
-
-We also include a JNDI server since JNDI is a common requirement when
-using JMS to lookup Queues, Topics and ConnectionFactory instances. If
-you do not require JNDI then this service can also be disabled. ActiveMQ
-allows you to programmatically create JMS and core objects directly on
-the client side as opposed to looking them up from JNDI, so a JNDI
-server is not always a requirement.
+agnostic. If you don't want to deploy any JMS Queue or Topic via 
+server side XML configuration and don't require a JMS management 
+API on the server side then you can disable this service.
 
 The stand-alone server configuration uses JBoss Microcontainer to
 instantiate and enforce dependencies between the components. JBoss
@@ -156,4 +143,4 @@ The stand-alone server architecture is shown in figure 3.3 below:
 
 ![ActiveMQ architecture3](images/architecture3.jpg)
 
-For more information on server configuration files see ?. \$
+For more information on server configuration files see [Server Configuration](server-configuration.md)

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/client-classpath.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/client-classpath.md b/docs/user-manual/en/client-classpath.md
index 7142958..51ee972 100644
--- a/docs/user-manual/en/client-classpath.md
+++ b/docs/user-manual/en/client-classpath.md
@@ -1,5 +1,4 @@
-The Client Classpath
-====================
+# The Client Classpath
 
 ActiveMQ requires several jars on the *Client Classpath* depending on
 whether the client uses ActiveMQ Core API, JMS, and JNDI.
@@ -12,15 +11,13 @@ whether the client uses ActiveMQ Core API, JMS, and JNDI.
 > from different ActiveMQ versions. Mixing and matching different jar
 > versions may cause subtle errors and failures to occur.
 
-ActiveMQ Core Client
-====================
+## ActiveMQ Core Client
 
 If you are using just a pure ActiveMQ Core client (i.e. no JMS) then you
 need `activemq-core-client.jar`, `activemq-commons.jar`, and `netty.jar`
 on your client classpath.
 
-JMS Client
-==========
+## JMS Client
 
 If you are using JMS on the client side, then you will also need to
 include `activemq-jms-client.jar` and `jboss-jms-api.jar`.

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/client-reconnection.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/client-reconnection.md b/docs/user-manual/en/client-reconnection.md
index 4ee441c..de434b8 100644
--- a/docs/user-manual/en/client-reconnection.md
+++ b/docs/user-manual/en/client-reconnection.md
@@ -1,17 +1,15 @@
-Client Reconnection and Session Reattachment
-============================================
+# Client Reconnection and Session Reattachment
 
 ActiveMQ clients can be configured to automatically reconnect or
 re-attach to the server in the event that a failure is detected in the
 connection between the client and the server.
 
-100% Transparent session re-attachment
-======================================
+## 100% Transparent session re-attachment
 
 If the failure was due to some transient failure such as a temporary
 network failure, and the target server was not restarted, then the
 sessions will still be existent on the server, assuming the client
-hasn't been disconnected for more than connection-ttl ?.
+hasn't been disconnected for more than connection-ttl [Detecting Dead Connections](connection-ttl.md)
 
 In this scenario, ActiveMQ will automatically re-attach the client
 sessions to the server sessions when the connection reconnects. This is
@@ -54,8 +52,7 @@ re-attachment from occurring, forcing reconnect instead. The default
 value for this parameter is `-1`. (Which means by default no auto
 re-attachment will occur)
 
-Session reconnection
-====================
+## Session reconnection
 
 Alternatively, the server might have actually been restarted after
 crashing or being stopped. In this case any sessions will no longer be
@@ -70,13 +67,12 @@ as what happens during failover onto a backup server.
 Client reconnection is also used internally by components such as core
 bridges to allow them to reconnect to their target servers.
 
-Please see the section on failover ? to get a full understanding of how
+Please see the section on failover [Automatic Client Failover](ha.md) to get a full understanding of how
 transacted and non-transacted sessions are reconnected during
 failover/reconnect and what you need to do to maintain *once and only
 once*delivery guarantees.
 
-Configuring reconnection/reattachment attributes
-================================================
+## Configuring reconnection/reattachment attributes
 
 Client reconnection is configured using the following parameters:
 

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/clusters.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/clusters.md b/docs/user-manual/en/clusters.md
index 6a1786c..ff61884 100644
--- a/docs/user-manual/en/clusters.md
+++ b/docs/user-manual/en/clusters.md
@@ -1,8 +1,6 @@
-Clusters
-========
+# Clusters
 
-Clusters Overview
-=================
+## Clusters Overview
 
 ActiveMQ clusters allow groups of ActiveMQ servers to be grouped
 together in order to share message processing load. Each active node in
@@ -18,7 +16,7 @@ and handles its own connections.
 The cluster is formed by each node declaring *cluster connections* to
 other nodes in the core configuration file `activemq-configuration.xml`.
 When a node forms a cluster connection to another node, internally it
-creates a *core bridge* (as described in ?) connection between it and
+creates a *core bridge* (as described in [Core Bridges](core-bridges.md)) connection between it and
 the other node, this is done transparently behind the scenes - you don't
 have to declare an explicit bridge for each node. These cluster
 connections allow messages to flow between the nodes of the cluster to
@@ -49,8 +47,7 @@ connect to them with the minimum of configuration.
 > *must* be unique among nodes in the cluster or the cluster will not
 > form properly.
 
-Server discovery
-================
+## Server discovery
 
 Server discovery is a mechanism by which servers can propagate their
 connection details to:
@@ -72,20 +69,19 @@ techniques like
 [JGroups](http://www.jgroups.org/), or by providing a list of initial
 connectors.
 
-Dynamic Discovery
------------------
+### Dynamic Discovery
 
 Server discovery uses
 [UDP](http://en.wikipedia.org/wiki/User_Datagram_Protocol) multicast or
 [JGroups](http://www.jgroups.org/) to broadcast server connection
 settings.
 
-### Broadcast Groups
+#### Broadcast Groups
 
 A broadcast group is the means by which a server broadcasts connectors
 over the network. A connector defines a way in which a client (or other
 server) can make connections to the server. For more information on what
-a connector is, please see ?.
+a connector is, please see [Configuring the Transport](configuring-transports.md).
 
 The broadcast group takes a set of connector pairs, each connector pair
 contains connection settings for a live and backup server (if one
@@ -147,7 +143,7 @@ clarity. Let's discuss each one in turn:
     value is `2000` milliseconds.
 
 -   `connector-ref`. This specifies the connector and optional backup
-    connector that will be broadcasted (see ? for more information on
+    connector that will be broadcasted (see [Configuring the Transport](configuring-transports.md) for more information on
     connectors). The connector to be broadcasted is specified by the
     `connector-name` attribute.
 
@@ -244,7 +240,7 @@ example if the above stacks configuration is stored in a file named
 
     <jgroups-file>jgroups-stacks.xml</jgroups-file>
 
-### Discovery Groups
+#### Discovery Groups
 
 While the broadcast group defines how connector information is
 broadcasted from a server, a discovery group defines how connector
@@ -279,7 +275,7 @@ normal ActiveMQ connections.
 > if broadcast is configured using UDP, the discovery group must also
 > use UDP, and the same multicast address.
 
-### Defining Discovery Groups on the Server
+#### Defining Discovery Groups on the Server
 
 For cluster connections, discovery groups are defined in the server side
 configuration file `activemq-configuration.xml`. All discovery groups
@@ -353,13 +349,13 @@ details as following:
 > one set can be specified in a discovery group configuration. Don't mix
 > them!
 
-### Discovery Groups on the Client Side
+#### Discovery Groups on the Client Side
 
 Let's discuss how to configure a ActiveMQ client to use discovery to
 discover a list of servers to which it can connect. The way to do this
 differs depending on whether you're using JMS or the core API.
 
-#### Configuring client discovery using JMS
+##### Configuring client discovery using JMS
 
 If you're using JMS and you're using JNDI on the client to look up your
 JMS connection factory instances then you can specify these parameters
@@ -385,17 +381,19 @@ factory - you're instantiating the JMS connection factory directly then
 you can specify the discovery group parameters directly when creating
 the JMS connection factory. Here's an example:
 
-    final String groupAddress = "231.7.7.7";
+``` java
+final String groupAddress = "231.7.7.7";
 
-    final int groupPort = 9876;
+final int groupPort = 9876;
 
-    ConnectionFactory jmsConnectionFactory =
-    ActiveMQJMSClient.createConnectionFactory(new DiscoveryGroupConfiguration(groupAddress, groupPort,
-                           new UDPBroadcastGroupConfiguration(groupAddress, groupPort, null, -1)), JMSFactoryType.CF);
+ConnectionFactory jmsConnectionFactory =
+ActiveMQJMSClient.createConnectionFactory(new DiscoveryGroupConfiguration(groupAddress, groupPort,
+                       new UDPBroadcastGroupConfiguration(groupAddress, groupPort, null, -1)), JMSFactoryType.CF);
 
-    Connection jmsConnection1 = jmsConnectionFactory.createConnection();
+Connection jmsConnection1 = jmsConnectionFactory.createConnection();
 
-    Connection jmsConnection2 = jmsConnectionFactory.createConnection();
+Connection jmsConnection2 = jmsConnectionFactory.createConnection();
+```
 
 The `refresh-timeout` can be set directly on the
 DiscoveryGroupConfiguration by using the setter method
@@ -410,20 +408,22 @@ the connection factory will make sure it waits this long since creation
 before creating the first connection. The default value for this
 parameter is `10000` milliseconds.
 
-#### Configuring client discovery using Core
+##### Configuring client discovery using Core
 
 If you're using the core API to directly instantiate
 `ClientSessionFactory` instances, then you can specify the discovery
 group parameters directly when creating the session factory. Here's an
 example:
 
-    final String groupAddress = "231.7.7.7";
-    final int groupPort = 9876;
-    ServerLocator factory = ActiveMQClient.createServerLocatorWithHA(new DiscoveryGroupConfiguration(groupAddress, groupPort,
-                               new UDPBroadcastGroupConfiguration(groupAddress, groupPort, null, -1))));
-    ClientSessionFactory factory = locator.createSessionFactory();
-    ClientSession session1 = factory.createSession();
-    ClientSession session2 = factory.createSession();
+``` java
+final String groupAddress = "231.7.7.7";
+final int groupPort = 9876;
+ServerLocator factory = ActiveMQClient.createServerLocatorWithHA(new DiscoveryGroupConfiguration(groupAddress, groupPort,
+                           new UDPBroadcastGroupConfiguration(groupAddress, groupPort, null, -1))));
+ClientSessionFactory factory = locator.createSessionFactory();
+ClientSession session1 = factory.createSession();
+ClientSession session2 = factory.createSession();
+```
 
 The `refresh-timeout` can be set directly on the
 DiscoveryGroupConfiguration by using the setter method
@@ -438,8 +438,7 @@ the session factory will make sure it waits this long since creation
 before creating the first session. The default value for this parameter
 is `10000` milliseconds.
 
-Discovery using static Connectors
----------------------------------
+### Discovery using static Connectors
 
 Sometimes it may be impossible to use UDP on the network you are using.
 In this case its possible to configure a connection with an initial list
@@ -452,18 +451,18 @@ to be hosted, you can configure these servers to use the reliable
 servers to connect to. Once they are connected there connection details
 will be propagated via the server it connects to
 
-### Configuring a Cluster Connection
+#### Configuring a Cluster Connection
 
 For cluster connections there is no extra configuration needed, you just
 need to make sure that any connectors are defined in the usual manner,
-(see ? for more information on connectors). These are then referenced by
+(see [Configuring the Transport](configuring-transports.md) for more information on connectors). These are then referenced by
 the cluster connection configuration.
 
-### Configuring a Client Connection
+#### Configuring a Client Connection
 
 A static list of possible servers can also be used by a normal client.
 
-#### Configuring client discovery using JMS
+##### Configuring client discovery using JMS
 
 If you're using JMS and you're using JNDI on the client to look up your
 JMS connection factory instances then you can specify these parameters
@@ -483,43 +482,46 @@ factory - you're instantiating the JMS connection factory directly then
 you can specify the connector list directly when creating the JMS
 connection factory. Here's an example:
 
-    HashMap<String, Object> map = new HashMap<String, Object>();
-    map.put("host", "myhost");
-    map.put("port", "5445");
-    TransportConfiguration server1 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map);
-    HashMap<String, Object> map2 = new HashMap<String, Object>();
-    map2.put("host", "myhost2");
-    map2.put("port", "5446");
-    TransportConfiguration server2 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map2);
+``` java
+HashMap<String, Object> map = new HashMap<String, Object>();
+map.put("host", "myhost");
+map.put("port", "5445");
+TransportConfiguration server1 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map);
+HashMap<String, Object> map2 = new HashMap<String, Object>();
+map2.put("host", "myhost2");
+map2.put("port", "5446");
+TransportConfiguration server2 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map2);
 
-    ActiveMQConnectionFactory cf = ActiveMQJMSClient.createConnectionFactoryWithHA(JMSFactoryType.CF, server1, server2);
+ActiveMQConnectionFactory cf = ActiveMQJMSClient.createConnectionFactoryWithHA(JMSFactoryType.CF, server1, server2);
+```
 
-#### Configuring client discovery using Core
+##### Configuring client discovery using Core
 
 If you are using the core API then the same can be done as follows:
 
-    HashMap<String, Object> map = new HashMap<String, Object>();
-    map.put("host", "myhost");
-    map.put("port", "5445");
-    TransportConfiguration server1 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map);
-    HashMap<String, Object> map2 = new HashMap<String, Object>();
-    map2.put("host", "myhost2");
-    map2.put("port", "5446");
-    TransportConfiguration server2 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map2);
+``` java
+HashMap<String, Object> map = new HashMap<String, Object>();
+map.put("host", "myhost");
+map.put("port", "5445");
+TransportConfiguration server1 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map);
+HashMap<String, Object> map2 = new HashMap<String, Object>();
+map2.put("host", "myhost2");
+map2.put("port", "5446");
+TransportConfiguration server2 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map2);
 
-    ServerLocator locator = ActiveMQClient.createServerLocatorWithHA(server1, server2);
-    ClientSessionFactory factory = locator.createSessionFactory();
-    ClientSession session = factory.createSession();
+ServerLocator locator = ActiveMQClient.createServerLocatorWithHA(server1, server2);
+ClientSessionFactory factory = locator.createSessionFactory();
+ClientSession session = factory.createSession();
+```
 
-Server-Side Message Load Balancing
-==================================
+## Server-Side Message Load Balancing
 
 If cluster connections are defined between nodes of a cluster, then
 ActiveMQ will load balance messages arriving at a particular node from a
 client.
 
 Let's take a simple example of a cluster of four nodes A, B, C, and D
-arranged in a *symmetric cluster* (described in ?). We have a queue
+arranged in a *symmetric cluster* (described in Symmetrical Clusters section). We have a queue
 called `OrderQueue` deployed on each node of the cluster.
 
 We have client Ca connected to node A, sending orders to the server. We
@@ -549,8 +551,7 @@ nodes if they have matching consumers. We'll look at both these cases in
 turn with some examples, but first we'll discuss configuring cluster
 connections in general.
 
-Configuring Cluster Connections
--------------------------------
+### Configuring Cluster Connections
 
 Cluster connections group servers into clusters so that messages can be
 load balanced between the nodes of the cluster. Let's take a look at a
@@ -665,7 +666,7 @@ specified. The following shows all the available configuration options
 
     This parameter determines the interval in milliseconds between retry
     attempts. It has the same meaning as the `retry-interval` on a
-    bridge (as described in ?).
+    bridge (as described in [Core Bridges](core-bridges.md)).
 
     This parameter is optional and its default value is `500`
     milliseconds.
@@ -697,7 +698,7 @@ specified. The following shows all the available configuration options
     the target node.
 
     This parameter has the same meaning as `use-duplicate-detection` on
-    a bridge. For more information on duplicate detection, please see ?.
+    a bridge. For more information on duplicate detection, please see [Duplicate Detection](duplicate-detection.md).
     Default is true.
 
 -   `forward-when-no-consumers`. This parameter determines whether
@@ -772,8 +773,7 @@ one will be available. There may be many more servers in the cluster but
 these will; be discovered via one of these connectors once an initial
 connection has been made.
 
-Cluster User Credentials
-------------------------
+### Cluster User Credentials
 
 When creating connections between nodes of a cluster to form a cluster
 connection, ActiveMQ uses a cluster user and cluster password which is
@@ -789,8 +789,7 @@ defined in `activemq-configuration.xml`:
 > the default values. If they are not changed from the default, ActiveMQ
 > will detect this and pester you with a warning on every start-up.
 
-Client-Side Load balancing
-==========================
+## Client-Side Load balancing
 
 With ActiveMQ client-side load balancing, subsequent sessions created
 using a single session factory can be connected to different nodes of
@@ -857,14 +856,18 @@ If you're using JMS but you're instantiating your connection factory
 directly on the client side then you can set the load balancing policy
 using the setter on the `ActiveMQConnectionFactory` before using it:
 
-    ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactory(...);
-    jmsConnectionFactory.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
+``` java
+ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactory(...);
+jmsConnectionFactory.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
+```
 
 If you're using the core API, you can set the load balancing policy
 directly on the `ServerLocator` instance you are using:
 
-    ServerLocator locator = ActiveMQClient.createServerLocatorWithHA(server1, server2);
-    locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
+``` java
+ServerLocator locator = ActiveMQClient.createServerLocatorWithHA(server1, server2);
+locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
+```
 
 The set of servers over which the factory load balances can be
 determined in one of two ways:
@@ -873,8 +876,7 @@ determined in one of two ways:
 
 -   Using discovery.
 
-Specifying Members of a Cluster Explicitly
-==========================================
+## Specifying Members of a Cluster Explicitly
 
 Sometimes you want to explicitly define a cluster more explicitly, that
 is control which server connect to each other in the cluster. This is
@@ -899,8 +901,7 @@ In this example we have set the attribute
 this server can create a cluster connection to is server1-connector.
 This means you can explicitly create any cluster topology you want.
 
-Message Redistribution
-======================
+## Message Redistribution
 
 Another important part of clustering is message redistribution. Earlier
 we learned how server side message load balancing round robins messages
@@ -925,7 +926,7 @@ default message redistribution is disabled.
 
 Message redistribution can be configured on a per address basis, by
 specifying the redistribution delay in the address settings, for more
-information on configuring address settings, please see ?.
+information on configuring address settings, please see [Queue Attributes](queue-attributes.md).
 
 Here's an address settings snippet from `activemq-configuration.xml`
 showing how message redistribution is enabled for a set of queues:
@@ -943,7 +944,7 @@ with "jms.", so the above would enable instant (no delay) redistribution
 for all JMS queues and topic subscriptions.
 
 The attribute `match` can be an exact match or it can be a string that
-conforms to the ActiveMQ wildcard syntax (described in ?).
+conforms to the ActiveMQ wildcard syntax (described in [Wildcard Syntax](wildcard-syntax.md)).
 
 The element `redistribution-delay` defines the delay in milliseconds
 after the last consumer is closed on a queue before redistributing
@@ -957,14 +958,12 @@ a common case that a consumer closes but another one quickly is created
 on the same queue, in such a case you probably don't want to
 redistribute immediately since the new consumer will arrive shortly.
 
-Cluster topologies
-==================
+## Cluster topologies
 
 ActiveMQ clusters can be connected together in many different
 topologies, let's consider the two most common ones here
 
-Symmetric cluster
------------------
+### Symmetric cluster
 
 A symmetric cluster is probably the most common cluster topology, and
 you'll be familiar with if you've had experience of JBoss Application
@@ -989,8 +988,7 @@ the nodes.
 Don't forget [this warning](#copy-warning) when creating a symmetric
 cluster.
 
-Chain cluster
--------------
+### Chain cluster
 
 With a chain cluster, each node in the cluster is not connected to every
 node in the cluster directly, instead the nodes form a chain with a node
@@ -1021,8 +1019,7 @@ distribute messages to node B when they arrive, even though node B has
 no consumers itself, it would know that a further hop away is node C
 which does have consumers.
 
-Scaling Down
-============
+### Scaling Down
 
 ActiveMQ supports scaling down a cluster with no message loss (even for
 non-durable messages). This is especially useful in certain environments

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/configuring-transports.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/configuring-transports.md b/docs/user-manual/en/configuring-transports.md
index f1d6194..af0c2b2 100644
--- a/docs/user-manual/en/configuring-transports.md
+++ b/docs/user-manual/en/configuring-transports.md
@@ -1,5 +1,4 @@
-Configuring the Transport
-=========================
+# Configuring the Transport
 
 ActiveMQ has a fully pluggable and highly flexible transport layer and
 defines its own Service Provider Interface (SPI) to make plugging in a
@@ -8,8 +7,7 @@ new transport provider relatively straightforward.
 In this chapter we'll describe the concepts required for understanding
 ActiveMQ transports and where and how they're configured.
 
-Understanding Acceptors
-=======================
+## Understanding Acceptors
 
 One of the most important concepts in ActiveMQ transports is the
 *acceptor*. Let's dive straight in and take a look at an acceptor
@@ -56,8 +54,7 @@ multiple protocols. By default this will be all available protocols but
 can be limited by either the now deprecated `protocol` param or by
 setting a comma seperated list to the newly added `protocols` parameter.
 
-Understanding Connectors
-========================
+## Understanding Connectors
 
 Whereas acceptors are used on the server to define how we accept
 connections, connectors are used by a client to define how it connects
@@ -103,8 +100,7 @@ couple of reasons for this:
         java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
         java.naming.provider.url=tcp://myhost:5445
 
-Configuring the transport directly from the client side.
-========================================================
+## Configuring the transport directly from the client side.
 
 How do we configure a core `ClientSessionFactory` with the information
 that it needs to connect with a server?
@@ -120,45 +116,48 @@ connect directly to the acceptor we defined earlier in this chapter, it
 uses the standard Netty TCP transport and will try and connect on port
 5446 to localhost (default):
 
-    Map<String, Object> connectionParams = new HashMap<String, Object>();
+``` java
+Map<String, Object> connectionParams = new HashMap<String, Object>();
 
-    connectionParams.put(org.apache.activemq.core.remoting.impl.netty.TransportConstants.PORT_PROP_NAME,
-                        5446);
+connectionParams.put(org.apache.activemq.core.remoting.impl.netty.TransportConstants.PORT_PROP_NAME,
+                    5446);
 
-    TransportConfiguration transportConfiguration =
-        new TransportConfiguration(
-        "org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory",
-        connectionParams);
+TransportConfiguration transportConfiguration =
+    new TransportConfiguration(
+    "org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory",
+    connectionParams);
 
-    ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(transportConfiguration);
+ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(transportConfiguration);
 
-    ClientSessionFactory sessionFactory = locator.createClientSessionFactory();
+ClientSessionFactory sessionFactory = locator.createClientSessionFactory();
 
-    ClientSession session = sessionFactory.createSession(...);
+ClientSession session = sessionFactory.createSession(...);
 
-    etc
+etc
+```
 
 Similarly, if you're using JMS, you can configure the JMS connection
 factory directly on the client side without having to define a connector
 on the server side or define a connection factory in `activemq-jms.xml`:
 
-    Map<String, Object> connectionParams = new HashMap<String, Object>();
+``` java
+Map<String, Object> connectionParams = new HashMap<String, Object>();
 
-    connectionParams.put(org.apache.activemq.core.remoting.impl.netty.TransportConstants.PORT_PROP_NAME, 5446);
+connectionParams.put(org.apache.activemq.core.remoting.impl.netty.TransportConstants.PORT_PROP_NAME, 5446);
 
-    TransportConfiguration transportConfiguration =
-        new TransportConfiguration(
-        "org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory",
-        connectionParams);
+TransportConfiguration transportConfiguration =
+    new TransportConfiguration(
+    "org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory",
+    connectionParams);
 
-    ConnectionFactory connectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration);
+ConnectionFactory connectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration);
 
-    Connection jmsConnection = connectionFactory.createConnection();
+Connection jmsConnection = connectionFactory.createConnection();
 
-    etc
+etc
+```
 
-Configuring the Netty transport
-===============================
+## Configuring the Netty transport
 
 Out of the box, ActiveMQ currently uses
 [Netty](http://www.jboss.org/netty/), a high performance low level
@@ -170,8 +169,7 @@ straightforward TCP sockets, SSL, or to tunnel over HTTP or HTTPS..
 
 We believe this caters for the vast majority of transport requirements.
 
-Single Port Support
--------------------
+## Single Port Support
 
 As of version 2.4 ActiveMQ now supports using a single port for all
 protocols, ActiveMQ will automatically detect which protocol is being
@@ -189,8 +187,7 @@ It is possible to limit which protocols are supported by using the
 >
 > The `protocol` parameter is now deprecated
 
-Configuring Netty TCP
----------------------
+## Configuring Netty TCP
 
 Netty TCP is a simple unencrypted TCP sockets based transport. Netty TCP
 can be configured to use old blocking Java IO or non blocking Java NIO.
@@ -320,8 +317,7 @@ Netty for simple TCP:
     connector will let the system pick up an ephemeral port. valid ports
     are 0 to 65535
 
-Configuring Netty SSL
----------------------
+## Configuring Netty SSL
 
 Netty SSL is similar to the Netty TCP transport but it provides
 additional security by encrypting TCP connections using the Secure
@@ -424,8 +420,7 @@ following additional properties:
     connecting to this acceptor that 2-way SSL is required. Valid values
     are `true` or `false`. Default is `false`.
 
-Configuring Netty HTTP
-----------------------
+## Configuring Netty HTTP
 
 Netty HTTP tunnels packets over the HTTP protocol. It can be useful in
 scenarios where firewalls only allow HTTP traffic to pass.
@@ -454,9 +449,3 @@ additional properties:
 -   `http-requires-session-id`. If true the client will wait after the
     first call to receive a session id. Used the http connector is
     connecting to servlet acceptor (not recommended)
-
-Configuring Netty Servlet
--------------------------
-
-As of 2.4 ActiveMQ Servlet support will be provided via Undertow in
-Wildfly

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/connection-ttl.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/connection-ttl.md b/docs/user-manual/en/connection-ttl.md
index 80af334..31a03fa 100644
--- a/docs/user-manual/en/connection-ttl.md
+++ b/docs/user-manual/en/connection-ttl.md
@@ -1,12 +1,10 @@
-Detecting Dead Connections
-==========================
+# Detecting Dead Connections
 
 In this section we will discuss connection time-to-live (TTL) and
 explain how ActiveMQ deals with crashed clients and clients which have
 exited without cleanly closing their resources.
 
-Cleaning up Dead Connection Resources on the Server
-===================================================
+## Cleaning up Dead Connection Resources on the Server
 
 Before a ActiveMQ client application exits it is considered good
 practice that it should close its resources in a controlled manner,
@@ -15,57 +13,61 @@ using a `finally` block.
 Here's an example of a well behaved core client application closing its
 session and session factory in a finally block:
 
-    ServerLocator locator = null;
-    ClientSessionFactory sf = null;
-    ClientSession session = null;
-
-    try
-    {
-       locator = ActiveMQClient.createServerLocatorWithoutHA(..);
-
-       sf = locator.createClientSessionFactory();;
-
-       session = sf.createSession(...);
-       
-       ... do some stuff with the session...
-    }
-    finally
-    {
-       if (session != null)
-       {
-          session.close();
-       }
-       
-       if (sf != null)
-       {
-          sf.close();
-       }
-
-       if(locator != null)
-       {
-          locator.close();
-       }
-    }
+``` java
+ServerLocator locator = null;
+ClientSessionFactory sf = null;
+ClientSession session = null;
+
+try
+{
+   locator = ActiveMQClient.createServerLocatorWithoutHA(..);
+
+   sf = locator.createClientSessionFactory();;
+
+   session = sf.createSession(...);
+   
+   ... do some stuff with the session...
+}
+finally
+{
+   if (session != null)
+   {
+      session.close();
+   }
+   
+   if (sf != null)
+   {
+      sf.close();
+   }
+
+   if(locator != null)
+   {
+      locator.close();
+   }
+}
+```
 
 And here's an example of a well behaved JMS client application:
 
-    Connection jmsConnection = null;
+``` java
+Connection jmsConnection = null;
 
-    try
-    {
-       ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(...);
+try
+{
+   ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(...);
 
-       jmsConnection = jmsConnectionFactory.createConnection();
+   jmsConnection = jmsConnectionFactory.createConnection();
 
-       ... do some stuff with the connection...
-    }
-    finally
-    {
-       if (connection != null)
-       {
-          connection.close();
-       }
-    }
+   ... do some stuff with the connection...
+}
+finally
+{
+   if (connection != null)
+   {
+      connection.close();
+   }
+}
+```
 
 Unfortunately users don't always write well behaved applications, and
 sometimes clients just crash so they don't have a chance to clean up
@@ -112,8 +114,7 @@ server side. This can be done by specifying the
 The default value for `connection-ttl-override` is `-1` which means "do
 not override" (i.e. let clients use their own values).
 
-Closing core sessions or JMS connections that you have failed to close
-----------------------------------------------------------------------
+## Closing core sessions or JMS connections that you have failed to close
 
 As previously discussed, it's important that all core client sessions
 and JMS connections are always closed explicitly in a `finally` block
@@ -138,8 +139,7 @@ where you created the JMS connection / client session that you later did
 not close. This will enable you to pinpoint the error in your code and
 correct it appropriately.
 
-Detecting failure from the client side.
-=======================================
+## Detecting failure from the client side.
 
 In the previous section we discussed how the client sends pings to the
 server and how "dead" connection resources are cleaned up by the server.
@@ -169,8 +169,7 @@ will never fail the connection on the client side if no data is received
 from the server. Typically this is much lower than connection TTL to
 allow clients to reconnect in case of transitory failure.
 
-Configuring Asynchronous Connection Execution
-=============================================
+## Configuring Asynchronous Connection Execution
 
 Most packets received on the server side are executed on the remoting
 thread. These packets represent short-running operations and are always

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/core-bridges.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/core-bridges.md b/docs/user-manual/en/core-bridges.md
index 6b6b90f..b1e4e6e 100644
--- a/docs/user-manual/en/core-bridges.md
+++ b/docs/user-manual/en/core-bridges.md
@@ -1,5 +1,4 @@
-Core Bridges
-============
+# Core Bridges
 
 The function of a bridge is to consume messages from a source queue, and
 forward them to a target address, typically on a different ActiveMQ
@@ -21,7 +20,7 @@ be ActiveMQ servers.
 
 Bridges can be configured to provide *once and only once* delivery
 guarantees even in the event of the failure of the source or the target
-server. They do this by using duplicate detection (described in ?).
+server. They do this by using duplicate detection (described in [Duplicate Detection](duplicate-detection.md)).
 
 > **Note**
 >
@@ -37,8 +36,7 @@ server. They do this by using duplicate detection (described in ?).
 > provide the same guarantee using a JMS bridge you would have to use XA
 > which has a higher overhead and is more complex to configure.
 
-Configuring Bridges
-===================
+## Configuring Bridges
 
 Bridges are configured in `activemq-configuration.xml`. Let's kick off
 with an example (this is actually from the bridge example):
@@ -100,7 +98,7 @@ Let's take a look at all the parameters in turn:
 -   `filter-string`. An optional filter string can be supplied. If
     specified then only messages which match the filter expression
     specified in the filter string will be forwarded. The filter string
-    follows the ActiveMQ filter expression syntax described in ?.
+    follows the ActiveMQ filter expression syntax described in [Filter Expressions](filter-expressions.md).
 
 -   `transformer-class-name`. An optional transformer-class-name can be
     specified. This is the name of a user-defined class which implements
@@ -179,7 +177,7 @@ Let's take a look at all the parameters in turn:
     allows these duplicates to be screened out and ignored.
 
     This allows the bridge to provide a *once and only once* delivery
-    guarantee without using heavyweight methods such as XA (see ? for
+    guarantee without using heavyweight methods such as XA (see [Duplicate Detection](duplicate-detection.md) for
     more information).
 
     The default value for this parameter is `true`.
@@ -187,7 +185,7 @@ Let's take a look at all the parameters in turn:
 -   `confirmation-window-size`. This optional parameter determines the
     `confirmation-window-size` to use for the connection used to forward
     messages to the target node. This attribute is described in section
-    ?
+    [Reconnection and Session Reattachment](client-reconnection.md)
 
     > **Warning**
     >
@@ -215,11 +213,11 @@ Let's take a look at all the parameters in turn:
     encapsulates knowledge of what transport to use (TCP, SSL, HTTP etc)
     as well as the server connection parameters (host, port etc). For
     more information about what connectors are and how to configure
-    them, please see ?.
+    them, please see [Configuring the Transport](configuring-transports.md).
 
     The `discovery-group-ref` element has one attribute -
     `discovery-group-name`. This attribute points to a `discovery-group`
     defined elsewhere. For more information about what discovery-groups
-    are and how to configure them, please see ?.
+    are and how to configure them, please see [Discovery Groups](clusters.md).
 
 

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/diverts.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/diverts.md b/docs/user-manual/en/diverts.md
index 60b00f7..eddfba3 100644
--- a/docs/user-manual/en/diverts.md
+++ b/docs/user-manual/en/diverts.md
@@ -1,5 +1,4 @@
-Diverting and Splitting Message Flows
-=====================================
+# Diverting and Splitting Message Flows
 
 ActiveMQ allows you to configure objects called *diverts* with some
 simple server configuration.
@@ -43,8 +42,7 @@ use diverts.
 
 Let's take a look at some divert examples:
 
-Exclusive Divert
-================
+## Exclusive Divert
 
 Let's take a look at an exclusive divert. An exclusive divert diverts
 all matching messages that are routed to the old address to the new
@@ -86,8 +84,7 @@ queue, which is configured with a bridge which forwards the message to
 an address on another ActiveMQ server. Please see the example for more
 details.
 
-Non-exclusive Divert
-====================
+## Non-exclusive Divert
 
 Now we'll take a look at a non-exclusive divert. Non exclusive diverts
 are the same as exclusive diverts, but they only forward a *copy* of the

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/b4144013/docs/user-manual/en/duplicate-detection.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/duplicate-detection.md b/docs/user-manual/en/duplicate-detection.md
index b7776eb..bc18c99 100644
--- a/docs/user-manual/en/duplicate-detection.md
+++ b/docs/user-manual/en/duplicate-detection.md
@@ -1,5 +1,4 @@
-Duplicate Message Detection
-===========================
+# Duplicate Message Detection
 
 ActiveMQ includes powerful automatic duplicate message detection,
 filtering out duplicate messages without you having to code your own
@@ -38,8 +37,7 @@ successfully committed or not!
 To solve these issues ActiveMQ provides automatic duplicate messages
 detection for messages sent to addresses.
 
-Using Duplicate Detection for Message Sending
-=============================================
+## Using Duplicate Detection for Message Sending
 
 Enabling duplicate message detection for sent messages is simple: you
 just need to set a special property on the message to a unique value.
@@ -75,30 +73,32 @@ by generating a UUID.
 
 Here's an example of setting the property using the core API:
 
-    ...     
+``` java
+...     
 
-    ClientMessage message = session.createMessage(true);
+ClientMessage message = session.createMessage(true);
 
-    SimpleString myUniqueID = "This is my unique id";   // Could use a UUID for this
+SimpleString myUniqueID = "This is my unique id";   // Could use a UUID for this
 
-    message.setStringProperty(HDR_DUPLICATE_DETECTION_ID, myUniqueID);
+message.setStringProperty(HDR_DUPLICATE_DETECTION_ID, myUniqueID);
 
-    ...
+```
 
 And here's an example using the JMS API:
 
-    ...     
+``` java
+...     
 
-    Message jmsMessage = session.createMessage();
+Message jmsMessage = session.createMessage();
 
-    String myUniqueID = "This is my unique id";   // Could use a UUID for this
+String myUniqueID = "This is my unique id";   // Could use a UUID for this
 
-    message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID);
+message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID);
 
-    ...
+...
+```
 
-Configuring the Duplicate ID Cache
-==================================
+## Configuring the Duplicate ID Cache
 
 The server maintains caches of received values of the
 `org.apache.activemq.core.message.impl.HDR_DUPLICATE_DETECTION_ID`
@@ -124,8 +124,7 @@ value for this parameter is `true`.
 > larger enough size so if you resend messages all the previously sent
 > ones are in the cache not having been overwritten.
 
-Duplicate Detection and Bridges
-===============================
+## Duplicate Detection and Bridges
 
 Core bridges can be configured to automatically add a unique duplicate
 id value (if there isn't already one in the message) before forwarding
@@ -141,10 +140,9 @@ the `use-duplicate-detection` to `true` when configuring a bridge in
 The default value for this parameter is `true`.
 
 For more information on core bridges and how to configure them, please
-see ?.
+see [Core Bridges](core-bridges.md).
 
-Duplicate Detection and Cluster Connections
-===========================================
+## Duplicate Detection and Cluster Connections
 
 Cluster connections internally use core bridges to move messages
 reliable between nodes of the cluster. Consequently they can also be
@@ -158,4 +156,4 @@ connection in `activemq-configuration.xml`.
 The default value for this parameter is `true`.
 
 For more information on cluster connections and how to configure them,
-please see ?.
+please see [Clusters](clusters.md).