diff --git a/include/core/state_block/factory_state_block.h b/include/core/state_block/factory_state_block.h
index c353121b724011b993942d5a567166963a7440d0..0ffb0f23bbd9d18896c68f01b2c3f48183f39cc7 100644
--- a/include/core/state_block/factory_state_block.h
+++ b/include/core/state_block/factory_state_block.h
@@ -1,8 +1,8 @@
 /*
- * factory_state_block.h
+ * \file factory_state_block.h
  *
  *  Created on: Apr 27, 2020
- *      Author: jsola
+ *      \author: jsola
  */
 
 #ifndef STATE_BLOCK_FACTORY_STATE_BLOCK_H_
@@ -14,13 +14,107 @@
 namespace wolf
 {
 
-// State blocks factory
+/** \brief StateBlock factory class
+ *
+ * This factory can create  objects of class StateBlock and classes deriving from StateBlock.
+ *
+ * Specific object creation is invoked by create(TYPE, state, fixed),
+ * and the TYPE of state block is identified with a string.
+ * For example, the following processor types are implemented,
+ *   - "StateBlock"         for StateBlock
+ *   - "StateQuaternion"    for StateQuaternion
+ *   - "StateAngle"         for StateAngle
+ *   - "StateHomogeneous3d" for StateHomogeneous3d
+ *
+ * The factory also creates state blocks according to the block key used in to identify state blocks in each Wolf node.
+ * These keys are single-letter strings. The following letters are implemented
+ *   - "O"  for 2d orientation, creates StateAngle
+ *   - "O"  for 3d orientation, creates StateQuaternion
+ *   - "H"  crestes StateHomogeneous3d
+ *
+ * Any other letter creates the base StateBlock.
+ *
+ * Find general Factory documentation in class Factory:
+ *   - Access the factory
+ *   - Register/unregister creators
+ *   - Invoke object creation
+ *
+ * This documentation shows you how to use the FactoryStateBlock specifically:
+ *   - Write a state block creator
+ *   - Create state blocks
+ *
+ * #### Write state block creators
+ * StateBlock creators have the following API:
+ *
+ *     \code
+ *     static StateBlockPtr create(const Eigen::VectorXd& _state, bool _fixed);
+ *     \endcode
+ *
+ * They follow the general implementation shown below:
+ *
+ *     \code
+ *      static StateBlockPtr create(const Eigen::VectorXd& _state, bool _fixed)
+ *      {
+ *          return std::make_shared<StateBlockDerived>(_state, _fixed);
+ *      }
+ *     \endcode
+ *
+ * #### Creating processors
+ * Note: Prior to invoking the creation of a processor of a derived type,
+ * you must register the creator for this type into the factory.
+ *
+ * Note: State blocks of the base type do not need to be registered.
+ *
+ * To create a StateQuaternion, you type:
+ *
+ *     \code
+ *     auto sq_ptr = FactoryStateBlock::get().create("StateQuaternion", Vector4d(1,0,0,0), false);
+ *     \endcode
+ *
+ * If your problem has dimension 3 (e.g. is 3D), you can use the key "O" to create a StateQuaternion,
+ *
+ *     \code
+ *     auto sq_ptr = FactoryStateBlock::get().create("O", Vector4d(1,0,0,0), false);
+ *     \endcode
+ *
+ * However if your problem has dimension 2 (e.g. is 2D), the key "O" will create a StateAngle,
+ *
+ *     \code
+ *     auto sa_ptr = FactoryStateBlock::get().create("O", Vector1d(angle_in_radians), false);
+ *     \endcode
+ *
+ * Note: It is an error to provide state vectors of the wrong size (4 for 3D orientation, 1 for 2D).
+ *
+ * To create StateBlocks to store 2D position and velocity, you type:
+ *
+ *     \code
+ *     auto sp2_ptr = FactoryStateBlock::get().create("StateBlock", Vector2d(1,2), false);
+ *     auto sv2_ptr = FactoryStateBlock::get().create("StateBlock", Vector2d(1,2), false);
+ *     \endcode
+ *
+ * To create StateBlocks to store 2D position and velocity, you can also use the key letters:
+ *
+ *     \code
+ *     auto sp2_ptr = FactoryStateBlock::get().create("P", Vector2d(1,2), false);
+ *     auto sv2_ptr = FactoryStateBlock::get().create("V", Vector2d(1,2), false);
+ *     \endcode
+ *
+ * To create StateBlocks to store 3D position and velocity, you type:
+ *
+ *     \code
+ *     auto sp3_ptr = FactoryStateBlock::get().create("P", Vector3d(1,2,3), false);
+ *     auto sv3_ptr = FactoryStateBlock::get().create("V", Vector3d(1,2,3), false);
+ *     \endcode
+ *
+ * Note: for base state blocks, the size is determined by the size of the provided vector parameter `VectorXd& _state`.
+ */
 typedef Factory<StateBlock, const Eigen::VectorXd&, bool> FactoryStateBlock;
 template<>
 inline std::string FactoryStateBlock::getClass() const
 {
     return "FactoryStateBlock";
 }
+
 template<>
 inline StateBlockPtr FactoryStateBlock::create(const std::string& _type, const Eigen::VectorXd& _state, bool _fixed)
 {