codecov[bot]: # [Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=h1) Report
> Merging [#842](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=desc) into [master](https://codecov.io/gh/PlasmaPy/PlasmaPy/commit/256413aa816375eaf259b89bf5c62853c35ff672&el=desc) will **decrease** coverage by `0.00%`.
> The diff coverage is `80.95%`.

[![Impacted file tree graph](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/graphs/tree.svg?width=650&height=150&src=pr&token=LzZ5mnXVad)](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #842      +/-   ##
==========================================
- Coverage   95.88%   95.88%   -0.01%     
==========================================
  Files          56       56              
  Lines        5127     5123       -4     
==========================================
- Hits         4916     4912       -4     
  Misses        211      211              
```


| [Impacted Files](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [plasmapy/plasma/exceptions.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL2V4Y2VwdGlvbnMucHk=) | `100.00% <ø> (ø)` | |
| [plasmapy/plasma/plasma\_base.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3BsYXNtYV9iYXNlLnB5) | `72.22% <ø> (ø)` | |
| [plasmapy/\_\_init\_\_.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvX19pbml0X18ucHk=) | `32.14% <33.33%> (-2.34%)` | :arrow_down: |
| [plasmapy/plasma/\_\_init\_\_.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL19faW5pdF9fLnB5) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/plasma\_factory.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3BsYXNtYV9mYWN0b3J5LnB5) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/\_\_init\_\_.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvX19pbml0X18ucHk=) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/openpmd\_hdf5.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvb3BlbnBtZF9oZGY1LnB5) | `79.56% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/plasma3d.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvcGxhc21hM2QucHk=) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/plasmablob.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvcGxhc21hYmxvYi5weQ==) | `100.00% <100.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=footer). Last update [256413a...17d1c5f](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

StanczakDominik: I think coveragepy just gave up on the rename, thus the coverage failure.
StanczakDominik: I forgot to skip `black` checks, darn...
StanczakDominik: The changes from master I've just merged in should address most of the formatting issues, and the stability matrix :)
StanczakDominik: Thanks for the reviews @namurphy @rocco8773 !
diff --git a/changelog/842.breaking.rst b/changelog/842.breaking.rst
new file mode 100644
index 00000000..393be14e
--- /dev/null
+++ b/changelog/842.breaking.rst
@@ -0,0 +1,1 @@
+Renamed the `plasmapy.classes` subpackage to `plasmapy.plasma`.
diff --git a/docs/about/stability.rst b/docs/about/stability.rst
index 169f024c..6c810306 100644
--- a/docs/about/stability.rst
+++ b/docs/about/stability.rst
@@ -103,7 +103,7 @@ PlasmaPy's planned and existing subpackages are:
         </tr>
         <tr>
             <td>
-                plasmapy.classes
+                plasmapy.plasma
             </td>
             <td align='center'>
                 <span class="dev"></span>
diff --git a/docs/notebooks/magnetic_statics.ipynb b/docs/notebooks/magnetic_statics.ipynb
index 43b04020..0e863454 100644
--- a/docs/notebooks/magnetic_statics.ipynb
+++ b/docs/notebooks/magnetic_statics.ipynb
@@ -37,7 +37,7 @@
    "outputs": [],
    "source": [
     "from plasmapy.formulary import magnetostatics\n",
-    "from plasmapy.classes.sources import Plasma3D\n",
+    "from plasmapy.plasma.sources import Plasma3D\n",
     "import numpy as np\n",
     "import astropy.units as u\n",
     "import matplotlib.pyplot as plt"
diff --git a/docs/notebooks/particle_stepper.ipynb b/docs/notebooks/particle_stepper.ipynb
index 7b07bdc9..3a8bd0d5 100644
--- a/docs/notebooks/particle_stepper.ipynb
+++ b/docs/notebooks/particle_stepper.ipynb
@@ -39,7 +39,7 @@
    "source": [
     "import numpy as np\n",
     "from astropy import units as u\n",
-    "from plasmapy.classes import Plasma\n",
+    "from plasmapy.plasma import Plasma\n",
     "from plasmapy.simulation import ParticleTracker\n",
     "from plasmapy.formulary import gyrofrequency"
    ]
diff --git a/docs/plasma/index.rst b/docs/plasma/index.rst
index bacde152..7f2b00b5 100644
--- a/docs/plasma/index.rst
+++ b/docs/plasma/index.rst
@@ -1,21 +1,21 @@
-.. _classes:
+.. _plasma:
 
 ===============
 PlasmaPy Plasma
 ===============
 
-.. module:: plasmapy.classes
-.. currentmodule:: plasmapy.classes
+.. module:: plasmapy.plasma
+.. currentmodule:: plasmapy.plasma
 
 Overview
 --------
-One of the core classes in PlasmaPy is `~plasmapy.classes.Plasma`. In order
+One of the core classes in PlasmaPy is `~plasmapy.plasma.Plasma`. In order
 to make it easy to work with different plasma data in PlasmaPy, the
-`~plasmapy.classes.Plasma` object provides a number of methods for
+`~plasmapy.plasma.Plasma` object provides a number of methods for
 commonly existing plasmas in nature.
 
 All Plasma objects are created using the Plasma factory
-`~plasmapy.classes.Plasma`.
+`~plasmapy.plasma.Plasma`.
 
 A number of plasma data structures are supported by subclassing this
 base object. See :ref:`plasma-sources` to see a list of all of them.
@@ -23,43 +23,43 @@ base object. See :ref:`plasma-sources` to see a list of all of them.
 Creating Plasma Objects
 -----------------------
 Plasma objects are constructed using the special factory class
-`~plasmapy.classes.Plasma`: ::
-
-    >>> x = plasmapy.classes.Plasma(T_e=T_e,
-    ...                             n_e=n_e,
-    ...                             Z=Z,
-    ...                             particle=particle)  # doctest: +SKIP
-
-The result of a call to `~plasmapy.classes.Plasma` will be either a
-`~plasmapy.classes.GenericPlasma` object, or a subclass of
-`~plasmapy.classes.GenericPlasma` which deals with a specific type of
-data, e.g. `~plasmapy.classes.sources.PlasmaBlob` or
-`~plasmapy.classes.sources.Plasma3D` (see :ref:`plasma-sources` to see
+`~plasmapy.plasma.Plasma`: ::
+
+    >>> x = plasmapy.plasma.Plasma(T_e=T_e,
+    ...                            n_e=n_e,
+    ...                            Z=Z,
+    ...                            particle=particle)  # doctest: +SKIP
+
+The result of a call to `~plasmapy.plasma.Plasma` will be either a
+`~plasmapy.plasma.GenericPlasma` object, or a subclass of
+`~plasmapy.plasma.GenericPlasma` which deals with a specific type of
+data, e.g. `~plasmapy.plasma.sources.PlasmaBlob` or
+`~plasmapy.plasma.sources.Plasma3D` (see :ref:`plasma-sources` to see
 a list of all of them).
 
-.. autoclass:: plasmapy.classes.plasma_factory.PlasmaFactory
+.. autoclass:: plasmapy.plasma.plasma_factory.PlasmaFactory
 
 Using Plasma Objects
 --------------------
 
-Once a Plasma object has been created using `~plasmapy.classes.Plasma`
+Once a Plasma object has been created using `~plasmapy.plasma.Plasma`
 it will be a instance or a subclass of the
-`~plasmapy.classes.GenericPlasma` class. The documentation of
-`~plasmapy.classes.GenericPlasma` lists the attributes and methods that
+`~plasmapy.plasma.GenericPlasma` class. The documentation of
+`~plasmapy.plasma.GenericPlasma` lists the attributes and methods that
 are available on all Plasma objects.
 
-.. _plasma-classes:
+.. _plasma-plasma:
 
 Plasma Classes
 --------------
-Defined in `plasmapy.classes.sources` are a set of
-`~plasmapy.classes.GenericPlasma` subclassesmwhich convert the keyword
-arguments data to the standard `~plasmapy.classes.GenericPlasma`
+Defined in `plasmapy.plasma.sources` are a set of
+`~plasmapy.plasma.GenericPlasma` subclasses which convert the keyword
+arguments data to the standard `~plasmapy.plasma.GenericPlasma`
 interface. These subclasses also provide a method, which describes to
-the `Plasma <plasmapy.classes.plasma_factory.PlasmaFactory>` factory
+the `Plasma <plasmapy.plasma.plasma_factory.PlasmaFactory>` factory
 which the data match its plasma data structure.
 
-.. automodapi:: plasmapy.classes
+.. automodapi:: plasmapy.plasma
     :no-main-docstr:
     :no-heading:
 
@@ -68,30 +68,48 @@ which the data match its plasma data structure.
 Plasma Subclasses
 -----------------
 
-.. toctree::
-    sources
+The :class:`Plasma3D` class is a basic structure to contain spatial
+information about a plasma.  To initialize a Plasma3D system, first
+create an instance of the :class:`Plasma3D` class and then set the
+:attr:`Plasma3D.density`, :attr:`Plasma3D.momentum`,
+:attr:`Plasma3D.pressure` and the :attr:`Plasma3D.magnetic_field`.
+
+This feature is currently under development.
+
+The :class:`PlasmaBlob` class is a basic structure to contain just
+plasma parameter information about a plasma with no associated
+spatial or temporal scales.  To initialize a PlasmaBlob system, call
+it with arguments: electron temperature :attr:`PlasmaBlob.T_e`,
+and electron density :attr:`PlasmaBlob.n_e`. You may also optionally
+define the ionization, :attr:`PlasmaBlob.Z`, and relevant plasma
+particle, :attr:`PlasmaBlob.particle`.
+
+This feature is currently under development.
+
+.. automodapi:: plasmapy.plasma.sources
+   :no-heading:
 
 Writing a new Plasma subclass
 --------------------------------
 
-Any subclass of `~plasmapy.classes.GenericPlasma` which defines a method
-named `~plasmapy.classes.GenericPlasma.is_datasource_for` will
+Any subclass of `~plasmapy.plasma.GenericPlasma` which defines a method
+named `~plasmapy.plasma.GenericPlasma.is_datasource_for` will
 automatically be registered with the
-`Plasma <plasmapy.classes.plasma_factory.PlasmaFactory>` factory. The
+`Plasma <plasmapy.plasma.plasma_factory.PlasmaFactory>` factory. The
 ``is_datasource_for`` method describes the form of the data for which
-the `~plasmapy.classes.GenericPlasma` subclass is valid. For example,
+the `~plasmapy.plasma.GenericPlasma` subclass is valid. For example,
 it might check the number and types of keyword arguments. This makes it
-straightforward to define your own `~plasmapy.classes.GenericPlasma`
+straightforward to define your own `~plasmapy.plasma.GenericPlasma`
 subclass for a new data structure or a custom data source like simulated
 data. These classes only have to be imported for this to work, as
 demonstrated by the following example.
 
 .. code-block:: python
 
-    import plasmapy.classes
+    import plasmapy.plasma
     import astropy.units as u
 
-    class FuturePlasma(plasmapy.classes.GenericPlasma):
+    class FuturePlasma(plasmapy.plasma.GenericPlasma):
         def __init__(self, **kwargs):
 
             super(FuturePlasma, self).__init__(**kwargs)
@@ -114,7 +132,7 @@ demonstrated by the following example.
 
 
 This class will now be available through the
-`Plasma <plasmapy.classes.plasma_factory.PlasmaFactory>` factory as long
+`Plasma <plasmapy.plasma.plasma_factory.PlasmaFactory>` factory as long
 as this class has been defined, i.e. imported into the current session.
 
 If you do not want to create a method named ``is_datasource_for`` you
@@ -123,6 +141,6 @@ method.
 
 .. code-block:: python
 
-    import plasmapy.classes
+    import plasmapy.plasma
 
-    plasmapy.classes.Plasma.register(FuturePlasma, FuturePlasma.some_matching_method)
+    plasmapy.plasma.Plasma.register(FuturePlasma, FuturePlasma.some_matching_method)
diff --git a/docs/plasma/sources.rst b/docs/plasma/sources.rst
deleted file mode 100644
index 1630ac53..00000000
--- a/docs/plasma/sources.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-.. _plasma:
-
-**********************************************
-Plasma Subclasses (`plasmapy.classes.sources`)
-**********************************************
-
-Introduction
-============
-
-The :class:`Plasma3D` class is a basic structure to contain spatial
-information about a plasma.  To initialize a Plasma3D system, first
-create an instance of the :class:`Plasma3D` class and then set the
-:attr:`Plasma3D.density`, :attr:`Plasma3D.momentum`,
-:attr:`Plasma3D.pressure` and the :attr:`Plasma3D.magnetic_field`.
-
-This feature is currently under development.
-
-The :class:`PlasmaBlob` class is a basic structure to contain just
-plasma parameter information about a plasma with no associated
-spatial or temporal scales.  To initialize a PlasmaBlob system, call
-it with arguments: electron temperature :attr:`PlasmaBlob.T_e`,
-and electron density :attr:`PlasmaBlob.n_e`. You may also optionally
-define the ionization, :attr:`PlasmaBlob.Z`, and relevant plasma
-particle, :attr:`PlasmaBlob.particle`.
-
-This feature is currently under development.
-
-Reference/API
-=============
-
-.. automodapi:: plasmapy.classes.sources
-   :no-heading:
diff --git a/plasmapy/__init__.py b/plasmapy/__init__.py
index 842a50f4..1224328f 100644
--- a/plasmapy/__init__.py
+++ b/plasmapy/__init__.py
@@ -18,7 +18,7 @@
 ::
 
  particles                         --- Database for atoms, isotopes, ions...
- classes                           --- (WIP) classes used in multiple places
+ plasma                            --- (WIP) `Plasma` class
  data                              --- Data used for testing and examples
  diagnostics                       --- Experimental research data analysis
  formulary                         --- Plasma theory analysis formulae
diff --git a/plasmapy/classes/__init__.py b/plasmapy/plasma/__init__.py
similarity index 100%
rename from plasmapy/classes/__init__.py
rename to plasmapy/plasma/__init__.py
diff --git a/plasmapy/classes/exceptions.py b/plasmapy/plasma/exceptions.py
similarity index 100%
rename from plasmapy/classes/exceptions.py
rename to plasmapy/plasma/exceptions.py
diff --git a/plasmapy/classes/plasma_base.py b/plasmapy/plasma/plasma_base.py
similarity index 93%
rename from plasmapy/classes/plasma_base.py
rename to plasmapy/plasma/plasma_base.py
index 44fb26c7..06113679 100644
--- a/plasmapy/classes/plasma_base.py
+++ b/plasmapy/plasma/plasma_base.py
@@ -5,7 +5,7 @@
 
 class BasePlasma(ABC):
     """
-    Registration class for `~plasmapy.classes.GenericPlasma` and declares
+    Registration class for `~plasmapy.plasma.GenericPlasma` and declares
     some abstract methods for data common in different kinds of plasmas.
 
     This class checks for the existance of a method named ``is_datasource_for``
@@ -55,7 +55,7 @@ def average_ionization(self):
 class GenericPlasma(BasePlasma):
     """
     A Generic Plasma class. This class contains definitions for abstract
-    methods declared in the `~plasmapy.classes.plasma_base.BaseClass`.
+    methods declared in the `~plasmapy.plasma.plasma_base.BaseClass`.
     """
 
     def __init__(self, **kwargs):
diff --git a/plasmapy/classes/plasma_factory.py b/plasmapy/plasma/plasma_factory.py
similarity index 91%
rename from plasmapy/classes/plasma_factory.py
rename to plasmapy/plasma/plasma_factory.py
index fcdf7b4b..05b3b00c 100644
--- a/plasmapy/classes/plasma_factory.py
+++ b/plasmapy/plasma/plasma_factory.py
@@ -1,4 +1,4 @@
-from plasmapy.classes.plasma_base import GenericPlasma
+from plasmapy.plasma.plasma_base import GenericPlasma
 from plasmapy.utils.datatype_factory_base import (
     BasicRegistrationFactory,
     MultipleMatchError,
diff --git a/plasmapy/classes/sources/__init__.py b/plasmapy/plasma/sources/__init__.py
similarity index 100%
rename from plasmapy/classes/sources/__init__.py
rename to plasmapy/plasma/sources/__init__.py
diff --git a/plasmapy/classes/sources/openpmd_hdf5.py b/plasmapy/plasma/sources/openpmd_hdf5.py
similarity index 97%
rename from plasmapy/classes/sources/openpmd_hdf5.py
rename to plasmapy/plasma/sources/openpmd_hdf5.py
index 0bc28fd2..34262398 100644
--- a/plasmapy/classes/sources/openpmd_hdf5.py
+++ b/plasmapy/plasma/sources/openpmd_hdf5.py
@@ -4,8 +4,8 @@
 import astropy.units as u
 import numpy as np
 
-from plasmapy.classes.exceptions import DataStandardError
-from plasmapy.classes.plasma_base import GenericPlasma
+from plasmapy.plasma.exceptions import DataStandardError
+from plasmapy.plasma.plasma_base import GenericPlasma
 
 _OUTDATED_VERSION = "1.1.0"
 _NEWER_VERSION = "2.0.0"
diff --git a/plasmapy/classes/sources/plasma3d.py b/plasmapy/plasma/sources/plasma3d.py
similarity index 98%
rename from plasmapy/classes/sources/plasma3d.py
rename to plasmapy/plasma/sources/plasma3d.py
index 2e67f77f..3c15ea39 100644
--- a/plasmapy/classes/sources/plasma3d.py
+++ b/plasmapy/plasma/sources/plasma3d.py
@@ -7,9 +7,8 @@
 import astropy.units as u
 import numpy as np
 from astropy.constants import mu0
-
-from plasmapy.classes.plasma_base import GenericPlasma
 from plasmapy.formulary.magnetostatics import MagnetoStatics
+from plasmapy.plasma.plasma_base import GenericPlasma
 
 __all__ = ["Plasma3D"]
 
diff --git a/plasmapy/classes/sources/plasmablob.py b/plasmapy/plasma/sources/plasmablob.py
similarity index 98%
rename from plasmapy/classes/sources/plasmablob.py
rename to plasmapy/plasma/sources/plasmablob.py
index 8160ab2a..d4df9a52 100644
--- a/plasmapy/classes/sources/plasmablob.py
+++ b/plasmapy/plasma/sources/plasmablob.py
@@ -4,12 +4,11 @@
 import warnings
 
 import astropy.units as u
-
-from plasmapy.classes.plasma_base import GenericPlasma
 from plasmapy.formulary.collisions import coupling_parameter
 from plasmapy.formulary.dimensionless import quantum_theta
 from plasmapy.formulary.parameters import _grab_charge
 from plasmapy.particles import particle_mass
+from plasmapy.plasma.plasma_base import GenericPlasma
 from plasmapy.utils import CouplingWarning, call_string
 
 __all__ = ["PlasmaBlob"]

Rename plasmapy.classes to plasmapy.plasma [PLEP7]
As part of the changes associated with the forthcoming PLEP 7 (PlasmaPy/PlasmaPy-PLEPs#26), we decided to rename ``plasmapy.classes`` to ``plasmapy.plasma``.  This is in an attempt to make the top-level namespace more structured and explicit.

This issue will breaking existing API.
diff --git a/plasmapy/classes/sources/tests/__init__.py b/plasmapy/plasma/sources/tests/__init__.py
similarity index 100%
rename from plasmapy/classes/sources/tests/__init__.py
rename to plasmapy/plasma/sources/tests/__init__.py
diff --git a/plasmapy/classes/sources/tests/test_openpmd_hdf5.py b/plasmapy/plasma/sources/tests/test_openpmd_hdf5.py
similarity index 94%
rename from plasmapy/classes/sources/tests/test_openpmd_hdf5.py
rename to plasmapy/plasma/sources/tests/test_openpmd_hdf5.py
index ca645763..7f28ae1a 100644
--- a/plasmapy/classes/sources/tests/test_openpmd_hdf5.py
+++ b/plasmapy/plasma/sources/tests/test_openpmd_hdf5.py
@@ -1,13 +1,13 @@
+from astropy import units as u
+from typing import Union, Tuple, List
 import os
 from typing import List, Tuple, Union
-
 import pytest
-from astropy import units as u
 
-import plasmapy.classes
-from plasmapy.classes.exceptions import DataStandardError
-from plasmapy.classes.sources import openpmd_hdf5
+from plasmapy.plasma.sources import openpmd_hdf5
+from plasmapy.plasma.exceptions import DataStandardError
 from plasmapy.particles.data.test import data_dir
+import plasmapy.plasma
 
 
 @pytest.fixture(scope="module")
@@ -147,5 +147,5 @@ def test_non_openpmd_hdf5():
 
 
 def test_HDF5Reader(h5_2d):
-    assert isinstance(h5_2d, plasmapy.classes.sources.HDF5Reader)
-    assert isinstance(h5_2d, plasmapy.classes.BasePlasma)
+    assert isinstance(h5_2d, plasmapy.plasma.sources.HDF5Reader)
+    assert isinstance(h5_2d, plasmapy.plasma.BasePlasma)
diff --git a/plasmapy/classes/sources/tests/test_plasma3d.py b/plasmapy/plasma/sources/tests/test_plasma3d.py
similarity index 98%
rename from plasmapy/classes/sources/tests/test_plasma3d.py
rename to plasmapy/plasma/sources/tests/test_plasma3d.py
index bc020c8c..fe55d885 100644
--- a/plasmapy/classes/sources/tests/test_plasma3d.py
+++ b/plasmapy/plasma/sources/tests/test_plasma3d.py
@@ -2,8 +2,8 @@
 import numpy as np
 import pytest
 
-from plasmapy.classes.sources import plasma3d
 from plasmapy.particles.exceptions import InvalidParticleError
+from plasmapy.plasma.sources import plasma3d
 
 
 @pytest.mark.parametrize(
diff --git a/plasmapy/classes/sources/tests/test_plasmablob.py b/plasmapy/plasma/sources/tests/test_plasmablob.py
similarity index 99%
rename from plasmapy/classes/sources/tests/test_plasmablob.py
rename to plasmapy/plasma/sources/tests/test_plasmablob.py
index 85053d0d..03e98d1a 100644
--- a/plasmapy/classes/sources/tests/test_plasmablob.py
+++ b/plasmapy/plasma/sources/tests/test_plasmablob.py
@@ -2,9 +2,9 @@
 import numpy as np
 import pytest
 
-from plasmapy.classes.sources import plasma3d, plasmablob
 from plasmapy.formulary import magnetostatics
 from plasmapy.particles.exceptions import InvalidParticleError
+from plasmapy.plasma.sources import plasma3d, plasmablob
 from plasmapy.utils.exceptions import CouplingWarning
 
 
diff --git a/plasmapy/classes/tests/__init__.py b/plasmapy/plasma/tests/__init__.py
similarity index 100%
rename from plasmapy/classes/tests/__init__.py
rename to plasmapy/plasma/tests/__init__.py
diff --git a/plasmapy/classes/tests/test_plasma_base.py b/plasmapy/plasma/tests/test_plasma_base.py
similarity index 96%
rename from plasmapy/classes/tests/test_plasma_base.py
rename to plasmapy/plasma/tests/test_plasma_base.py
index a45a50de..d05afe4a 100644
--- a/plasmapy/classes/tests/test_plasma_base.py
+++ b/plasmapy/plasma/tests/test_plasma_base.py
@@ -1,4 +1,4 @@
-from plasmapy.classes import BasePlasma, GenericPlasma
+from plasmapy.plasma import BasePlasma, GenericPlasma
 
 # Get rid of any previously registered classes.
 BasePlasma._registry = {}
diff --git a/plasmapy/classes/tests/test_plasma_factory.py b/plasmapy/plasma/tests/test_plasma_factory.py
similarity index 51%
rename from plasmapy/classes/tests/test_plasma_factory.py
rename to plasmapy/plasma/tests/test_plasma_factory.py
index f8564ced..02a4ad25 100644
--- a/plasmapy/classes/tests/test_plasma_factory.py
+++ b/plasmapy/plasma/tests/test_plasma_factory.py
@@ -2,15 +2,14 @@
 
 import astropy.units as u
 import numpy as np
+import plasmapy.plasma
 import pytest
-
-import plasmapy.classes
 from plasmapy.particles.data.test import data_dir
 
 
 @pytest.fixture(scope="module")
 def h5(request):
-    h5 = plasmapy.classes.Plasma(hdf5=os.path.join(data_dir, "data00000255.h5"))
+    h5 = plasmapy.plasma.Plasma(hdf5=os.path.join(data_dir, "data00000255.h5"))
     yield h5
     h5.close()
 
@@ -18,18 +17,18 @@ def h5(request):
 class TestPlasma(object):
     def test_patters(self):
         # Input data whose specific subclass cannot be known
-        generic = plasmapy.classes.Plasma(blablobleh="spam")
-        assert isinstance(generic, plasmapy.classes.GenericPlasma)
+        generic = plasmapy.plasma.Plasma(blablobleh="spam")
+        assert isinstance(generic, plasmapy.plasma.GenericPlasma)
 
     def test_Plasma3D(self):
         # Input data for Plasma3D
-        three_dimensional = plasmapy.classes.Plasma(
+        three_dimensional = plasmapy.plasma.Plasma(
             domain_x=np.linspace(0, 1, 3) * u.m,
             domain_y=np.linspace(0, 1, 3) * u.m,
             domain_z=np.linspace(0, 1, 3) * u.m,
         )
-        assert isinstance(three_dimensional, plasmapy.classes.sources.Plasma3D)
-        assert isinstance(three_dimensional, plasmapy.classes.BasePlasma)
+        assert isinstance(three_dimensional, plasmapy.plasma.sources.Plasma3D)
+        assert isinstance(three_dimensional, plasmapy.plasma.BasePlasma)
 
     def test_PlasmaBlob(self):
         # Input data for PlasmaBlob
@@ -37,6 +36,6 @@ def test_PlasmaBlob(self):
         n_e = 1e26 * u.cm ** -3
         Z = 2.0
         particle = "p"
-        blob = plasmapy.classes.Plasma(T_e=T_e, n_e=n_e, Z=Z, particle=particle)
-        assert isinstance(blob, plasmapy.classes.sources.PlasmaBlob)
-        assert isinstance(blob, plasmapy.classes.BasePlasma)
+        blob = plasmapy.plasma.Plasma(T_e=T_e, n_e=n_e, Z=Z, particle=particle)
+        assert isinstance(blob, plasmapy.plasma.sources.PlasmaBlob)
+        assert isinstance(blob, plasmapy.plasma.BasePlasma)
diff --git a/plasmapy/simulation/tests/test_particletracker.py b/plasmapy/simulation/tests/test_particletracker.py
index 05b0ba55..f80c6359 100644
--- a/plasmapy/simulation/tests/test_particletracker.py
+++ b/plasmapy/simulation/tests/test_particletracker.py
@@ -1,10 +1,11 @@
+import astropy.units as u
 import numpy as np
 import pytest
 from astropy import units as u
-from astropy.modeling import fitting, models
+from astropy.modeling import models, fitting
 from scipy.optimize import curve_fit
 
-from plasmapy.classes.sources import Plasma3D
+from plasmapy.plasma.sources import Plasma3D
 from plasmapy.simulation.particletracker import ParticleTracker
 
 

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
3.9
requirements/automated-documentation-tests.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.16
asteval==1.0.6
astropy==6.0.1
astropy-iers-data==0.2025.3.31.0.36.18
asttokens==3.0.0
attrs==25.3.0
babel==2.17.0
beautifulsoup4==4.13.3
bleach==6.2.0
certifi==2025.1.31
charset-normalizer==3.4.1
click==8.1.8
colorama==0.4.6
comm==0.2.2
contourpy==1.3.0
cycler==0.12.1
debugpy==1.8.13
decorator==5.2.1
defusedxml==0.7.1
dill==0.3.9
docutils==0.18.1
exceptiongroup==1.2.2
executing==2.2.0
fastjsonschema==2.21.1
fonttools==4.56.0
h5py==3.13.0
idna==3.10
imagesize==1.4.1
importlib_metadata==8.6.1
importlib_resources==6.5.2
iniconfig==2.1.0
ipykernel==6.29.5
ipython==8.18.1
ipywidgets==8.1.5
jedi==0.19.2
Jinja2==3.0.3
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyter_client==8.6.3
jupyter_core==5.7.2
jupyterlab_pygments==0.3.0
jupyterlab_widgets==3.0.13
kiwisolver==1.4.7
lmfit==1.3.3
MarkupSafe==3.0.2
matplotlib==3.9.4
matplotlib-inline==0.1.7
mistune==3.1.3
mpmath==1.3.0
nbclient==0.10.2
nbconvert==7.16.6
nbformat==5.10.4
nbsphinx==0.9.7
nest-asyncio==1.6.0
numpy==1.26.4
numpydoc==1.2.1
packaging==24.2
pandocfilters==1.5.1
parso==0.8.4
pexpect==4.9.0
pillow==11.1.0
-e git+https://github.com/PlasmaPy/PlasmaPy.git@35957735d9234199081e25eacba018e93b500aee#egg=plasmapy
platformdirs==4.3.7
pluggy==1.5.0
prompt_toolkit==3.0.50
psutil==7.0.0
ptyprocess==0.7.0
pure_eval==0.2.3
pyerfa==2.0.1.5
Pygments==2.19.1
pyparsing==3.2.3
pytest==8.3.5
python-dateutil==2.9.0.post0
PyYAML==6.0.2
pyzmq==26.3.0
referencing==0.36.2
requests==2.32.3
rpds-py==0.24.0
scipy==1.13.1
setuptools-scm==8.2.0
six==1.17.0
snowballstemmer==2.2.0
soupsieve==2.6
Sphinx==2.4.4
sphinx-automodapi==0.15.0
sphinx-copybutton==0.5.2
sphinx-gallery==0.11.0
sphinx-rtd-theme==1.3.0
sphinxcontrib-applehelp==2.0.0
sphinxcontrib-devhelp==2.0.0
sphinxcontrib-htmlhelp==2.1.0
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==2.0.0
sphinxcontrib-serializinghtml==2.0.0
stack-data==0.6.3
tinycss2==1.4.0
tomli==2.2.1
tornado==6.4.2
towncrier==24.8.0
traitlets==5.14.3
typing_extensions==4.13.0
uncertainties==3.2.2
urllib3==2.3.0
wcwidth==0.2.13
webencodings==0.5.1
widgetsnbextension==4.0.13
zipp==3.21.0

name: PlasmaPy
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.16
      - asteval==1.0.6
      - astropy==6.0.1
      - astropy-iers-data==0.2025.3.31.0.36.18
      - asttokens==3.0.0
      - attrs==25.3.0
      - babel==2.17.0
      - beautifulsoup4==4.13.3
      - bleach==6.2.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - click==8.1.8
      - colorama==0.4.6
      - comm==0.2.2
      - contourpy==1.3.0
      - cycler==0.12.1
      - debugpy==1.8.13
      - decorator==5.2.1
      - defusedxml==0.7.1
      - dill==0.3.9
      - docutils==0.18.1
      - exceptiongroup==1.2.2
      - executing==2.2.0
      - fastjsonschema==2.21.1
      - fonttools==4.56.0
      - h5py==3.13.0
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==8.6.1
      - importlib-resources==6.5.2
      - iniconfig==2.1.0
      - ipykernel==6.29.5
      - ipython==8.18.1
      - ipywidgets==8.1.5
      - jedi==0.19.2
      - jinja2==3.0.3
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - jupyter-client==8.6.3
      - jupyter-core==5.7.2
      - jupyterlab-pygments==0.3.0
      - jupyterlab-widgets==3.0.13
      - kiwisolver==1.4.7
      - lmfit==1.3.3
      - markupsafe==3.0.2
      - matplotlib==3.9.4
      - matplotlib-inline==0.1.7
      - mistune==3.1.3
      - mpmath==1.3.0
      - nbclient==0.10.2
      - nbconvert==7.16.6
      - nbformat==5.10.4
      - nbsphinx==0.9.7
      - nest-asyncio==1.6.0
      - numpy==1.26.4
      - numpydoc==1.2.1
      - packaging==24.2
      - pandocfilters==1.5.1
      - parso==0.8.4
      - pexpect==4.9.0
      - pillow==11.1.0
      - plasmapy==0.3.2.dev39+g35957735
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - prompt-toolkit==3.0.50
      - psutil==7.0.0
      - ptyprocess==0.7.0
      - pure-eval==0.2.3
      - pyerfa==2.0.1.5
      - pygments==2.19.1
      - pyparsing==3.2.3
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - pyyaml==6.0.2
      - pyzmq==26.3.0
      - referencing==0.36.2
      - requests==2.32.3
      - rpds-py==0.24.0
      - scipy==1.13.1
      - setuptools-scm==8.2.0
      - six==1.17.0
      - snowballstemmer==2.2.0
      - soupsieve==2.6
      - sphinx==2.4.4
      - sphinx-automodapi==0.15.0
      - sphinx-copybutton==0.5.2
      - sphinx-gallery==0.11.0
      - sphinx-rtd-theme==1.3.0
      - sphinxcontrib-applehelp==2.0.0
      - sphinxcontrib-devhelp==2.0.0
      - sphinxcontrib-htmlhelp==2.1.0
      - sphinxcontrib-jquery==4.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==2.0.0
      - sphinxcontrib-serializinghtml==2.0.0
      - stack-data==0.6.3
      - tinycss2==1.4.0
      - tomli==2.2.1
      - tornado==6.4.2
      - towncrier==24.8.0
      - traitlets==5.14.3
      - typing-extensions==4.13.0
      - uncertainties==3.2.2
      - urllib3==2.3.0
      - wcwidth==0.2.13
      - webencodings==0.5.1
      - widgetsnbextension==4.0.13
      - zipp==3.21.0
prefix: /opt/conda/envs/PlasmaPy

plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD2D::test_has_electric_field_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD2D::test_correct_shape_electric_field plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD2D::test_has_charge_density_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD2D::test_correct_shape_charge_density plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD2D::test_has_magnetic_field plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD2D::test_has_electric_current plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD3D::test_has_electric_field_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD3D::test_correct_shape_electric_field plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD3D::test_has_charge_density_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD3D::test_correct_shape_charge_density plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD3D::test_has_magnetic_field plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMD3D::test_has_electric_current plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_has_electric_field_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_correct_shape_electric_field plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_has_charge_density_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_correct_shape_charge_density plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_has_magnetic_field_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_correct_shape_magnetic_field plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_has_electric_current_with_units plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::TestOpenPMDThetaMode::test_correct_shape_electric_current plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::test_fetch_units[openPMD_dims0-expected0] plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::test_fetch_units[openPMD_dims1-expected1] plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::test_fetch_units[openPMD_dims2-expected2] plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::test_fetch_units[openPMD_dims3-expected3] plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::test_unavailable_hdf5 plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::test_non_openpmd_hdf5 plasmapy/plasma/sources/tests/test_openpmd_hdf5.py::test_HDF5Reader plasmapy/plasma/sources/tests/test_plasma3d.py::plasmapy.plasma.sources.tests.test_plasma3d.test_Plasma3D_setup plasmapy/plasma/sources/tests/test_plasma3d.py::test_Plasma3D_setup[grid_dimensions0-100] plasmapy/plasma/sources/tests/test_plasma3d.py::test_Plasma3D_setup[grid_dimensions1-16384] plasmapy/plasma/sources/tests/test_plasma3d.py::test_Plasma3D_setup[grid_dimensions2-262144] plasmapy/plasma/sources/tests/test_plasma3d.py::test_Plasma3D_derived_vars plasmapy/plasma/sources/tests/test_plasmablob.py::plasmapy.plasma.sources.tests.test_plasmablob.test_Plasma3D_setup plasmapy/plasma/sources/tests/test_plasmablob.py::test_Plasma3D_setup[grid_dimensions0-100] plasmapy/plasma/sources/tests/test_plasmablob.py::test_Plasma3D_setup[grid_dimensions1-16384] plasmapy/plasma/sources/tests/test_plasmablob.py::test_Plasma3D_setup[grid_dimensions2-262144] plasmapy/plasma/sources/tests/test_plasmablob.py::test_Plasma3D_derived_vars plasmapy/plasma/sources/tests/test_plasmablob.py::test_Plasma3D_add_magnetostatics plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlobRegimes::test_intermediate_coupling plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlobRegimes::test_strongly_coupled plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlobRegimes::test_weakly_coupled plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlobRegimes::test_thermal_kinetic_energy_dominant plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlobRegimes::test_fermi_quantum_energy_dominant plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlobRegimes::test_both_fermi_and_thermal_energy_important plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlob::test_invalid_particle plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlob::test_electron_temperature plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlob::test_electron_density plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlob::test_ionization plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlob::test_composition plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlob::test_coupling plasmapy/plasma/sources/tests/test_plasmablob.py::Test_PlasmaBlob::test_quantum_theta plasmapy/plasma/tests/test_plasma_base.py::TestRegistrar::test_no_data_source plasmapy/plasma/tests/test_plasma_base.py::TestRegistrar::test_is_data_source plasmapy/plasma/tests/test_plasma_base.py::TestRegistrar::test_is_not_data_source plasmapy/plasma/tests/test_plasma_base.py::test_subclasses plasmapy/plasma/tests/test_plasma_factory.py::TestPlasma::test_patters plasmapy/plasma/tests/test_plasma_factory.py::TestPlasma::test_Plasma3D plasmapy/plasma/tests/test_plasma_factory.py::TestPlasma::test_PlasmaBlob plasmapy/simulation/tests/test_particletracker.py::test_particle_exb_drift
docs/plasma/sources.rst plasmapy/classes/sources/openpmd_hdf5.py plasmapy/classes/sources/plasma3d.py plasmapy/classes/plasma_factory.py plasmapy/classes/__init__.py docs/notebooks/particle_stepper.ipynb docs/notebooks/magnetic_statics.ipynb plasmapy/classes/exceptions.py plasmapy/classes/sources/plasmablob.py plasmapy/classes/plasma_base.py plasmapy/__init__.py docs/about/stability.rst docs/plasma/index.rst plasmapy/classes/sources/__init__.py changelog/842.breaking.rst
plasmapy/plasma/exceptions.py docs/plasma/sources.rst plasmapy/plasma/sources/__init__.py docs/notebooks/particle_stepper.ipynb docs/notebooks/magnetic_statics.ipynb plasmapy/plasma/__init__.py plasmapy/__init__.py docs/about/stability.rst plasmapy/plasma/plasma_factory.py plasmapy/plasma/sources/openpmd_hdf5.py plasmapy/plasma/sources/plasmablob.py docs/plasma/index.rst changelog/842.breaking.rst plasmapy/plasma/plasma_base.py plasmapy/plasma/sources/plasma3d.py