diff --git a/modules/mol/mm/doc/buildingblock.rst b/modules/mol/mm/doc/buildingblock.rst
new file mode 100644
index 0000000000000000000000000000000000000000..589b09801913e8ab464630a8a610518d64e94ade
--- /dev/null
+++ b/modules/mol/mm/doc/buildingblock.rst
@@ -0,0 +1,357 @@
+Blocks
+================================================================================
+
+.. currentmodule:: ost.mol
+
+The most basic type of a residue description is the BuildingBlock. It contains
+information of atom names and their corresponding types, charges and
+optionally also their masses. Interactions for all particles can also
+be defined even though they are optional, except the bonds giving
+information about the connectivity. 
+You often need to manipulate building blocks or
+the residues they refer to in an automated manner. That's where the 
+Blockmodifiers come in, with the GromacsBlockModifier as a specific
+implementation. As a special case there also exist HydrogenConstructors.
+
+
+.. class:: BuildingBlock
+
+  .. method:: Match(residue, match_connectivity)
+
+    Checks, wether the given residue matches the atom names in the 
+    BuildingBlock. The Connectivity gets optionally checked.
+
+    :param residue:    
+    :param match_connectivity: If set to true, the function checks the bonds
+                               in the residue with the defined bonds in the
+                               buildingblock 
+
+    :type residue:    :class:`ResidueHandle`
+    :type match_connectivity:    :class:`bool`
+
+
+  .. method:: Connect(residue, editor)
+
+    Connects residue based on the bond definitions of the BuildingBlock.
+
+    :param residue:     residue to be connected
+    :param editor:      editor associated to the residues entity
+
+    :type residue:      :class:`ResidueHandle`
+    :type editor:       :class:`XCSEditor`
+
+    :raises:            :class:`RuntimeError` when required atom can not be found in 
+                        residue
+
+
+  .. method:: AddAtom(name, type, charge, mass = None)
+
+    :param name:        name of atom
+    :param type:        its corresponding forcefield type
+    :param charge:      its charge
+    :param mass:        its mass
+
+
+  .. method:: RemoveAtom(name)
+
+    removes atom from building block with all its associated values and 
+    interactions
+
+    :param name:        name of atom to be removed
+
+
+  .. method:: ReplaceAtom(name, new_name, new_type, new_charge, new_mass = None)
+
+    Replace given atom with and resets type, charge and mass. All interactions
+    containing that atom get adapted as well
+
+    :param name:        name of atom to be replaced
+    :param new_name:    new name of atom
+    :param new_type:    new type of atom
+    :param new_charge:  new charge of atom
+    :param new_mass:    new mass of atom
+
+
+  .. method:: RemoveInteractionsToPrev()
+
+    Removes all interactions associated to an atom of a previous residues.
+    This gets indicated by an atom name prefixed by a *-*
+
+
+  .. method:: RemoveInteractionsToNext()
+
+    Removes all interactions associated to an atom of a next residues.
+    This gets indicated by an atom name prefixed by a *+*
+
+
+  .. method:: AddBond(bond, replace_existing = False)
+
+    :param bond:        Bond to be added
+    :param replace_existing: Whether potentially already existing bond for the
+                             same atoms should be replaced.
+
+    :type bond:         :class:`Interaction`
+    :type replace_exisiting: bool
+
+
+  .. method:: AddAngle(angle, replace_existing = False)
+
+    :param angle:        Angle to be added
+    :param replace_existing: Whether potentially already existing angle for the
+                             same atoms should be replaced.
+
+    :type angle:         :class:`Interaction`
+    :type replace_exisiting: bool
+
+
+  .. method:: AddDihedral(dihedral, replace_existing = False)
+
+    :param dihedral:    Dihedral to be added
+    :param replace_existing: Whether potentially already existing dihedral for the
+                             same atoms should be replaced.
+
+    :type dihedral:     :class:`Interaction`
+    :type replace_exisiting: bool
+
+
+  .. method:: AddImproper(improper, replace_existing = False)
+
+    :param improper:    Improper to be added
+    :param replace_existing: Whether potentially already existing improper for the
+                             same atoms should be replaced.
+
+    :type improper:     :class:`Interaction`
+    :type replace_exisiting: bool
+
+
+  .. method:: AddExclusion(exclusion, replace_existing = False)
+
+    :param exclusion:        Exclusion to be added
+    :param replace_existing: Whether potentially already existing Exclusion for the
+                             same atoms should be replaced.
+
+    :type exclusion:         :class:`Interaction`
+    :type replace_exisiting: bool
+
+
+  .. method:: AddCMap(cmap, replace_existing = False)
+
+    :param cmap:        CMap to be added
+    :param replace_existing: Whether potentially already existing cmap for the
+                             same atoms should be replaced.
+
+    :type cmap:         :class:`Interaction`
+    :type replace_exisiting: bool
+
+
+  .. method:: AddConstraint(constraint, replace_existing = False)
+
+    :param constraint:  Constraint to be added
+    :param replace_existing: Whether potentially already existing constraint for the
+                             same atoms should be replaced.
+
+    :type constraint:         :class:`Interaction`
+    :type replace_exisiting: bool 
+
+
+  .. method:: GetType(name)
+
+    Gets forcefield type from atom with given name
+
+    :param name:        Name from atom you want the type from
+
+    :type name:         :class:`str`
+
+    :raises: :exc: `RuntimeError` when atom can not be found in 
+                                  BuildingBlock    
+
+  .. method:: GetCharge(name)
+
+    Gets charge from atom with given name
+
+    :param name:        Name from atom you want the charge from
+
+    :type name:         :class:`str`
+
+    :raises: :class:`RuntimeError` when atom can not be found in 
+                                   BuildingBlock 
+
+
+  .. method:: GetMass(name)
+
+    Gets mass from atom with given name
+
+    :param name:        Name from atom you want the mass from
+
+    :type name:         :class:`str`
+
+    :raises: :class:`RuntimeError` when atom can not be found in 
+                                   BuildingBlock 
+
+
+  .. method:: GetBonds()
+    :returns: list of all bonds
+
+
+  .. method:: GetAngles()
+    :returns: list of all angles
+
+
+  .. method:: GetDihedrals()
+    :returns: list of all dihedrals
+
+
+  .. method:: GetImpropers()
+    :returns: list of all impropers
+
+
+  .. method:: GetCMaps()
+    :returns: list of all cmaps
+
+
+  .. method:: GetExclusions()
+    :returns: list of all exlusions
+
+
+  .. method:: GetConstraints()
+    :returns: list of all constraints
+
+Automated modification of :class:`BuildingBlock` and :class:`ResidueHandle`
+--------------------------------------------------------------------------------
+
+.. class:: GromacsBlockModifier
+
+  .. method:: ApplyOnBuildingBlock(block)
+
+    Applies all defined rules on the given :class:`BuildingBlock`
+
+    :param block:       :class:`BuildingBlock`
+
+  .. method:: ApplyOnResidue(residue)
+
+    Applies all defined rules on the given :class:`ResidueHandle`
+
+    :param residue:     :class:`ResidueHandle`
+
+  .. method:: AddReplaceRule(name, new_name, new_type, new_charge)
+
+    Rule, that basically renames and an atom and also resets its type and charge
+    in a :class:`BuildingBlock`. A simple renaming occurs in a :class:`ResidueHandle`.
+
+    :param name:        :class:`str` name of the atom to be changed
+    :param new_name:    :class:`str`
+    :param new_type:    :class:`str`
+    :param new_charge:  :class:`float`
+
+  .. method:: AddAddRule(number, method, atom_names, anchors, type, charge)
+
+    A rule to add new atoms the gromacs way, see
+    `Gromacs Manual <http://www.gromacs.org/Documentation/Manual>`_ 
+    for the exact definition of the parameters. A :class:`BuildingBlock`
+    gets modified by adding the new atom definitions and also the
+    corresponding bonds describing the connectivity. In case of 
+    :class:`ResidueHandle` the new Atoms with connectivity get added with 
+    their positions as defined by the gromacs adding rule. 
+
+    :param number:      :class:`int` number of atoms to be added
+    :param method:      :class:`int` gromacs adding rule
+    :param atom_names:  :class:`list` of strings containing the new atom names
+    :param anchors:     :class:`list` of strings containing atom names used as anchor
+    :param type:        :class:`str` the type the atoms will have
+    :param charge:      :class:`float` the charge the atoms will have
+
+  .. method:: AddDeleteAtom(name)
+
+    Defines an atom that has to be removed. In case of the 
+    :class:`BuildingBlock` this removes this particular atom plus all 
+    interactions connected to it, in case of :class:`ResidueHandle`, the
+    atom simply gets deleted.
+
+    :param name:        :class:`str` atom to be deleted
+
+  .. method:: AddBond(bond)
+
+    Adds a bond, this only has effect on :class:`BuildingBlock`, not
+    on :class:`ResidueHandle`
+
+    :param bond:        :class:`Interaction` bond to be added
+
+  .. method:: AddAngle(angle)
+
+    Adds an angle, this only has effect on :class:`BuildingBlock`, not
+    on :class:`ResidueHandle`
+
+    :param angle:        :class:`Interaction` angle to be added
+
+  .. method:: AddDihedral(dihedral)
+
+    Adds a dihedral, this only has effect on :class:`BuildingBlock`, not
+    on :class:`ResidueHandle`
+
+    :param dihedral:        :class:`Interaction` dihedral to be added
+
+  .. method:: AddImproper(improper)
+
+    Adds an improper, this only has effect on :class:`BuildingBlock`, not
+    on :class:`ResidueHandle`
+
+    :param improper:        :class:`Interaction` improper to be added
+
+  .. method:: AddCMap(cmap)
+
+    Adds a cmap, this only has effect on :class:`BuildingBlock`, not
+    on :class:`ResidueHandle`
+
+    :param cmap:        :class:`Interaction` cmap to be added
+
+
+.. class:: GromacsHydrogenConstructor
+
+  The :class:`GromacsHydrogenConstructor` is the gromacs way of adding
+  hydrogens to a structure.
+
+  .. method:: ApplyOnBuildingBlock(block)
+
+    Guess what it does: !!ABSOLUTELY NOTHING!! just there for consistency
+
+    :param block:       :class:`BuildingBlock` block that won't be changed at all!
+                                               Isn't that awesome?
+
+  .. method:: ApplyOnResidue(residue)
+
+    Constructs hydrogens based on the defined hydrogen adding rules
+
+    :param residue:     :class:`ResidueHandle` to be modified
+
+  .. method:: AddHydrogenRule(number, method, hydrogen_names, anchors)
+
+    Adds a hydrogen building rule as defined in 
+    `Gromacs Manual <http://www.gromacs.org/Documentation/Manual>`_ 
+    
+    :param number:      :class:`int` number of hydrogens to be added
+    :param method:      :class:`int` gromacs adding rule
+    :param hydrogen_names:  :class:`list` of strings containing the hydrogen names
+    :param anchors:     :class:`list` of strings containing atom names used as anchor
+
+
+.. class:: HeuristicHydrogenConstructor
+
+  As soon as we leave the well defined world of gromacs residue definitions,
+  we have to find new ways for constructing hydrogens. The 
+  :class:`HeuristicHydrogenConstructor` takes a :class:`BuildingBlock` at
+  initialization and builds heuristic rules to build hydrogens based on 
+  the connecticity defined in the given block.
+
+  .. method:: ApplyOnBuildingBlock(block)
+
+    Guess what it does: !!ABSOLUTELY NOTHING!! just there for consistency
+
+    :param block:       :class:`BuildingBlock` block that won't be changed at all!
+                                               Isn't that awesome?
+
+  .. method:: ApplyOnResidue(residue)
+
+    Constructs hydrogen based on heuristic rules
+
+    :param residue:     :class:`ResidueHandle` to be modified
+
diff --git a/modules/mol/mm/doc/forcefield.rst b/modules/mol/mm/doc/forcefield.rst
new file mode 100644
index 0000000000000000000000000000000000000000..13cc06b5a405976f25d2b62d8cab372bc7239573
--- /dev/null
+++ b/modules/mol/mm/doc/forcefield.rst
@@ -0,0 +1,565 @@
+Forcefields
+================================================================================
+
+.. currentmodule:: ost.mol
+
+The forcefields are a dump for interactions with their parameters, but also
+for atom specific information or residue definitions in form of a :class:`BuildingBlock`.
+They're also involved in the naming mess we're observing in the molecular mechanics
+community and contain definable renaming rules, that can be applied on an
+:class:`EntityHandle` for renaming from e.g. PDB standard to the forcefield
+specific standard. The standard forcefields in OpenStructure are loaded from
+the files provided by GROMACS and the "standard" naming is therefore the same.
+This has implications for controlling the protonation states for histidine.
+If you for example want to enforce a d-protonated histidine you have to name
+it HISD. Further reading can be found in the 
+`Gromacs Manual <http://www.gromacs.org/Documentation/Manual>`_ 
+
+Loading the standard forcefields provided by OpenStructure
+--------------------------------------------------------------------------------
+
+.. function:: LoadCHARMMForcefield()
+
+   Loads the CHARMM27 forcefield read from GROMACS
+   
+   :returns: The loaded :class:`Forcefield`
+
+
+.. function:: LoadAMBERForcefield()
+
+   Loads the AMBER03 forcefield read from GROMACS
+   
+   :returns: The loaded :class:`Forcefield`
+
+
+Reading forcefields
+--------------------------------------------------------------------------------
+The :class:`FFReader` object is rather experimental. It has nevertheless been 
+thoroughly tested for loading the CHARMM and AMBER forcefields in the
+gromacs format. The reader is capable of resolving the preprocessor statements
+as they are used in GROMACS.
+
+
+.. class:: FFReader
+
+  .. method:: ReadGromacsForcefield()
+
+    Searches and reads the forcefield.itp and atomtypes.atp files 
+    in the base_dir given at initialization. All atom specific informations
+    and bonded as well as nonbonded forces are read this way.
+
+  .. method:: ReadResidueDatabase(basename)
+
+    Searches and reads all files belonging the the residue database
+    defined by basename. With basename aminoacids this function
+    searches and reads all files in the base_dir matching aminoacids.x
+    where x is .rtp .arn .hdb .n.tdb .c.tdb .vsd .r2b
+    Only the rtp file is mandatory, all others are neglected if not present.
+
+    :param basename:    :class:`str` basename of residue database to be loaded
+
+  .. method:: ReadITP(basename)
+
+    Searches and reads the itp file in the base_dir. basename amazing_ion
+    would therefore load the file amazing_ion.itp
+
+    :param basename:    :class:`str` basename of itp file to be loaded
+
+  .. method:: SetForcefield(forcefield)
+
+    Resets reader internal forcefield. Everything read so far is lost.
+
+    :param forcefield:  :class:`Forcefield`
+
+  .. method:: GetForcefield()
+
+    Get the forcefield with everything read so far.
+
+    :returns: The reader internal :class:`Forcefield` 
+
+
+
+
+  .. code-block:: python
+    
+    path = "path_to_gromacs/share/top/charmm27.ff"
+    reader = FFReader(path)
+
+    #read in the data given in forcefield.itp and atomtypes.atp
+    reader.ReadGromacsForcefield()
+
+    #we also want to read several residue databases
+    reader.Read("aminoacids")
+    reader.Read("rna")
+    reader.Read("dna")
+
+    #ions and water are also nice to have, they're stored in itp files
+    reader.ReadITP("tip3p")
+    reader.ReadITP("ions")
+
+    #let's finally get the reader internal forcefield out
+    ff = reader.GetForcefield()
+
+    #there is also an amazing ion definition in some other directory
+    new_reader = FFReader("path/to/directory/with/itp/files")
+
+    #we want to modify the previously read forcefield
+    new_reader.SetForcefield(ff)
+
+    #and read the amazing ion definition from an itp file
+    #note, that any previously defined preprocessor statements
+    #from the previous reader are lost 
+    new_reader.ReadITP("amazing_ion")
+
+    #the new forcefield finally contains everything we need, lets
+    #extract it and save it down
+    ff = new_reader.GetForcefield()
+    ff.Save("charmm_forcefield.dat")
+
+
+.. class:: Forcefield
+
+
+  .. method:: Save(filename)
+
+    dumps forcefield into a binary file on disk
+
+    :param filename:    :class:`str` 
+
+
+
+  .. method:: Load(filename)
+
+    reads in binary forcefield file
+
+    :param filename:    :class:`str`
+
+    :returns:           loaded :class:`Forcefield`
+
+    :raises:            :class:`RuntimeError` when file can't be found
+
+
+
+  .. method:: AddBond(bond)
+
+    :param bond:        :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no bond specific FuncType
+
+
+
+  .. method:: AddAngle(angle)
+
+    :param angle:       :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no angle specific FuncType
+
+
+  .. method:: AddDihedral(dihedral)
+
+    :param dihedral:    :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no dihedral specific FuncType
+
+
+  .. method:: AddImproper(improper)
+
+    :param improper:    :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no improper specific FuncType
+
+
+  .. method:: AddCMap(cmap)
+
+    :param cmap:        :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no cmap specific FuncType
+
+
+  .. method:: AddImplicitGenborn(gb)
+
+    :param gb:          :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no gb specific FuncType
+
+
+  .. method:: AddLJ(lj)
+
+    :param lj:          :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no lj specific FuncType
+
+
+  .. method:: AddLJPair(lj_pair)
+
+    :param lj_pair:     :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no lj_pair specific FuncType
+
+
+  .. method:: AddConstraint(constraint)
+
+    :param constraint:  :class:`Interaction`
+
+    :raises:            :class:`RuntimeError` when given interaction has
+                                              no constraint specific FuncType
+
+
+  .. method:: AddMass(type, mass)
+
+    :param type:        :class:`str` type of atom
+    :param mass:        :class:`float` its mass
+
+
+  .. method:: SetFudgeLJ(factor)
+
+    :param factor:      :class:`float` factor with which the 1,4 lennard jones term
+                                       should be damped
+
+
+  .. method:: SetFudgeQQ(factor)
+
+    :param factor:      :class:`float` factor with which the 1,4 electrostatic term
+                                       should be damped
+
+
+  .. method:: SetGenPairs(gen_pairs)
+
+    :param gen_pairs:   :class:`bool` if set to false, all 1,4 interactions must be set
+                                      with AddLJPair. The Lorentz-Berthelot rule gets
+                                      used otherwise. 
+
+
+  .. method:: AddResidueRenamingRule(name, ff_main_name, ff_n_ter_name, 
+                                     ff_c_ter_name, ff_two_ter_name)
+
+    :param name:        :class:`str` original name or the residue 
+                                     (e.g. pdb/gromacs standard)
+
+    :param ff_main_name: :class:`str` forcefield specific residue name
+
+    :param ff_n_ter_name: :class:`str` forcefield specific name if the residue
+                                       is N-Terminal
+
+    :param ff_c_ter_name: :class:`str` forcefield specific name if the residue
+                                       is C-Terminal
+
+    :param ff_two_ter_name: :class:`str` forcefield specific name if the residue
+                                         is N- and C_Terminal
+
+
+
+  .. method:: AddAtomRenamingRule(res_name, old_atom_name, new_atom_name)
+
+    :param res_name:    :class:`str` forcefield specific residue name the
+                                     atom is belonging to
+
+    :param old_atom_name: :class:`str` atom name in pdb/gromacs standard
+
+    :param new_atom_name: :class:`str` ff specific atom name
+
+
+  .. method:: AddBuildingBlock(name, block)
+
+    :param name:        :class:`str` name of residue this :class:`BuildingBlock` 
+                                     is supposed to be related
+
+    :param block:       :class:`BuildingBlock`
+
+
+  .. method:: AddHydrogenConstructor(name, h_constructor)
+
+    :param name:        :class:`str` name of residue this 
+                                     :class:`HydrogenConstructor` 
+                                     is supposed to be related
+
+    :param h_constructor:       :class:`HydrogenConstructor`
+
+
+  .. method:: AddBlockModifier(name, modifier)
+
+    :param name:        :class:`str` name of residue this 
+                                     :class:`BlockModifier` 
+                                     is supposed to be related
+
+    :param modifier:       :class:`BlockModifier`
+
+
+  .. method:: SetStandardCTer(res_name, ter_name)
+
+    Setting a standard CTer incluences the behaviour of the GetCTerModifier 
+    function. If no specific block modifier is defined there, this is the
+    one that gets returned.
+
+    :param res_name:    :class:`str` ff specific residue name this block 
+                                     modifier is supposed to be related
+
+    :param ter_name:    :class:`str` name of the default c-terminal block 
+                                     modifier for this residue
+
+
+  .. method:: SetStandardNTer(res_name, ter_name)
+
+    Setting a standard NTer incluences the behaviour of the GetNTerModifier 
+    function. If no specific block modifier is defined there, this is the
+    one that gets returned.
+
+    :param res_name:    :class:`str` ff specific residue name this block 
+                                     modifier is supposed to be related
+
+    :param ter_name:    :class:`str` name of the default n-terminal block 
+                                     modifier for this residue
+
+
+  .. method:: AssignFFSpecificNames(ent, reverse = False)
+
+    This function does the forcefield specific renaming magic. It takes
+    the given :class:`EntityHandle` and applies the rules set in
+    AddResidueRenamingRule and AddAtomRenamingRule.
+
+    :param ent:         :class:`EntityHandle`
+
+    :param reverse:     :class:`bool` If False, the function does the renaming
+                                      from pdb/gromacs naming to the forcefield
+                                      specific naming.
+                                      If True, the opposite happens.
+
+
+  .. method:: GetBond(type1, type2)
+
+    :param type1:       :class:`str`
+
+    :param type2:       :class:`str`
+
+    :returns: an :class:`Interaction` with a bond FuncType
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given types can be found
+
+
+  .. method:: GetAngle(type1, type2, type3)
+
+    :param type1:       :class:`str`
+
+    :param type2:       :class:`str`
+
+    :param type3:       :class:`str`
+
+    :returns: an :class:`Interaction` with a angle FuncType
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given types can be found
+
+
+  .. method:: GetDihedrals(type1, type2, type3, type4)
+
+    Several dihedral definitions can be merged to one dihedral function.
+    This function therefore returns a list. 
+    In a first step all dihedrals matching the given types are gathered
+    and returned.
+    If No dihedrals could be found, the search continues by including
+    wildcard characters in the atom types (X). All found dihedrals
+    matching with all possible combinations of wildcards are then gathered
+    and returned.
+
+    :param type1:       :class:`str`
+
+    :param type2:       :class:`str`
+
+    :param type3:       :class:`str`
+
+    :param type4:       :class:`str`
+
+    :returns: a :class:`list` of :class:`Interaction` objects with dihedral 
+              FuncType matching given types
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given types can be found
+
+
+
+  .. method:: GetImpropers(type1, type2, type3, type4)
+
+    The same search strategy as in GetDihedrals is used to extract 
+    the impropers.
+
+    :param type1:       :class:`str`
+
+    :param type2:       :class:`str`
+
+    :param type3:       :class:`str`
+
+    :param type4:       :class:`str`
+
+    :returns: a :class:`list` of :class:`Interaction` objects with improper
+              FuncType matching given types
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given types can be found
+
+
+  .. method:: GetCMap(type1, type2, type3, type4, type5)
+
+    :param type1:       :class:`str`
+
+    :param type2:       :class:`str`
+
+    :param type3:       :class:`str`
+
+    :param type4:       :class:`str`
+
+    :param type5:       :class:`str`
+
+    :returns: an :class:`Interaction` with a cmap FuncType
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given types can be found
+
+
+  .. method:: GetImplicitGenborn(type)
+
+    :param type:       :class:`str`
+
+    :returns: an :class:`Interaction` with a gb FuncType
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given type can be found
+
+
+  .. method:: GetLJ(type)
+
+    :param type:       :class:`str`
+
+    :returns: an :class:`Interaction` with a lj FuncType
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given type can be found
+
+
+  .. method:: GetLJ(type1, type2, pair=False)
+
+    :param type1:        :class:`str`
+
+    :param type2:        :class:`str`
+
+    :param pair:         :class:`bool` If set to true, the interaction is
+                                       assumed to be a 1,4-interaction and
+                                       the set lj_pairs are first searched
+                                       for matches. In case of no success,
+                                       the function uses the Lorentz-Berthelot
+                                       rule to combine the sigma and epsilon 
+                                       parameters.
+                                       If set to false, the Lorentz-Berthelot
+                                       rule is applied directly.
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given types can be found
+                                              or when pair is true and no 
+                                              appropriate lj_pair is set.
+
+
+  .. method:: GetConstraint(type1, type2)
+
+    :param type1:       :class:`str`
+
+    :param type2:       :class:`str`
+
+    :returns: an :class:`Interaction` with a constraint FuncType
+
+    :raises:            :class:`RuntimeError` when no :class:`Interaction`
+                                              matching given types can be found
+
+
+  .. method:: GetMass(type)
+
+    :param type:        :class:`str`
+
+    :returns: the mass
+
+    :raises:            :class:`RuntimeError` no mass has been set for this 
+                        atom type has been set
+
+
+  .. method:: GetFudgeLJ()
+
+    :returns:  :class:`float` factor with which the 1,4 lennard jones term
+               should be damped
+
+  .. method:: GetFudgeQQ()
+
+    :returns:  :class:`float` factor with which the 1,4 lennard jones term
+               should be damped
+
+
+  .. method:: GetAtomType(res_name, atom_name)
+
+    :param res_name:    :class:`str` forcefield specific residue name
+
+    :param atom_name:  :class:`str` forcefield specific atom name belonging
+                                     to that residue
+
+    :returns:  atom type
+
+    :raises:            :class:`RuntimeError` if forcefield has no such
+                        :class:`BuildingBlock` or when atom is not present 
+                        in that :class:`BuildingBlock`   
+
+
+
+  .. method:: GetHydrogenConstructor(res_name)
+
+    :param res_name:    :class:`str`
+
+    :returns: :class:`HydrogenConstructor` for this name, invalid if it can't
+              be found
+
+
+  .. method:: GetBuildingBlock(res_name)
+
+    :param res_name:    :class:`str`
+
+    :returns:  :class:`BuildingBlock` for this name, invalid if it can't be 
+               found
+
+
+  .. method:: GetBlockModifier(res_name)
+
+    :param res_name:    :class:`str`
+
+    :returns: :class:`BlockModifier` for this name, invalid if it can't
+              be found
+
+
+  .. method:: GetNTerModifier(res_name, ter_name="")
+
+    :param res_name:    :class:`str`
+
+    :param ter_name:    :class:`str` if not set, the ter_name
+                        defined by SetStandardNTer gets used
+
+    :returns: :class:`BlockModifier` for this name, invalid if it can't
+              be found
+
+
+  .. method:: GetCTerModifier(name, ter_name="")
+
+    :param res_name:    :class:`str`
+
+    :param ter_name:    :class:`str` if not set, the ter_name
+                        defined by SetStandardCTer gets used
+
+    :returns: :class:`BlockModifier` for this name, invalid if it can't
+              be found
+
+
+
+
+    
diff --git a/modules/mol/mm/doc/interaction.rst b/modules/mol/mm/doc/interaction.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b2bd0439ff64f8a8d0112abcdb174f3adfc2c3b1
--- /dev/null
+++ b/modules/mol/mm/doc/interaction.rst
@@ -0,0 +1,174 @@
+Interactions
+================================================================================
+
+.. currentmodule:: ost.mol.mm
+
+The interaction object is intended to build a basic container tat can be used
+in various scenarios. At the initialization a FuncType has to be defined.
+Whenever names, types or parameters are set, the number of parameters
+gets checked according to the FuncType. A name or type can also consist of
+a wildcard expressed as X.
+
+
+The FuncType enum
+--------------------------------------------------------------------------------
+
+Every Interaction is linked to one particular *FuncType* describing the types 
+of interactions supported by OpenStructure. There are a 15 possible values with
+Invalid defining an unknown interaction:
+
+  HarmonicBond, HarmonicAngle, UreyBradleyAngle, PeriodicDihedral, 
+  PeriodicImproper, HarmonicImproper, CMap, LJ, LJPair, GBSA, 
+  DistanceConstraint, Exclusion, HarmonicPositionRestraint,
+  HarmonicPositionRestraint, Invalid
+
+The implementation guarantees, that the parameter related to atom types,
+names, parameters are checked regarding their dimension (e.g. 3 atoms for
+a harmonic angle) 
+
+--------------------------------------------------------------------------------
+
+
+.. class:: Interaction
+
+  ..method:: SetTypes(types)
+
+    Sets the forcefield specific atom types.
+
+    :param types:   A list of strings describing the force field specific atom
+                    types.
+
+    :type types:    :class:`list`
+
+    :raises: :exc:` RuntimeError` when size of input is not consistent with
+                                  the interactions functype
+
+
+  ..method:: SetNames(names)
+
+    Sets atom names.
+
+    :param types:   A list of strings describing the atom names.
+
+    :type names:    :class:`list`
+
+    :raises: :exc:` RuntimeError` when size of input is not consistent with
+                                  the interactions functype
+
+
+  ..method:: SetParam(names)
+
+    Sets interaction specific parameters.
+
+    :param types:  A list of real values .
+
+    :type names:   :class:`list`
+
+    :raises: :exc:`RuntimeError` when size of input is not consistent with
+                                  the interactions functype
+
+
+  ..method:: GetTypes()
+
+    Get Previously set types
+
+    :returns:      :class:`list`
+
+
+
+  ..method:: GetNames()
+
+    Get Previously set names
+
+    :returns:      :class:`list`
+
+
+  ..method:: GetParam()
+
+    Get Previously set parameters
+
+    :returns:      :wtf:`bool`
+
+
+  ..method:: GetAtoms(residue)
+
+    Returns an AtomHandleList containing the atoms in residue matching
+    the atom names
+
+    :param residue :class:`~mol.ResidueHandle`
+    :returns:      :class:`~mol.AtomHandleList`
+    :raises: :exc:`RuntimeError` when atom cannot be found in residue
+
+
+  ..method:: GetFuncType()
+
+    Returns the functype enum of the interaction
+
+    :returns:      :enum:`~mol.mm.FuncType`  
+
+
+  ..method:: ReplaceAtom(name, new_name, new_type)
+
+    Searches for given atom name. If found, this particular atom name
+    gets changed to new_name. If the atom types are set as well, the
+    associated atom type gets also reset to new_type.
+
+    :param name    :class:`string`
+    :param new_name:class:`string`
+    :param new_type:class:`string`
+    :returns:      :wtf:`bool` whether replacement was successful or not
+
+
+  ..method::MatchTypes(atom_types)
+
+    Checks, whether the given types match the internal types. The match
+    can be "as is" or in reversed order
+
+    :param atom_types    :class:`list`
+    :returns:     `:wtf:`bool`
+
+
+  ..method::MatchNames(atom_names)
+
+    Checks, whether the given names match the internal names. The match
+    can be "as is" or in reversed order
+
+    :param atom_names    :class:`list`
+    :returns:     `:wtf:`bool`
+
+
+  ..method::HasName(name)
+
+    Checks, whether the given name is present in the internal names
+
+    :param name    :class:`string`
+    :returns:      :wtf:`bool`
+
+
+  ..method::HasType(type)
+
+    Checks, whether the given type is present in the internal types
+
+    :param type    :class:`string`
+    :returns:      :wtf:`bool`
+
+
+  ..IsParametrized()
+
+    Checks, whether the parameters have been set
+
+    :returns:      :wtf:`bool`
+
+
+  ..HasTypeWildcard()
+
+    Checks, whether one of the types is a wildcard (X)
+
+    :returns:      :wtf:`bool`
+
+
+  ..HasNameWildcard()
+
+    Checks, whether one of the names is a wildcard (X)
+
+    :returns:      :wtf:`bool`