diff --git a/CHANGELOG.md b/CHANGELOG.md
index 67e1fe85fa40bcea98590c02e1c03e10f8d1dad5..fa51d6d092e172dd522098b135ce823e8d0b8f15 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,11 @@
 - 
 
 ### Changed
--
+- The `periodic_boundary` option to the prior classes has been changed to `boundary`.
+This breaks backward compatibility.
+The options to `boundary` are `{'periodic', 'reflective', None}`.
+Periodic boundaries are supported as before.
+Reflective boundaries are supported in `dynesty` and `cpnest`.  
 
 ### Removed
 -
diff --git a/bilby/core/prior.py b/bilby/core/prior.py
index 8cfdf7b2060617d61ca7a0684fb7451d805807cd..5e6894e740a2c272a7dac7d8c8eac7e1ee1cbaae 100644
--- a/bilby/core/prior.py
+++ b/bilby/core/prior.py
@@ -408,7 +408,7 @@ class Prior(object):
     _default_latex_labels = dict()
 
     def __init__(self, name=None, latex_label=None, unit=None, minimum=-np.inf,
-                 maximum=np.inf, periodic_boundary=False):
+                 maximum=np.inf, boundary=None):
         """ Implements a Prior object
 
         Parameters
@@ -423,8 +423,8 @@ class Prior(object):
             Minimum of the domain, default=-np.inf
         maximum: float, optional
             Maximum of the domain, default=np.inf
-        periodic_boundary: bool, optional
-            Whether or not the boundary condition is periodic.
+        boundary: str, optional
+            The boundary condition of the prior, can be 'periodic', 'reflective'
             Currently implemented in cpnest, dynesty and pymultinest.
         """
         self.name = name
@@ -432,7 +432,7 @@ class Prior(object):
         self.unit = unit
         self.minimum = minimum
         self.maximum = maximum
-        self.periodic_boundary = periodic_boundary
+        self.boundary = boundary
 
     def __call__(self):
         """Overrides the __call__ special method. Calls the sample method.
@@ -639,14 +639,14 @@ class Prior(object):
         self._maximum = maximum
 
     @property
-    def periodic_boundary(self):
-        return self._periodic_boundary
+    def boundary(self):
+        return self._boundary
 
-    @periodic_boundary.setter
-    def periodic_boundary(self, periodic_boundary):
-        if type(periodic_boundary) is not bool:
-            raise ValueError('{} is not a valid setting for prior boundaries'.format(periodic_boundary))
-        self._periodic_boundary = periodic_boundary
+    @boundary.setter
+    def boundary(self, boundary):
+        if boundary not in ['periodic', 'reflective', None]:
+            raise ValueError('{} is not a valid setting for prior boundaries'.format(boundary))
+        self._boundary = boundary
 
     @property
     def __default_latex_label(self):
@@ -725,7 +725,7 @@ class DeltaFunction(Prior):
 class PowerLaw(Prior):
 
     def __init__(self, alpha, minimum, maximum, name=None, latex_label=None,
-                 unit=None, periodic_boundary=False):
+                 unit=None, boundary=None):
         """Power law with bounds and alpha, spectral index
 
         Parameters
@@ -742,12 +742,12 @@ class PowerLaw(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, latex_label=latex_label,
                        minimum=minimum, maximum=maximum, unit=unit,
-                       periodic_boundary=periodic_boundary)
+                       boundary=boundary)
         self.alpha = alpha
 
     def rescale(self, val):
@@ -815,7 +815,7 @@ class PowerLaw(Prior):
 class Uniform(Prior):
 
     def __init__(self, minimum, maximum, name=None, latex_label=None,
-                 unit=None, periodic_boundary=False):
+                 unit=None, boundary=None):
         """Uniform prior with bounds
 
         Parameters
@@ -830,12 +830,12 @@ class Uniform(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, latex_label=latex_label,
                        minimum=minimum, maximum=maximum, unit=unit,
-                       periodic_boundary=periodic_boundary)
+                       boundary=boundary)
 
     def rescale(self, val):
         """
@@ -887,7 +887,7 @@ class Uniform(Prior):
 class LogUniform(PowerLaw):
 
     def __init__(self, minimum, maximum, name=None, latex_label=None,
-                 unit=None, periodic_boundary=False):
+                 unit=None, boundary=None):
         """Log-Uniform prior with bounds
 
         Parameters
@@ -902,11 +902,11 @@ class LogUniform(PowerLaw):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         PowerLaw.__init__(self, name=name, latex_label=latex_label, unit=unit,
-                          minimum=minimum, maximum=maximum, alpha=-1, periodic_boundary=periodic_boundary)
+                          minimum=minimum, maximum=maximum, alpha=-1, boundary=boundary)
         if self.minimum <= 0:
             logger.warning('You specified a uniform-in-log prior with minimum={}'.format(self.minimum))
 
@@ -914,8 +914,8 @@ class LogUniform(PowerLaw):
 class SymmetricLogUniform(Prior):
 
     def __init__(self, minimum, maximum, name=None, latex_label=None,
-                 unit=None, periodic_boundary=False):
-        """Symmetric Log-Uniform distributions with bounds
+                 unit=None, boundary=None):
+        """Symmetric Log-Uniform distribtions with bounds
 
         This is identical to a Log-Uniform distribution, but mirrored about
         the zero-axis and subsequently normalized. As such, the distribution
@@ -934,12 +934,12 @@ class SymmetricLogUniform(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, latex_label=latex_label,
                        minimum=minimum, maximum=maximum, unit=unit,
-                       periodic_boundary=periodic_boundary)
+                       boundary=boundary)
 
     def rescale(self, val):
         """
@@ -997,7 +997,7 @@ class SymmetricLogUniform(Prior):
 class Cosine(Prior):
 
     def __init__(self, name=None, latex_label=None, unit=None,
-                 minimum=-np.pi / 2, maximum=np.pi / 2, periodic_boundary=False):
+                 minimum=-np.pi / 2, maximum=np.pi / 2, boundary=None):
         """Cosine prior with bounds
 
         Parameters
@@ -1012,11 +1012,11 @@ class Cosine(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, latex_label=latex_label, unit=unit,
-                       minimum=minimum, maximum=maximum, periodic_boundary=periodic_boundary)
+                       minimum=minimum, maximum=maximum, boundary=boundary)
 
     def rescale(self, val):
         """
@@ -1045,7 +1045,7 @@ class Cosine(Prior):
 class Sine(Prior):
 
     def __init__(self, name=None, latex_label=None, unit=None, minimum=0,
-                 maximum=np.pi, periodic_boundary=False):
+                 maximum=np.pi, boundary=None):
         """Sine prior with bounds
 
         Parameters
@@ -1060,11 +1060,11 @@ class Sine(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, latex_label=latex_label, unit=unit,
-                       minimum=minimum, maximum=maximum, periodic_boundary=periodic_boundary)
+                       minimum=minimum, maximum=maximum, boundary=boundary)
 
     def rescale(self, val):
         """
@@ -1092,7 +1092,7 @@ class Sine(Prior):
 
 class Gaussian(Prior):
 
-    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, boundary=None):
         """Gaussian prior with mean mu and width sigma
 
         Parameters
@@ -1107,10 +1107,10 @@ class Gaussian(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
-        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, boundary=boundary)
         self.mu = mu
         self.sigma = sigma
 
@@ -1157,7 +1157,7 @@ class Gaussian(Prior):
 
 class Normal(Gaussian):
 
-    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, boundary=None):
         """A synonym for the Gaussian distribution.
 
         Parameters
@@ -1172,17 +1172,17 @@ class Normal(Gaussian):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Gaussian.__init__(self, mu=mu, sigma=sigma, name=name, latex_label=latex_label,
-                          unit=unit, periodic_boundary=periodic_boundary)
+                          unit=unit, boundary=boundary)
 
 
 class TruncatedGaussian(Prior):
 
     def __init__(self, mu, sigma, minimum, maximum, name=None,
-                 latex_label=None, unit=None, periodic_boundary=False):
+                 latex_label=None, unit=None, boundary=None):
         """Truncated Gaussian prior with mean mu and width sigma
 
         https://en.wikipedia.org/wiki/Truncated_normal_distribution
@@ -1203,11 +1203,11 @@ class TruncatedGaussian(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, latex_label=latex_label, unit=unit,
-                       minimum=minimum, maximum=maximum, periodic_boundary=periodic_boundary)
+                       minimum=minimum, maximum=maximum, boundary=boundary)
         self.mu = mu
         self.sigma = sigma
 
@@ -1250,7 +1250,7 @@ class TruncatedGaussian(Prior):
 class TruncatedNormal(TruncatedGaussian):
 
     def __init__(self, mu, sigma, minimum, maximum, name=None,
-                 latex_label=None, unit=None, periodic_boundary=False):
+                 latex_label=None, unit=None, boundary=None):
         """A synonym for the TruncatedGaussian distribution.
 
         Parameters
@@ -1269,16 +1269,16 @@ class TruncatedNormal(TruncatedGaussian):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         TruncatedGaussian.__init__(self, mu=mu, sigma=sigma, minimum=minimum,
                                    maximum=maximum, name=name, latex_label=latex_label,
-                                   unit=unit, periodic_boundary=periodic_boundary)
+                                   unit=unit, boundary=boundary)
 
 
 class HalfGaussian(TruncatedGaussian):
-    def __init__(self, sigma, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, sigma, name=None, latex_label=None, unit=None, boundary=None):
         """A Gaussian with its mode at zero, and truncated to only be positive.
 
         Parameters
@@ -1291,16 +1291,16 @@ class HalfGaussian(TruncatedGaussian):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         TruncatedGaussian.__init__(self, 0., sigma, minimum=0., maximum=np.inf,
                                    name=name, latex_label=latex_label,
-                                   unit=unit, periodic_boundary=periodic_boundary)
+                                   unit=unit, boundary=boundary)
 
 
 class HalfNormal(HalfGaussian):
-    def __init__(self, sigma, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, sigma, name=None, latex_label=None, unit=None, boundary=None):
         """A synonym for the HalfGaussian distribution.
 
         Parameters
@@ -1313,16 +1313,16 @@ class HalfNormal(HalfGaussian):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         HalfGaussian.__init__(self, sigma=sigma, name=name,
                               latex_label=latex_label, unit=unit,
-                              periodic_boundary=periodic_boundary)
+                              boundary=boundary)
 
 
 class LogNormal(Prior):
-    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, boundary=None):
         """Log-normal prior with mean mu and width sigma
 
         https://en.wikipedia.org/wiki/Log-normal_distribution
@@ -1339,11 +1339,11 @@ class LogNormal(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, minimum=0., latex_label=latex_label,
-                       unit=unit, periodic_boundary=periodic_boundary)
+                       unit=unit, boundary=boundary)
 
         if sigma <= 0.:
             raise ValueError("For the LogGaussian prior the standard deviation must be positive")
@@ -1390,7 +1390,7 @@ class LogNormal(Prior):
 
 
 class LogGaussian(LogNormal):
-    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, mu, sigma, name=None, latex_label=None, unit=None, boundary=None):
         """Synonym of LogNormal prior
 
         https://en.wikipedia.org/wiki/Log-normal_distribution
@@ -1407,15 +1407,15 @@ class LogGaussian(LogNormal):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         LogNormal.__init__(self, mu=mu, sigma=sigma, name=name,
-                           latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+                           latex_label=latex_label, unit=unit, boundary=boundary)
 
 
 class Exponential(Prior):
-    def __init__(self, mu, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, mu, name=None, latex_label=None, unit=None, boundary=None):
         """Exponential prior with mean mu
 
         Parameters
@@ -1428,11 +1428,11 @@ class Exponential(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, minimum=0., latex_label=latex_label,
-                       unit=unit, periodic_boundary=periodic_boundary)
+                       unit=unit, boundary=boundary)
         self.mu = mu
 
     def rescale(self, val):
@@ -1475,7 +1475,7 @@ class Exponential(Prior):
 
 class StudentT(Prior):
     def __init__(self, df, mu=0., scale=1., name=None, latex_label=None,
-                 unit=None, periodic_boundary=False):
+                 unit=None, boundary=None):
         """Student's t-distribution prior with number of degrees of freedom df,
         mean mu and scale
 
@@ -1495,10 +1495,10 @@ class StudentT(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
-        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, boundary=boundary)
 
         if df <= 0. or scale <= 0.:
             raise ValueError("For the StudentT prior the number of degrees of freedom and scale must be positive")
@@ -1548,7 +1548,7 @@ class StudentT(Prior):
 
 class Beta(Prior):
     def __init__(self, alpha, beta, minimum=0, maximum=1, name=None,
-                 latex_label=None, unit=None, periodic_boundary=False):
+                 latex_label=None, unit=None, boundary=None):
         """Beta distribution
 
         https://en.wikipedia.org/wiki/Beta_distribution
@@ -1572,7 +1572,7 @@ class Beta(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         if alpha <= 0. or beta <= 0.:
@@ -1583,7 +1583,7 @@ class Beta(Prior):
         self._minimum = minimum
         self._maximum = maximum
         Prior.__init__(self, minimum=minimum, maximum=maximum, name=name,
-                       latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+                       latex_label=latex_label, unit=unit, boundary=boundary)
         self._set_dist()
 
     def rescale(self, val):
@@ -1687,7 +1687,7 @@ class Beta(Prior):
 
 
 class Logistic(Prior):
-    def __init__(self, mu, scale, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, mu, scale, name=None, latex_label=None, unit=None, boundary=None):
         """Logistic distribution
 
         https://en.wikipedia.org/wiki/Logistic_distribution
@@ -1704,10 +1704,10 @@ class Logistic(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
-        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, boundary=boundary)
 
         if scale <= 0.:
             raise ValueError("For the Logistic prior the scale must be positive")
@@ -1755,7 +1755,7 @@ class Logistic(Prior):
 
 
 class Cauchy(Prior):
-    def __init__(self, alpha, beta, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, alpha, beta, name=None, latex_label=None, unit=None, boundary=None):
         """Cauchy distribution
 
         https://en.wikipedia.org/wiki/Cauchy_distribution
@@ -1772,10 +1772,10 @@ class Cauchy(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
-        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+        Prior.__init__(self, name=name, latex_label=latex_label, unit=unit, boundary=boundary)
 
         if beta <= 0.:
             raise ValueError("For the Cauchy prior the scale must be positive")
@@ -1822,7 +1822,7 @@ class Cauchy(Prior):
 
 
 class Lorentzian(Cauchy):
-    def __init__(self, alpha, beta, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, alpha, beta, name=None, latex_label=None, unit=None, boundary=None):
         """Synonym for the Cauchy distribution
 
         https://en.wikipedia.org/wiki/Cauchy_distribution
@@ -1839,15 +1839,15 @@ class Lorentzian(Cauchy):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Cauchy.__init__(self, alpha=alpha, beta=beta, name=name,
-                        latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+                        latex_label=latex_label, unit=unit, boundary=boundary)
 
 
 class Gamma(Prior):
-    def __init__(self, k, theta=1., name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, k, theta=1., name=None, latex_label=None, unit=None, boundary=None):
         """Gamma distribution
 
         https://en.wikipedia.org/wiki/Gamma_distribution
@@ -1864,11 +1864,11 @@ class Gamma(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
         Prior.__init__(self, name=name, minimum=0., latex_label=latex_label,
-                       unit=unit, periodic_boundary=periodic_boundary)
+                       unit=unit, boundary=boundary)
 
         if k <= 0 or theta <= 0:
             raise ValueError("For the Gamma prior the shape and scale must be positive")
@@ -1917,7 +1917,7 @@ class Gamma(Prior):
 
 
 class ChiSquared(Gamma):
-    def __init__(self, nu, name=None, latex_label=None, unit=None, periodic_boundary=False):
+    def __init__(self, nu, name=None, latex_label=None, unit=None, boundary=None):
         """Chi-squared distribution
 
         https://en.wikipedia.org/wiki/Chi-squared_distribution
@@ -1932,7 +1932,7 @@ class ChiSquared(Gamma):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
         """
 
@@ -1940,7 +1940,7 @@ class ChiSquared(Gamma):
             raise ValueError("For the ChiSquared prior the number of degrees of freedom must be a positive integer")
 
         Gamma.__init__(self, name=name, k=nu / 2., theta=2.,
-                       latex_label=latex_label, unit=unit, periodic_boundary=periodic_boundary)
+                       latex_label=latex_label, unit=unit, boundary=boundary)
 
     @property
     def nu(self):
@@ -1954,7 +1954,7 @@ class ChiSquared(Gamma):
 class Interped(Prior):
 
     def __init__(self, xx, yy, minimum=np.nan, maximum=np.nan, name=None,
-                 latex_label=None, unit=None, periodic_boundary=False):
+                 latex_label=None, unit=None, boundary=None):
         """Creates an interpolated prior function from arrays of xx and yy=p(xx)
 
         Parameters
@@ -1973,7 +1973,7 @@ class Interped(Prior):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
 
         Attributes
@@ -1998,8 +1998,7 @@ class Interped(Prior):
         minimum = float(np.nanmax(np.array((min(xx), minimum))))
         maximum = float(np.nanmin(np.array((max(xx), maximum))))
         Prior.__init__(self, name=name, latex_label=latex_label, unit=unit,
-                       minimum=minimum, maximum=maximum,
-                       periodic_boundary=periodic_boundary)
+                       minimum=minimum, maximum=maximum, boundary=boundary)
         self._update_instance()
 
     def __eq__(self, other):
@@ -2092,7 +2091,7 @@ class Interped(Prior):
 class FromFile(Interped):
 
     def __init__(self, file_name, minimum=None, maximum=None, name=None,
-                 latex_label=None, unit=None, periodic_boundary=False):
+                 latex_label=None, unit=None, boundary=None):
         """Creates an interpolated prior function from arrays of xx and yy=p(xx) extracted from a file
 
         Parameters
@@ -2109,7 +2108,7 @@ class FromFile(Interped):
             See superclass
         unit: str
             See superclass
-        periodic_boundary: bool
+        boundary: str
             See superclass
 
         """
@@ -2118,7 +2117,7 @@ class FromFile(Interped):
             xx, yy = np.genfromtxt(self.id).T
             Interped.__init__(self, xx=xx, yy=yy, minimum=minimum,
                               maximum=maximum, name=name, latex_label=latex_label,
-                              unit=unit, periodic_boundary=periodic_boundary)
+                              unit=unit, boundary=boundary)
         except IOError:
             logger.warning("Can't load {}.".format(self.id))
             logger.warning("Format should be:")
diff --git a/bilby/core/sampler/dynesty.py b/bilby/core/sampler/dynesty.py
index e0abc5a0aae826dad991eff044c62a1300d22561..edf6b8c85cff14cab4d03d3e3bc28748bfa9c150 100644
--- a/bilby/core/sampler/dynesty.py
+++ b/bilby/core/sampler/dynesty.py
@@ -95,6 +95,8 @@ class Dynesty(NestedSampler):
         self.n_check_point = n_check_point
         self.check_point = check_point
         self.resume = resume
+        self._periodic = list()
+        self._reflective = list()
         self._apply_dynesty_boundaries()
         if self.n_check_point is None:
             # If the log_likelihood_eval_time is not calculable then
@@ -180,10 +182,16 @@ class Dynesty(NestedSampler):
         if self.kwargs['periodic'] is None:
             logger.debug("Setting periodic boundaries for keys:")
             self.kwargs['periodic'] = []
+            self._periodic = list()
+            self._reflective = list()
             for ii, key in enumerate(self.search_parameter_keys):
-                if self.priors[key].periodic_boundary:
+                if self.priors[key].boundary in ['periodic', 'reflective']:
                     self.kwargs['periodic'].append(ii)
                     logger.debug("  {}".format(key))
+                    if self.priors[key].boundary == 'periodic':
+                        self._periodic.append(ii)
+                    else:
+                        self._reflective.append(ii)
 
     def run_sampler(self):
         import dynesty
@@ -371,8 +379,9 @@ class Dynesty(NestedSampler):
         try:
             weights = np.exp(current_state['sample_log_weights'] -
                              current_state['cumulative_log_evidence'][-1])
+            from dynesty.utils import resample_equal
 
-            current_state['posterior'] = self.external_sampler.utils.resample_equal(
+            current_state['posterior'] = resample_equal(
                 np.array(current_state['physical_samples']), weights)
         except ValueError:
             logger.debug("Unable to create posterior")
@@ -424,6 +433,13 @@ class Dynesty(NestedSampler):
         Notes
         -----
         Since dynesty allows periodic parameters to wander outside the unit
+        We also allow parameters with reflective boundaries to wander outside
+
+        The logic ensures that when theta < 0 you shift to |theta| and when
+        theta > 1 you return 2 - theta
         """
-        theta = np.mod(theta, 1)
+        theta[self._periodic] = np.mod(theta[self._periodic], 1)
+        theta_ref = theta[self._reflective]
+        theta[self._reflective] = np.minimum(
+            np.maximum(theta_ref, abs(theta_ref)), 2 - theta_ref)
         return self.priors.rescale(self._search_parameter_keys, theta)
diff --git a/bilby/core/sampler/proposal.py b/bilby/core/sampler/proposal.py
index a928292b32b3293d593b0080e49f316c849c3a20..496869274e482efc7fae1b4fd5449d9d65c163e4 100644
--- a/bilby/core/sampler/proposal.py
+++ b/bilby/core/sampler/proposal.py
@@ -72,7 +72,8 @@ class JumpProposal(object):
         return self._apply_boundaries(sample)
 
     def _move_reflecting_keys(self, sample):
-        keys = [key for key in sample.keys() if not self.priors[key].periodic_boundary]
+        keys = [key for key in sample.keys()
+                if self.priors[key].boundary == 'reflective']
         for key in keys:
             if sample[key] > self.priors[key].maximum or sample[key] < self.priors[key].minimum:
                 r = self.priors[key].maximum - self.priors[key].minimum
@@ -84,7 +85,8 @@ class JumpProposal(object):
         return sample
 
     def _move_periodic_keys(self, sample):
-        keys = [key for key in sample.keys() if self.priors[key].periodic_boundary]
+        keys = [key for key in sample.keys()
+                if self.priors[key].boundary == 'periodic']
         for key in keys:
             if sample[key] > self.priors[key].maximum or sample[key] < self.priors[key].minimum:
                 sample[key] = (self.priors[key].minimum +
diff --git a/bilby/core/sampler/pymultinest.py b/bilby/core/sampler/pymultinest.py
index 0533e3bece39084c8f0a29c92e3a7914f216673f..45fb930dbc0912efbcf488448aafc4570e4516f5 100644
--- a/bilby/core/sampler/pymultinest.py
+++ b/bilby/core/sampler/pymultinest.py
@@ -87,7 +87,7 @@ class Pymultinest(NestedSampler):
         if self.kwargs['wrapped_params'] is None:
             self.kwargs['wrapped_params'] = []
             for param, value in self.priors.items():
-                if value.periodic_boundary:
+                if value.boundary == 'periodic':
                     self.kwargs['wrapped_params'].append(1)
                 else:
                     self.kwargs['wrapped_params'].append(0)
diff --git a/bilby/gw/prior.py b/bilby/gw/prior.py
index 11fe89f504ffa0e64613a2b59c17841585084481..857490e6e74c97adcbea9f42c9e8449b8aa8cf12 100644
--- a/bilby/gw/prior.py
+++ b/bilby/gw/prior.py
@@ -31,7 +31,7 @@ class Cosmological(Interped):
                 name='comoving_distance', latex_label='$d_C$', unit=units.Mpc))
 
     def __init__(self, minimum, maximum, cosmology=None, name=None,
-                 latex_label=None, unit=None, periodic_boundary=False):
+                 latex_label=None, unit=None, boundary=None):
         self.cosmology = get_cosmology(cosmology)
         if name not in self._default_args_dict:
             raise ValueError(
@@ -59,7 +59,7 @@ class Cosmological(Interped):
         else:
             raise ValueError('Name {} not recognized.'.format(name))
         Interped.__init__(self, xx=xx, yy=yy, minimum=minimum, maximum=maximum,
-                          periodic_boundary=periodic_boundary, **label_args)
+                          boundary=boundary, **label_args)
 
     @property
     def minimum(self):
@@ -178,7 +178,7 @@ class UniformSourceFrame(Cosmological):
 class AlignedSpin(Interped):
 
     def __init__(self, a_prior=Uniform(0, 1), z_prior=Uniform(-1, 1),
-                 name=None, latex_label=None, unit=None, periodic_boundary=False):
+                 name=None, latex_label=None, unit=None, boundary=None):
         """
         Prior distribution for the aligned (z) component of the spin.
 
@@ -210,7 +210,7 @@ class AlignedSpin(Interped):
                                      z_prior.prob(x / aas)), aas) for x in xx]
         Interped.__init__(self, xx=xx, yy=yy, name=name,
                           latex_label=latex_label, unit=unit,
-                          periodic_boundary=periodic_boundary)
+                          boundary=boundary)
 
 
 class BBHPriorDict(PriorDict):
@@ -527,14 +527,14 @@ class CalibrationPriorDict(PriorDict):
             prior[name] = Gaussian(mu=amplitude_mean_nodes[ii],
                                    sigma=amplitude_sigma_nodes[ii],
                                    name=name, latex_label=latex_label,
-                                   periodic_boundary=False)
+                                   boundary=None)
         for ii in range(n_nodes):
             name = "recalib_{}_phase_{}".format(label, ii)
             latex_label = "$\\phi^{}_{}$".format(label, ii)
             prior[name] = Gaussian(mu=phase_mean_nodes[ii],
                                    sigma=phase_sigma_nodes[ii],
                                    name=name, latex_label=latex_label,
-                                   periodic_boundary=False)
+                                   boundary=None)
         for ii in range(n_nodes):
             name = "recalib_{}_frequency_{}".format(label, ii)
             latex_label = "$f^{}_{}$".format(label, ii)
@@ -588,14 +588,14 @@ class CalibrationPriorDict(PriorDict):
             prior[name] = Gaussian(mu=amplitude_mean_nodes[ii],
                                    sigma=amplitude_sigma_nodes[ii],
                                    name=name, latex_label=latex_label,
-                                   periodic_boundary=False)
+                                   boundary=None)
         for ii in range(n_nodes):
             name = "recalib_{}_phase_{}".format(label, ii)
             latex_label = "$\\phi^{}_{}$".format(label, ii)
             prior[name] = Gaussian(mu=phase_mean_nodes[ii],
                                    sigma=phase_sigma_nodes[ii],
                                    name=name, latex_label=latex_label,
-                                   periodic_boundary=False)
+                                   boundary=None)
         for ii in range(n_nodes):
             name = "recalib_{}_frequency_{}".format(label, ii)
             latex_label = "$f^{}_{}$".format(label, ii)
diff --git a/bilby/gw/prior_files/GW150914.prior b/bilby/gw/prior_files/GW150914.prior
index aa8001659e8e2d0bb7b480bc1699f73cd8eddf4e..af973334c37a44ff6364aa375b62bf2d1b0df6be 100644
--- a/bilby/gw/prior_files/GW150914.prior
+++ b/bilby/gw/prior_files/GW150914.prior
@@ -1,20 +1,20 @@
 # These are the default priors for analysing GW150914.
-mass_1 = Uniform(name='mass_1', minimum=30, maximum=50, unit='$M_{\\odot}$', periodic_boundary=False)
-mass_2 = Uniform(name='mass_2', minimum=20, maximum=40, unit='$M_{\\odot}$', periodic_boundary=False)
+mass_1 = Uniform(name='mass_1', minimum=30, maximum=50, unit='$M_{\\odot}$', boundary=None)
+mass_2 = Uniform(name='mass_2', minimum=20, maximum=40, unit='$M_{\\odot}$', boundary=None)
 mass_ratio = Constraint(name='mass_ratio', minimum=0.125, maximum=1)
-a_1 = Uniform(name='a_1', minimum=0, maximum=0.8, periodic_boundary=False)
-a_2 = Uniform(name='a_2', minimum=0, maximum=0.8, periodic_boundary=False)
-tilt_1 = Sine(name='tilt_1', periodic_boundary=False)
-tilt_2 = Sine(name='tilt_2', periodic_boundary=False)
-phi_12 = Uniform(name='phi_12', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-phi_jl = Uniform(name='phi_jl', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=1e3, unit='Mpc', periodic_boundary=False)
-dec = Cosine(name='dec', periodic_boundary=False)
-ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-theta_jn = Sine(name='theta_jn', periodic_boundary=False)
-psi = Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True)
-phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-geocent_time = Uniform(1126259462.322, 1126259462.522, name='geocent_time', unit='$s$', periodic_boundary=False)
+a_1 = Uniform(name='a_1', minimum=0, maximum=0.8, boundary='reflective')
+a_2 = Uniform(name='a_2', minimum=0, maximum=0.8, boundary='reflective')
+tilt_1 = Sine(name='tilt_1', boundary='reflective')
+tilt_2 = Sine(name='tilt_2', boundary='reflective')
+phi_12 = Uniform(name='phi_12', minimum=0, maximum=2 * np.pi, boundary='periodic')
+phi_jl = Uniform(name='phi_jl', minimum=0, maximum=2 * np.pi, boundary='periodic')
+luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=1e3, unit='Mpc', boundary=None)
+dec = Cosine(name='dec', boundary='reflective')
+ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic')
+theta_jn = Sine(name='theta_jn', boundary='reflective')
+psi = Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic')
+phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
+geocent_time = Uniform(1126259462.322, 1126259462.522, name='geocent_time', unit='$s$', boundary=None)
 # These are the calibration parameters as described in
 # https://journals.aps.org/prx/abstract/10.1103/PhysRevX.6.041015
 # recalib_H1_frequency_0 = 20
diff --git a/bilby/gw/prior_files/aligned_spin_binary_black_holes.prior b/bilby/gw/prior_files/aligned_spin_binary_black_holes.prior
index e2b2a577a7b60ebe48af7b86ec28a5d9327e5fd2..ae92f3675dcb1a0c0d0200d827c8bc8a03b424dd 100644
--- a/bilby/gw/prior_files/aligned_spin_binary_black_holes.prior
+++ b/bilby/gw/prior_files/aligned_spin_binary_black_holes.prior
@@ -2,19 +2,19 @@
 # Note that you may wish to use more specific mass and distance parameters.
 # These commands are all known to bilby.gw.prior.
 # Lines beginning "#" are ignored.
-mass_1 = Uniform(name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
-mass_2 = Uniform(name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
+mass_1 = Uniform(name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None)
+mass_2 = Uniform(name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None)
 mass_ratio = Constraint(name='mass_ratio', minimum=0.125, maximum=1)
-# chirp_mass = Uniform(name='chirp_mass', minimum=25, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
-# total_mass = Uniform(name='total_mass', minimum=10, maximum=200, unit='$M_{\\odot}$', periodic_boundary=False)
-# mass_ratio = Uniform(name='mass_ratio', minimum=0.125, maximum=1, periodic_boundary=False)
-# symmetric_mass_ratio =  Uniform(name='symmetric_mass_ratio', minimum=8 / 81, maximum=0.25, periodic_boundary=False)
-chi_1 = bilby.gw.prior.AlignedSpin(name='chi_1', a_prior=Uniform(minimum=0, maximum=0.8), periodic_boundary=False)
-chi_2 = bilby.gw.prior.AlignedSpin(name='chi_2', a_prior=Uniform(minimum=0, maximum=0.8), periodic_boundary=False)
-luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=5e3, unit='Mpc', periodic_boundary=False)
-dec = Cosine(name='dec', periodic_boundary=False)
-ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-theta_jn = Sine(name='theta_jn', periodic_boundary=False)
-# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, periodic_boundary=False)
-psi = Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True)
-phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
+# chirp_mass = Uniform(name='chirp_mass', minimum=25, maximum=100, unit='$M_{\\odot}$', boundary=None)
+# total_mass = Uniform(name='total_mass', minimum=10, maximum=200, unit='$M_{\\odot}$', boundary=None)
+# mass_ratio = Uniform(name='mass_ratio', minimum=0.125, maximum=1, boundary=None)
+# symmetric_mass_ratio =  Uniform(name='symmetric_mass_ratio', minimum=8 / 81, maximum=0.25, boundary=None)
+chi_1 = bilby.gw.prior.AlignedSpin(name='chi_1', a_prior=Uniform(minimum=0, maximum=0.8), boundary='reflective')
+chi_2 = bilby.gw.prior.AlignedSpin(name='chi_2', a_prior=Uniform(minimum=0, maximum=0.8), boundary='reflective')
+luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=5e3, unit='Mpc', boundary=None)
+dec = Cosine(name='dec', boundary='reflective')
+ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic')
+theta_jn = Sine(name='theta_jn', boundary='reflective')
+# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, boundary=None)
+psi = Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic')
+phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
diff --git a/bilby/gw/prior_files/binary_black_holes.prior b/bilby/gw/prior_files/binary_black_holes.prior
index 4e7f13758dcc4d8f24e8456815b1a6922ebc546b..dcc32571b1c5b381e506ce2e41bb849049a7702a 100644
--- a/bilby/gw/prior_files/binary_black_holes.prior
+++ b/bilby/gw/prior_files/binary_black_holes.prior
@@ -2,25 +2,25 @@
 # Note that you may wish to use more specific mass and distance parameters.
 # These commands are all known to bilby.gw.prior.
 # Lines beginning "#" are ignored.
-mass_1 = Uniform(name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
-mass_2 = Uniform(name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
+mass_1 = Uniform(name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None)
+mass_2 = Uniform(name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None)
 mass_ratio = Constraint(name='mass_ratio', minimum=0.125, maximum=1)
-# chirp_mass = Uniform(name='chirp_mass', minimum=25, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
-# total_mass = Uniform(name='total_mass', minimum=10, maximum=200, unit='$M_{\\odot}$', periodic_boundary=False)
-# mass_ratio = Uniform(name='mass_ratio', minimum=0.125, maximum=1, periodic_boundary=False)
-# symmetric_mass_ratio = Uniform(name='symmetric_mass_ratio', minimum=8 / 81, maximum=0.25, periodic_boundary=False)
-a_1 = Uniform(name='a_1', minimum=0, maximum=0.8, periodic_boundary=False)
-a_2 = Uniform(name='a_2', minimum=0, maximum=0.8, periodic_boundary=False)
-tilt_1 = Sine(name='tilt_1', periodic_boundary=False)
-tilt_2 = Sine(name='tilt_2', periodic_boundary=False)
-# cos_tilt_1 = Uniform(name='cos_tilt_1', minimum=-1, maximum=1, periodic_boundary=False)
-# cos_tilt_2 = Uniform(name='cos_tilt_2', minimum=-1, maximum=1, periodic_boundary=False)
-phi_12 = Uniform(name='phi_12', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-phi_jl = Uniform(name='phi_jl', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=5e3, unit='Mpc', periodic_boundary=False)
-dec = Cosine(name='dec', periodic_boundary=False)
-ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-theta_jn = Sine(name='theta_jn', periodic_boundary=False)
-# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, periodic_boundary=False)
-psi = Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True)
-phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
+# chirp_mass = Uniform(name='chirp_mass', minimum=25, maximum=100, unit='$M_{\\odot}$', boundary=None)
+# total_mass = Uniform(name='total_mass', minimum=10, maximum=200, unit='$M_{\\odot}$', boundary=None)
+# mass_ratio = Uniform(name='mass_ratio', minimum=0.125, maximum=1, boundary=None)
+# symmetric_mass_ratio = Uniform(name='symmetric_mass_ratio', minimum=8 / 81, maximum=0.25, boundary=None)
+a_1 = Uniform(name='a_1', minimum=0, maximum=0.8, boundary='reflective')
+a_2 = Uniform(name='a_2', minimum=0, maximum=0.8, boundary='reflective')
+tilt_1 = Sine(name='tilt_1', boundary='reflective')
+tilt_2 = Sine(name='tilt_2', boundary='reflective')
+# cos_tilt_1 = Uniform(name='cos_tilt_1', minimum=-1, maximum=1, boundary=None)
+# cos_tilt_2 = Uniform(name='cos_tilt_2', minimum=-1, maximum=1, boundary=None)
+phi_12 = Uniform(name='phi_12', minimum=0, maximum=2 * np.pi, boundary='periodic')
+phi_jl = Uniform(name='phi_jl', minimum=0, maximum=2 * np.pi, boundary='periodic')
+luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=5e3, unit='Mpc', boundary=None)
+dec = Cosine(name='dec', boundary='reflective')
+ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic')
+theta_jn = Sine(name='theta_jn', boundary='reflective')
+# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, boundary=None)
+psi = Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic')
+phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
diff --git a/bilby/gw/prior_files/binary_neutron_stars.prior b/bilby/gw/prior_files/binary_neutron_stars.prior
index 61bf28bb923b7831870e8ef2f7bcc10446013b5c..de0efc5e8fd7fbec220ccb2fa368cbbb1f0b7262 100644
--- a/bilby/gw/prior_files/binary_neutron_stars.prior
+++ b/bilby/gw/prior_files/binary_neutron_stars.prior
@@ -2,23 +2,23 @@
 # Note that you may wish to use more specific mass and distance parameters.
 # These commands are all known to bilby.gw.prior.
 # Lines beginning "#" are ignored.
-mass_1 = Uniform(name='mass_1', minimum=1, maximum=2, unit='$M_{\\odot}$', periodic_boundary=False)
-mass_2 = Uniform(name='mass_2', minimum=1, maximum=2, unit='$M_{\\odot}$', periodic_boundary=False)
+mass_1 = Uniform(name='mass_1', minimum=1, maximum=2, unit='$M_{\\odot}$', boundary=None)
+mass_2 = Uniform(name='mass_2', minimum=1, maximum=2, unit='$M_{\\odot}$', boundary=None)
 mass_ratio = Constraint(name='mass_ratio', minimum=0.125, maximum=1)
-# chirp_mass = Uniform(name='chirp_mass', minimum=0.87, maximum=1.74, unit='$M_{\\odot}$', periodic_boundary=False)
-# total_mass = Uniform(name='total_mass', minimum=2, maximum=4, unit='$M_{\\odot}$', periodic_boundary=False)
-# mass_ratio = Uniform(name='mass_ratio', minimum=0.5, maximum=1, periodic_boundary=False)
-# symmetric_mass_ratio = Uniform(name='symmetric_mass_ratio', minimum=0.22, maximum=0.25, periodic_boundary=False)
-chi_1 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_1', latex_label='$\\chi_1$', periodic_boundary=False)
-chi_2 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_2', latex_label='$\\chi_2$', periodic_boundary=False)
-luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=10, maximum=500, unit='Mpc', periodic_boundary=False)
-dec = Cosine(name='dec', periodic_boundary=False)
-ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-theta_jn = Sine(name='theta_jn', periodic_boundary=False)
-# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, periodic_boundary=False)
-psi = Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True)
-phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-lambda_1 = Uniform(name='lambda_1', minimum=0, maximum=3000, periodic_boundary=False)
-lambda_2 = Uniform(name='lambda_2', minimum=0, maximum=3000, periodic_boundary=False)
-# lambda_tilde = Uniform(name='lambda_tilde', minimum=0, maximum=5000, periodic_boundary=False)
-# delta_lambda = Uniform(name='delta_lambda', minimum=-5000, maximum=5000, periodic_boundary=False)
+# chirp_mass = Uniform(name='chirp_mass', minimum=0.87, maximum=1.74, unit='$M_{\\odot}$', boundary=None)
+# total_mass = Uniform(name='total_mass', minimum=2, maximum=4, unit='$M_{\\odot}$', boundary=None)
+# mass_ratio = Uniform(name='mass_ratio', minimum=0.5, maximum=1, boundary=None)
+# symmetric_mass_ratio = Uniform(name='symmetric_mass_ratio', minimum=0.22, maximum=0.25, boundary=None)
+chi_1 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_1', latex_label='$\\chi_1$', boundary='reflective')
+chi_2 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_2', latex_label='$\\chi_2$', boundary='reflective')
+luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=10, maximum=500, unit='Mpc', boundary=None)
+dec = Cosine(name='dec', boundary='reflective')
+ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic')
+theta_jn = Sine(name='theta_jn', boundary='reflective')
+# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, boundary=None)
+psi = Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic')
+phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
+lambda_1 = Uniform(name='lambda_1', minimum=0, maximum=3000, boundary=None)
+lambda_2 = Uniform(name='lambda_2', minimum=0, maximum=3000, boundary=None)
+# lambda_tilde = Uniform(name='lambda_tilde', minimum=0, maximum=5000, boundary=None)
+# delta_lambda = Uniform(name='delta_lambda', minimum=-5000, maximum=5000, boundary=None)
diff --git a/test/gw_prior_test.py b/test/gw_prior_test.py
index 485341dbfa4fc82895ca48b9afd7d438236cf8b1..f35a52adcb667a52a8c277e606f2439d7d2438e0 100644
--- a/test/gw_prior_test.py
+++ b/test/gw_prior_test.py
@@ -36,7 +36,7 @@ class TestBBHPriorDict(unittest.TestCase):
                       for key in default.keys()])
         names = all([self.bbh_prior_dict[key].name == default[key].name
                      for key in default.keys()])
-        boundaries = all([self.bbh_prior_dict[key].periodic_boundary is default[key].periodic_boundary
+        boundaries = all([self.bbh_prior_dict[key].boundary is default[key].boundary
                           for key in default.keys()])
 
         self.assertTrue(all([minima, maxima, names, boundaries]))
@@ -137,7 +137,7 @@ class TestBNSPriorDict(unittest.TestCase):
                       for key in default.keys()])
         names = all([self.bns_prior_dict[key].name == default[key].name
                      for key in default.keys()])
-        boundaries = all([self.bns_prior_dict[key].periodic_boundary == default[key].periodic_boundary
+        boundaries = all([self.bns_prior_dict[key].boundary == default[key].boundary
                           for key in default.keys()])
 
         self.assertTrue(all([minima, maxima, names, boundaries]))
diff --git a/test/prior_files/binary_black_holes.prior b/test/prior_files/binary_black_holes.prior
index 43ead070407ed2ef9cac2df5af1f51df43fe55ec..d9a9e5ebee46e96783cb718d8ccb5d869a152447 100644
--- a/test/prior_files/binary_black_holes.prior
+++ b/test/prior_files/binary_black_holes.prior
@@ -2,25 +2,25 @@
 # Note that you may wish to use more specific mass and distance parameters.
 # These commands are all known to bilby.gw.prior.
 # Lines beginning "#" are ignored.
-mass_1 = Uniform(name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
-mass_2 = Uniform(name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
+mass_1 = Uniform(name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None)
+mass_2 = Uniform(name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None)
 mass_ratio = Constraint(name='mass_ratio', minimum=0.125, maximum=1)
-# chirp_mass = Uniform(name='chirp_mass', minimum=25, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False)
-# total_mass = Uniform(name='total_mass', minimum=10, maximum=200, unit='$M_{\\odot}$', periodic_boundary=False)
-# mass_ratio = Uniform(name='mass_ratio', minimum=0.125, maximum=1, periodic_boundary=False)
-# symmetric_mass_ratio =  Uniform(name='symmetric_mass_ratio', minimum=8 / 81, maximum=0.25, periodic_boundary=False)
-a_1 = Uniform(name='a_1', minimum=0, maximum=0.8, periodic_boundary=False)
-a_2 = Uniform(name='a_2', minimum=0, maximum=0.8, periodic_boundary=False)
-tilt_1 = Sine(name='tilt_1', periodic_boundary=False)
-tilt_2 = Sine(name='tilt_2', periodic_boundary=False)
-# cos_tilt_1 = Uniform(name='cos_tilt_1', minimum=-1, maximum=1, periodic_boundary=False)
-# cos_tilt_2 = Uniform(name='cos_tilt_2', minimum=-1, maximum=1, periodic_boundary=False)
-phi_12 = Uniform(name='phi_12', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-phi_jl = Uniform(name='phi_jl', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=5e3, unit='Mpc', periodic_boundary=False)
-dec = Cosine(name='dec', periodic_boundary=False)
-ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-theta_jn = Sine(name='theta_jn', periodic_boundary=False)
-# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, periodic_boundary=False)
-psi = Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True)
-phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
+# chirp_mass = Uniform(name='chirp_mass', minimum=25, maximum=100, unit='$M_{\\odot}$', boundary=None)
+# total_mass = Uniform(name='total_mass', minimum=10, maximum=200, unit='$M_{\\odot}$', boundary=None)
+# mass_ratio = Uniform(name='mass_ratio', minimum=0.125, maximum=1, boundary=None)
+# symmetric_mass_ratio =  Uniform(name='symmetric_mass_ratio', minimum=8 / 81, maximum=0.25, boundary=None)
+a_1 = Uniform(name='a_1', minimum=0, maximum=0.8, boundary='reflective')
+a_2 = Uniform(name='a_2', minimum=0, maximum=0.8, boundary='reflective')
+tilt_1 = Sine(name='tilt_1', boundary='reflective')
+tilt_2 = Sine(name='tilt_2', boundary='reflective')
+# cos_tilt_1 = Uniform(name='cos_tilt_1', minimum=-1, maximum=1, boundary=None)
+# cos_tilt_2 = Uniform(name='cos_tilt_2', minimum=-1, maximum=1, boundary=None)
+phi_12 = Uniform(name='phi_12', minimum=0, maximum=2 * np.pi, boundary='periodic')
+phi_jl = Uniform(name='phi_jl', minimum=0, maximum=2 * np.pi, boundary='periodic')
+luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=5e3, unit='Mpc', boundary=None)
+dec = Cosine(name='dec', boundary='reflective')
+ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic')
+theta_jn = Sine(name='theta_jn', boundary='reflective')
+# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, boundary=None)
+psi = Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic')
+phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
diff --git a/test/prior_files/binary_neutron_stars.prior b/test/prior_files/binary_neutron_stars.prior
index 61bf28bb923b7831870e8ef2f7bcc10446013b5c..de0efc5e8fd7fbec220ccb2fa368cbbb1f0b7262 100644
--- a/test/prior_files/binary_neutron_stars.prior
+++ b/test/prior_files/binary_neutron_stars.prior
@@ -2,23 +2,23 @@
 # Note that you may wish to use more specific mass and distance parameters.
 # These commands are all known to bilby.gw.prior.
 # Lines beginning "#" are ignored.
-mass_1 = Uniform(name='mass_1', minimum=1, maximum=2, unit='$M_{\\odot}$', periodic_boundary=False)
-mass_2 = Uniform(name='mass_2', minimum=1, maximum=2, unit='$M_{\\odot}$', periodic_boundary=False)
+mass_1 = Uniform(name='mass_1', minimum=1, maximum=2, unit='$M_{\\odot}$', boundary=None)
+mass_2 = Uniform(name='mass_2', minimum=1, maximum=2, unit='$M_{\\odot}$', boundary=None)
 mass_ratio = Constraint(name='mass_ratio', minimum=0.125, maximum=1)
-# chirp_mass = Uniform(name='chirp_mass', minimum=0.87, maximum=1.74, unit='$M_{\\odot}$', periodic_boundary=False)
-# total_mass = Uniform(name='total_mass', minimum=2, maximum=4, unit='$M_{\\odot}$', periodic_boundary=False)
-# mass_ratio = Uniform(name='mass_ratio', minimum=0.5, maximum=1, periodic_boundary=False)
-# symmetric_mass_ratio = Uniform(name='symmetric_mass_ratio', minimum=0.22, maximum=0.25, periodic_boundary=False)
-chi_1 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_1', latex_label='$\\chi_1$', periodic_boundary=False)
-chi_2 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_2', latex_label='$\\chi_2$', periodic_boundary=False)
-luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=10, maximum=500, unit='Mpc', periodic_boundary=False)
-dec = Cosine(name='dec', periodic_boundary=False)
-ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-theta_jn = Sine(name='theta_jn', periodic_boundary=False)
-# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, periodic_boundary=False)
-psi = Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True)
-phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
-lambda_1 = Uniform(name='lambda_1', minimum=0, maximum=3000, periodic_boundary=False)
-lambda_2 = Uniform(name='lambda_2', minimum=0, maximum=3000, periodic_boundary=False)
-# lambda_tilde = Uniform(name='lambda_tilde', minimum=0, maximum=5000, periodic_boundary=False)
-# delta_lambda = Uniform(name='delta_lambda', minimum=-5000, maximum=5000, periodic_boundary=False)
+# chirp_mass = Uniform(name='chirp_mass', minimum=0.87, maximum=1.74, unit='$M_{\\odot}$', boundary=None)
+# total_mass = Uniform(name='total_mass', minimum=2, maximum=4, unit='$M_{\\odot}$', boundary=None)
+# mass_ratio = Uniform(name='mass_ratio', minimum=0.5, maximum=1, boundary=None)
+# symmetric_mass_ratio = Uniform(name='symmetric_mass_ratio', minimum=0.22, maximum=0.25, boundary=None)
+chi_1 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_1', latex_label='$\\chi_1$', boundary='reflective')
+chi_2 = bilby.gw.prior.AlignedSpin(a_prior=Uniform(0, 0.05), z_prior=Uniform(-1, 1), name='chi_2', latex_label='$\\chi_2$', boundary='reflective')
+luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=10, maximum=500, unit='Mpc', boundary=None)
+dec = Cosine(name='dec', boundary='reflective')
+ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic')
+theta_jn = Sine(name='theta_jn', boundary='reflective')
+# cos_theta_jn = Uniform(name='cos_theta_jn', minimum=-1, maximum=1, boundary=None)
+psi = Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic')
+phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
+lambda_1 = Uniform(name='lambda_1', minimum=0, maximum=3000, boundary=None)
+lambda_2 = Uniform(name='lambda_2', minimum=0, maximum=3000, boundary=None)
+# lambda_tilde = Uniform(name='lambda_tilde', minimum=0, maximum=5000, boundary=None)
+# delta_lambda = Uniform(name='delta_lambda', minimum=-5000, maximum=5000, boundary=None)
diff --git a/test/prior_test.py b/test/prior_test.py
index 209d598a89537163d4afe857177a9f1e5f6881d9..f38f7ddfd94fbb268b66e0e7a7036dbacbf54482 100644
--- a/test/prior_test.py
+++ b/test/prior_test.py
@@ -36,9 +36,9 @@ class TestPriorInstantiationWithoutOptionalPriors(unittest.TestCase):
 
     def test_base_repr(self):
         self.prior = bilby.core.prior.Prior(name='test_name', latex_label='test_label', minimum=0, maximum=1,
-                                            periodic_boundary=False)
+                                            boundary=None)
         expected_string = "Prior(name='test_name', latex_label='test_label', unit=None, minimum=0, maximum=1, " \
-                          "periodic_boundary=False)"
+                          "boundary=None)"
         self.assertEqual(expected_string, self.prior.__repr__())
 
     def test_base_prob(self):
@@ -62,8 +62,8 @@ class TestPriorInstantiationWithoutOptionalPriors(unittest.TestCase):
         self.assertFalse(self.prior.is_in_prior_range(val_below))
         self.assertFalse(self.prior.is_in_prior_range(val_above))
 
-    def test_periodic_boundary_is_false(self):
-        self.assertFalse(self.prior.periodic_boundary)
+    def test_boundary_is_none(self):
+        self.assertIsNone(self.prior.boundary)
 
 
 class TestPriorName(unittest.TestCase):
@@ -128,18 +128,18 @@ class TestPriorIsFixed(unittest.TestCase):
 class TestPriorBoundary(unittest.TestCase):
 
     def setUp(self):
-        self.prior = bilby.core.prior.Prior(periodic_boundary=False)
+        self.prior = bilby.core.prior.Prior(boundary=None)
 
     def tearDown(self):
         del self.prior
 
     def test_set_boundary_valid(self):
-        self.prior.periodic_boundary = True
-        self.assertTrue(self.prior.periodic_boundary)
+        self.prior.boundary = 'periodic'
+        self.assertEqual(self.prior.boundary, 'periodic')
 
     def test_set_boundary_invalid(self):
         with self.assertRaises(ValueError):
-            self.prior.periodic_boundary = 'else'
+            self.prior.boundary = 'else'
 
 
 class TestPriorClasses(unittest.TestCase):
@@ -512,9 +512,9 @@ class TestPriorClasses(unittest.TestCase):
 class TestPriorDict(unittest.TestCase):
 
     def setUp(self):
-        self.first_prior = bilby.core.prior.Uniform(name='a', minimum=0, maximum=1, unit='kg', periodic_boundary=False)
+        self.first_prior = bilby.core.prior.Uniform(name='a', minimum=0, maximum=1, unit='kg', boundary=None)
         self.second_prior = bilby.core.prior.PowerLaw(name='b', alpha=3, minimum=1, maximum=2, unit='m/s',
-                                                      periodic_boundary=False)
+                                                      boundary=None)
         self.third_prior = bilby.core.prior.DeltaFunction(name='c', peak=42, unit='m')
         self.priors = dict(mass=self.first_prior,
                            speed=self.second_prior,
@@ -554,38 +554,38 @@ class TestPriorDict(unittest.TestCase):
     def test_read_from_file(self):
         expected = dict(
             mass_1=bilby.core.prior.Uniform(
-                name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False),
+                name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None),
             mass_2=bilby.core.prior.Uniform(
-                name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False),
+                name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None),
             mass_ratio=bilby.core.prior.Constraint(name='mass_ratio', minimum=0.125, maximum=1, latex_label='$q$',
                                                    unit=None),
-            a_1=bilby.core.prior.Uniform(name='a_1', minimum=0, maximum=0.8, periodic_boundary=False),
-            a_2=bilby.core.prior.Uniform(name='a_2', minimum=0, maximum=0.8, periodic_boundary=False),
-            tilt_1=bilby.core.prior.Sine(name='tilt_1', periodic_boundary=False),
-            tilt_2=bilby.core.prior.Sine(name='tilt_2', periodic_boundary=False),
+            a_1=bilby.core.prior.Uniform(name='a_1', minimum=0, maximum=0.8, boundary='reflective'),
+            a_2=bilby.core.prior.Uniform(name='a_2', minimum=0, maximum=0.8, boundary='reflective'),
+            tilt_1=bilby.core.prior.Sine(name='tilt_1', boundary='reflective'),
+            tilt_2=bilby.core.prior.Sine(name='tilt_2', boundary='reflective'),
             phi_12=bilby.core.prior.Uniform(
-                name='phi_12', minimum=0, maximum=2 * np.pi, periodic_boundary=True),
+                name='phi_12', minimum=0, maximum=2 * np.pi, boundary='periodic'),
             phi_jl=bilby.core.prior.Uniform(
-                name='phi_jl', minimum=0, maximum=2 * np.pi, periodic_boundary=True),
+                name='phi_jl', minimum=0, maximum=2 * np.pi, boundary='periodic'),
             luminosity_distance=bilby.gw.prior.UniformSourceFrame(
                 name='luminosity_distance', minimum=1e2,
-                maximum=5e3, unit='Mpc', periodic_boundary=False),
-            dec=bilby.core.prior.Cosine(name='dec', periodic_boundary=False),
+                maximum=5e3, unit='Mpc', boundary=None),
+            dec=bilby.core.prior.Cosine(name='dec', boundary='reflective'),
             ra=bilby.core.prior.Uniform(
-                name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True),
-            theta_jn=bilby.core.prior.Sine(name='theta_jn', periodic_boundary=False),
-            psi=bilby.core.prior.Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True),
+                name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic'),
+            theta_jn=bilby.core.prior.Sine(name='theta_jn', boundary='reflective'),
+            psi=bilby.core.prior.Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic'),
             phase=bilby.core.prior.Uniform(
-                name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
+                name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
             )
         self.assertDictEqual(expected, self.prior_set_from_file)
 
     def test_to_file(self):
         expected = ["length = DeltaFunction(peak=42, name='c', latex_label='c', unit='m')\n",
                     "speed = PowerLaw(alpha=3, minimum=1, maximum=2, name='b', latex_label='b', "
-                    "unit='m/s', periodic_boundary=False)\n",
+                    "unit='m/s', boundary=None)\n",
                     "mass = Uniform(minimum=0, maximum=1, name='a', latex_label='a', "
-                    "unit='kg', periodic_boundary=False)\n"]
+                    "unit='kg', boundary=None)\n"]
         self.prior_set_from_dict.to_file(outdir='prior_files', label='to_file_test')
         with open('prior_files/to_file_test.prior') as f:
             for i, line in enumerate(f.readlines()):
@@ -593,7 +593,7 @@ class TestPriorDict(unittest.TestCase):
 
     def test_from_dict_with_string(self):
         string_prior = "bilby.core.prior.PowerLaw(name='b', alpha=3, minimum=1, maximum=2, unit='m/s', " \
-                       "periodic_boundary=False)"
+                       "boundary=None)"
         self.priors['speed'] = string_prior
         from_dict = bilby.core.prior.PriorDict(dictionary=self.priors)
         self.assertDictEqual(self.prior_set_from_dict, from_dict)
@@ -604,9 +604,9 @@ class TestPriorDict(unittest.TestCase):
         self.prior_set_from_dict['f'] = 'unconvertable'
         self.prior_set_from_dict.convert_floats_to_delta_functions()
         expected = dict(mass=bilby.core.prior.Uniform(name='a', minimum=0, maximum=1, unit='kg',
-                                                      periodic_boundary=False),
+                                                      boundary=None),
                         speed=bilby.core.prior.PowerLaw(name='b', alpha=3, minimum=1, maximum=2, unit='m/s',
-                                                        periodic_boundary=False),
+                                                        boundary=None),
                         length=bilby.core.prior.DeltaFunction(name='c', peak=42, unit='m'),
                         d=bilby.core.prior.DeltaFunction(peak=5),
                         e=bilby.core.prior.DeltaFunction(peak=7.3),
@@ -618,29 +618,29 @@ class TestPriorDict(unittest.TestCase):
         expected = bilby.core.prior.PriorDict(
             dict(
                 mass_1=bilby.core.prior.Uniform(
-                    name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False),
+                    name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None),
                 mass_2=bilby.core.prior.Uniform(
-                    name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', periodic_boundary=False),
+                    name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None),
                 mass_ratio=bilby.core.prior.Constraint(name='mass_ratio', minimum=0.125, maximum=1, latex_label='$q$',
                                                        unit=None),
-                a_1=bilby.core.prior.Uniform(name='a_1', minimum=0, maximum=0.8, periodic_boundary=False),
-                a_2=bilby.core.prior.Uniform(name='a_2', minimum=0, maximum=0.8, periodic_boundary=False),
-                tilt_1=bilby.core.prior.Sine(name='tilt_1', periodic_boundary=False),
-                tilt_2=bilby.core.prior.Sine(name='tilt_2', periodic_boundary=False),
+                a_1=bilby.core.prior.Uniform(name='a_1', minimum=0, maximum=0.8, boundary='reflective'),
+                a_2=bilby.core.prior.Uniform(name='a_2', minimum=0, maximum=0.8, boundary='reflective'),
+                tilt_1=bilby.core.prior.Sine(name='tilt_1', boundary='reflective'),
+                tilt_2=bilby.core.prior.Sine(name='tilt_2', boundary='reflective'),
                 phi_12=bilby.core.prior.Uniform(
-                    name='phi_12', minimum=0, maximum=2 * np.pi, periodic_boundary=True),
+                    name='phi_12', minimum=0, maximum=2 * np.pi, boundary='periodic'),
                 phi_jl=bilby.core.prior.Uniform(
-                    name='phi_jl', minimum=0, maximum=2 * np.pi, periodic_boundary=True),
+                    name='phi_jl', minimum=0, maximum=2 * np.pi, boundary='periodic'),
                 luminosity_distance=bilby.gw.prior.UniformSourceFrame(
                     name='luminosity_distance', minimum=1e2,
-                    maximum=5e3, unit='Mpc', periodic_boundary=False),
-                dec=bilby.core.prior.Cosine(name='dec', periodic_boundary=False),
+                    maximum=5e3, unit='Mpc', boundary=None),
+                dec=bilby.core.prior.Cosine(name='dec', boundary='reflective'),
                 ra=bilby.core.prior.Uniform(
-                    name='ra', minimum=0, maximum=2 * np.pi, periodic_boundary=True),
-                theta_jn=bilby.core.prior.Sine(name='theta_jn', periodic_boundary=False),
-                psi=bilby.core.prior.Uniform(name='psi', minimum=0, maximum=np.pi, periodic_boundary=True),
+                    name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic'),
+                theta_jn=bilby.core.prior.Sine(name='theta_jn', boundary='reflective'),
+                psi=bilby.core.prior.Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic'),
                 phase=bilby.core.prior.Uniform(
-                    name='phase', minimum=0, maximum=2 * np.pi, periodic_boundary=True)
+                    name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic')
             )
         )
         all_keys = set(prior_set.keys()).union(set(expected.keys()))
diff --git a/test/proposal_test.py b/test/proposal_test.py
index dc86444c455d019b8f44886d0ba6cd9c7be839e7..798f78d69b57515f00e2272c8b903ed6ee4e80d8 100644
--- a/test/proposal_test.py
+++ b/test/proposal_test.py
@@ -36,15 +36,15 @@ class TestSample(unittest.TestCase):
 class TestJumpProposal(unittest.TestCase):
 
     def setUp(self):
-        self.priors = prior.PriorDict(dict(reflecting=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=False),
-                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=True),
+        self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'),
+                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'),
                                            default=prior.Uniform(minimum=-0.5, maximum=1)))
-        self.sample_above = dict(reflecting=1.1, periodic=1.1, default=1.1)
-        self.sample_below = dict(reflecting=-0.6, periodic=-0.6, default=-0.6)
-        self.sample_way_above_case1 = dict(reflecting=272, periodic=272, default=272)
-        self.sample_way_above_case2 = dict(reflecting=270.1, periodic=270.1, default=270.1)
-        self.sample_way_below_case1 = dict(reflecting=-274, periodic=-274.1, default=-274)
-        self.sample_way_below_case2 = dict(reflecting=-273.1, periodic=-273.1, default=-273.1)
+        self.sample_above = dict(reflective=1.1, periodic=1.1, default=1.1)
+        self.sample_below = dict(reflective=-0.6, periodic=-0.6, default=-0.6)
+        self.sample_way_above_case1 = dict(reflective=272, periodic=272, default=272)
+        self.sample_way_above_case2 = dict(reflective=270.1, periodic=270.1, default=270.1)
+        self.sample_way_below_case1 = dict(reflective=-274, periodic=-274.1, default=-274)
+        self.sample_way_below_case2 = dict(reflective=-273.1, periodic=-273.1, default=-273.1)
         self.jump_proposal = proposal.JumpProposal(priors=self.priors)
 
     def tearDown(self):
@@ -61,9 +61,9 @@ class TestJumpProposal(unittest.TestCase):
         self.jump_proposal.log_j = 2.3
         self.assertEqual(2.3, self.jump_proposal.log_j)
 
-    def test_boundary_above_reflecting(self):
+    def test_boundary_above_reflective(self):
         new_sample = self.jump_proposal(self.sample_above)
-        self.assertAlmostEqual(0.9, new_sample['reflecting'])
+        self.assertAlmostEqual(0.9, new_sample['reflective'])
 
     def test_boundary_above_periodic(self):
         new_sample = self.jump_proposal(self.sample_above)
@@ -71,11 +71,11 @@ class TestJumpProposal(unittest.TestCase):
 
     def test_boundary_above_default(self):
         new_sample = self.jump_proposal(self.sample_above)
-        self.assertAlmostEqual(0.9, new_sample['default'])
+        self.assertAlmostEqual(1.1, new_sample['default'])
 
-    def test_boundary_below_reflecting(self):
+    def test_boundary_below_reflective(self):
         new_sample = self.jump_proposal(self.sample_below)
-        self.assertAlmostEqual(-0.4, new_sample['reflecting'])
+        self.assertAlmostEqual(-0.4, new_sample['reflective'])
 
     def test_boundary_below_periodic(self):
         new_sample = self.jump_proposal(self.sample_below)
@@ -83,27 +83,27 @@ class TestJumpProposal(unittest.TestCase):
 
     def test_boundary_below_default(self):
         new_sample = self.jump_proposal(self.sample_below)
-        self.assertAlmostEqual(-0.4, new_sample['default'])
+        self.assertAlmostEqual(-0.6, new_sample['default'])
 
-    def test_boundary_way_below_reflecting_case1(self):
+    def test_boundary_way_below_reflective_case1(self):
         new_sample = self.jump_proposal(self.sample_way_below_case1)
-        self.assertAlmostEqual(0.0, new_sample['reflecting'])
+        self.assertAlmostEqual(0.0, new_sample['reflective'])
 
-    def test_boundary_way_below_reflecting_case2(self):
+    def test_boundary_way_below_reflective_case2(self):
         new_sample = self.jump_proposal(self.sample_way_below_case2)
-        self.assertAlmostEqual(-0.1, new_sample['reflecting'])
+        self.assertAlmostEqual(-0.1, new_sample['reflective'])
 
     def test_boundary_way_below_periodic(self):
         new_sample = self.jump_proposal(self.sample_way_below_case2)
         self.assertAlmostEqual(-0.1, new_sample['periodic'])
 
-    def test_boundary_way_above_reflecting_case1(self):
+    def test_boundary_way_above_reflective_case1(self):
         new_sample = self.jump_proposal(self.sample_way_above_case1)
-        self.assertAlmostEqual(0.0, new_sample['reflecting'])
+        self.assertAlmostEqual(0.0, new_sample['reflective'])
 
-    def test_boundary_way_above_reflecting_case2(self):
+    def test_boundary_way_above_reflective_case2(self):
         new_sample = self.jump_proposal(self.sample_way_above_case2)
-        self.assertAlmostEqual(0.1, new_sample['reflecting'])
+        self.assertAlmostEqual(0.1, new_sample['reflective'])
 
     def test_boundary_way_above_periodic(self):
         new_sample = self.jump_proposal(self.sample_way_above_case2)
@@ -116,8 +116,8 @@ class TestJumpProposal(unittest.TestCase):
 class TestNormJump(unittest.TestCase):
 
     def setUp(self):
-        self.priors = prior.PriorDict(dict(reflecting=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=True),
-                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=False),
+        self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'),
+                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'),
                                            default=prior.Uniform(minimum=-0.5, maximum=1)))
         self.jump_proposal = proposal.NormJump(step_size=3.0, priors=self.priors)
 
@@ -135,17 +135,17 @@ class TestNormJump(unittest.TestCase):
     def test_jump_proposal_call(self):
         with mock.patch("numpy.random.normal") as m:
             m.return_value = 0.5
-            sample = proposal.Sample(dict(reflecting=0.0, periodic=0.0, default=0.0))
+            sample = proposal.Sample(dict(reflective=0.0, periodic=0.0, default=0.0))
             new_sample = self.jump_proposal(sample)
-            expected = proposal.Sample(dict(reflecting=0.5, periodic=0.5, default=0.5))
+            expected = proposal.Sample(dict(reflective=0.5, periodic=0.5, default=0.5))
             self.assertDictEqual(expected, new_sample)
 
 
 class TestEnsembleWalk(unittest.TestCase):
 
     def setUp(self):
-        self.priors = prior.PriorDict(dict(reflecting=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=False),
-                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=True),
+        self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'),
+                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'),
                                            default=prior.Uniform(minimum=-0.5, maximum=1)))
         self.jump_proposal = proposal.EnsembleWalk(random_number_generator=random.random,
                                                    n_points=4, priors=self.priors)
@@ -165,8 +165,8 @@ class TestEnsembleWalk(unittest.TestCase):
         self.assertEqual(random.random, self.jump_proposal.random_number_generator)
 
     def test_get_center_of_mass(self):
-        samples = [proposal.Sample(dict(reflecting=0.1*i, periodic=0.1*i, default=0.1*i)) for i in range(3)]
-        expected = proposal.Sample(dict(reflecting=0.1, periodic=0.1, default=0.1))
+        samples = [proposal.Sample(dict(reflective=0.1*i, periodic=0.1*i, default=0.1*i)) for i in range(3)]
+        expected = proposal.Sample(dict(reflective=0.1, periodic=0.1, default=0.1))
         actual = self.jump_proposal.get_center_of_mass(samples)
         for key in samples[0].keys():
             self.assertAlmostEqual(expected[key], actual[key])
@@ -174,11 +174,11 @@ class TestEnsembleWalk(unittest.TestCase):
     def test_jump_proposal_call(self):
         with mock.patch('random.sample') as m:
             self.jump_proposal.random_number_generator = lambda: 2
-            m.return_value = [proposal.Sample(dict(periodic=0.3, reflecting=0.3, default=0.3)),
-                              proposal.Sample(dict(periodic=0.1, reflecting=0.1, default=0.1))]
-            sample = proposal.Sample(dict(periodic=0.1, reflecting=0.1, default=0.1))
+            m.return_value = [proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)),
+                              proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))]
+            sample = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))
             new_sample = self.jump_proposal(sample, coordinates=None)
-            expected = proposal.Sample(dict(periodic=0.1, reflecting=0.1, default=0.1))
+            expected = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))
             for key, value in new_sample.items():
                 self.assertAlmostEqual(expected[key], value)
 
@@ -186,8 +186,8 @@ class TestEnsembleWalk(unittest.TestCase):
 class TestEnsembleEnsembleStretch(unittest.TestCase):
 
     def setUp(self):
-        self.priors = prior.PriorDict(dict(reflecting=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=False),
-                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=True),
+        self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'),
+                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'),
                                            default=prior.Uniform(minimum=-0.5, maximum=1)))
         self.jump_proposal = proposal.EnsembleStretch(scale=3.0, priors=self.priors)
 
@@ -205,14 +205,14 @@ class TestEnsembleEnsembleStretch(unittest.TestCase):
     def test_jump_proposal_call(self):
         with mock.patch('random.choice') as m:
             with mock.patch('random.uniform') as n:
-                second_sample = proposal.Sample(dict(periodic=0.3, reflecting=0.3, default=0.3))
+                second_sample = proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3))
                 random_number = 0.5
                 m.return_value = second_sample
                 n.return_value = random_number
-                sample = proposal.Sample(dict(periodic=0.1, reflecting=0.1, default=0.1))
+                sample = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))
                 new_sample = self.jump_proposal(sample, coordinates=None)
                 coords = 0.3 - 0.2 * np.exp(random_number * np.log(self.jump_proposal.scale))
-                expected = proposal.Sample(dict(periodic=coords, reflecting=coords, default=coords))
+                expected = proposal.Sample(dict(periodic=coords, reflective=coords, default=coords))
                 for key, value in new_sample.items():
                     self.assertAlmostEqual(expected[key], value)
 
@@ -223,9 +223,9 @@ class TestEnsembleEnsembleStretch(unittest.TestCase):
                     m1.return_value = 1
                     m2.return_value = 1
                     m3.return_value = 1
-                    coordinates = [proposal.Sample(dict(periodic=0.3, reflecting=0.3, default=0.3)),
-                                   proposal.Sample(dict(periodic=0.3, reflecting=0.3, default=0.3))]
-                    sample = proposal.Sample(dict(periodic=0.2, reflecting=0.2, default=0.2))
+                    coordinates = [proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)),
+                                   proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3))]
+                    sample = proposal.Sample(dict(periodic=0.2, reflective=0.2, default=0.2))
                     self.jump_proposal(sample=sample,
                                        coordinates=coordinates)
                     self.assertEqual(3, self.jump_proposal.log_j)
@@ -234,8 +234,8 @@ class TestEnsembleEnsembleStretch(unittest.TestCase):
 class TestDifferentialEvolution(unittest.TestCase):
 
     def setUp(self):
-        self.priors = prior.PriorDict(dict(reflecting=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=False),
-                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=True),
+        self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'),
+                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'),
                                            default=prior.Uniform(minimum=-0.5, maximum=1)))
         self.jump_proposal = proposal.DifferentialEvolution(sigma=1e-3, mu=0.5, priors=self.priors)
 
@@ -257,11 +257,11 @@ class TestDifferentialEvolution(unittest.TestCase):
     def test_jump_proposal_call(self):
         with mock.patch('random.sample') as m:
             with mock.patch('random.gauss') as n:
-                m.return_value = proposal.Sample(dict(periodic=0.2, reflecting=0.2, default=0.2)),\
-                                 proposal.Sample(dict(periodic=0.3, reflecting=0.3, default=0.3))
+                m.return_value = proposal.Sample(dict(periodic=0.2, reflective=0.2, default=0.2)),\
+                                 proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3))
                 n.return_value = 1
-                sample = proposal.Sample(dict(periodic=0.1, reflecting=0.1, default=0.1))
-                expected = proposal.Sample(dict(periodic=0.2, reflecting=0.2, default=0.2))
+                sample = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))
+                expected = proposal.Sample(dict(periodic=0.2, reflective=0.2, default=0.2))
                 new_sample = self.jump_proposal(sample, coordinates=None)
                 for key, value in new_sample.items():
                     self.assertAlmostEqual(expected[key], value)
@@ -270,8 +270,8 @@ class TestDifferentialEvolution(unittest.TestCase):
 class TestEnsembleEigenVector(unittest.TestCase):
 
     def setUp(self):
-        self.priors = prior.PriorDict(dict(reflecting=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=False),
-                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, periodic_boundary=True),
+        self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'),
+                                           periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'),
                                            default=prior.Uniform(minimum=-0.5, maximum=1)))
         self.jump_proposal = proposal.EnsembleEigenVector(priors=self.priors)
 
@@ -301,8 +301,8 @@ class TestEnsembleEigenVector(unittest.TestCase):
             self.assertTrue(np.equal(np.array([[1.]]), self.jump_proposal.eigen_vectors))
 
     def test_jump_proposal_update_eigenvectors_n_d(self):
-        coordinates = [proposal.Sample(dict(periodic=0.3, reflecting=0.3, default=0.3)),
-                       proposal.Sample(dict(periodic=0.1, reflecting=0.1, default=0.1))]
+        coordinates = [proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)),
+                       proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))]
         with mock.patch('numpy.cov') as m:
             with mock.patch('numpy.linalg.eigh') as n:
                 m.side_effect = lambda x: x
@@ -324,11 +324,11 @@ class TestEnsembleEigenVector(unittest.TestCase):
                 n.return_value = 1
                 expected = proposal.Sample()
                 expected['periodic'] = 0.2
-                expected['reflecting'] = 0.5
+                expected['reflective'] = 0.5
                 expected['default'] = 0.8
                 sample = proposal.Sample()
                 sample['periodic'] = 0.1
-                sample['reflecting'] = 0.1
+                sample['reflective'] = 0.1
                 sample['default'] = 0.1
                 new_sample = self.jump_proposal(sample, coordinates=None)
                 for key, value in new_sample.items():
@@ -338,8 +338,8 @@ class TestEnsembleEigenVector(unittest.TestCase):
 class TestSkyLocationWanderJump(unittest.TestCase):
 
     def setUp(self):
-        self.priors = prior.PriorDict(dict(ra=prior.Uniform(minimum=0.0, maximum=2*np.pi, periodic_boundary=True),
-                                           dec=prior.Uniform(minimum=0.0, maximum=np.pi, periodic_boundary=False)))
+        self.priors = prior.PriorDict(dict(ra=prior.Uniform(minimum=0.0, maximum=2*np.pi, boundary='periodic'),
+                                           dec=prior.Uniform(minimum=0.0, maximum=np.pi, boundary='reflective')))
         self.jump_proposal = bilby.gw.sampler.proposal.SkyLocationWanderJump(priors=self.priors)
 
     def tearDown(self):
diff --git a/test/sampler_test.py b/test/sampler_test.py
index f299d23476eec3cbf48cec5db6200432caf31677..8f58b70dca460ac46949e2d810b8f2847dc7719a 100644
--- a/test/sampler_test.py
+++ b/test/sampler_test.py
@@ -133,8 +133,8 @@ class TestDynesty(unittest.TestCase):
     def setUp(self):
         self.likelihood = MagicMock()
         self.priors = bilby.core.prior.PriorDict()
-        self.priors['a'] = bilby.core.prior.Prior(periodic_boundary=True)
-        self.priors['b'] = bilby.core.prior.Prior(periodic_boundary=False)
+        self.priors['a'] = bilby.core.prior.Prior(boundary='periodic')
+        self.priors['b'] = bilby.core.prior.Prior(boundary='reflective')
         self.sampler = bilby.core.sampler.Dynesty(self.likelihood, self.priors,
                                                   outdir='outdir', label='label',
                                                   use_ratio=False, plot=False,
@@ -156,7 +156,7 @@ class TestDynesty(unittest.TestCase):
                         logl_max=np.inf, add_live=True, print_progress=True, save_bounds=False,
                         walks=20, update_interval=600, print_func='func')
         self.sampler.kwargs['print_func'] = 'func'  # set this manually as this is not testable otherwise
-        self.assertListEqual([0], self.sampler.kwargs['periodic'])  # Check this separately
+        self.assertListEqual([0, 1], self.sampler.kwargs['periodic'])  # Check this separately
         self.sampler.kwargs['periodic'] = None  # The dict comparison can't handle lists
         for key in self.sampler.kwargs.keys():
             print(key)
@@ -165,7 +165,7 @@ class TestDynesty(unittest.TestCase):
         self.assertDictEqual(expected, self.sampler.kwargs)
 
     def test_translate_kwargs(self):
-        expected = dict(bound='multi', sample='rwalk', periodic=[0], verbose=True,
+        expected = dict(bound='multi', sample='rwalk', periodic=[0, 1], verbose=True,
                         check_point_delta_t=600, nlive=1000, first_update=None,
                         npdim=None, rstate=None, queue_size=None, pool=None,
                         use_pool=None, live_points=None, logl_args=None, logl_kwargs=None,
@@ -394,8 +394,8 @@ class TestPymultinest(unittest.TestCase):
     def setUp(self):
         self.likelihood = MagicMock()
         self.priors = bilby.core.prior.PriorDict()
-        self.priors['a'] = bilby.core.prior.Prior(periodic_boundary=True)
-        self.priors['b'] = bilby.core.prior.Prior(periodic_boundary=False)
+        self.priors['a'] = bilby.core.prior.Prior(boundary='periodic')
+        self.priors['b'] = bilby.core.prior.Prior(boundary='reflective')
         self.sampler = bilby.core.sampler.Pymultinest(self.likelihood, self.priors,
                                                       outdir='outdir', label='label',
                                                       use_ratio=False, plot=False,
@@ -458,8 +458,8 @@ class TestRunningSamplers(unittest.TestCase):
             self.x, self.y, self.model, self.sigma)
 
         self.priors = bilby.core.prior.PriorDict()
-        self.priors['m'] = bilby.core.prior.Uniform(0, 5, periodic_boundary=False)
-        self.priors['c'] = bilby.core.prior.Uniform(-2, 2, periodic_boundary=False)
+        self.priors['m'] = bilby.core.prior.Uniform(0, 5, boundary='reflective')
+        self.priors['c'] = bilby.core.prior.Uniform(-2, 2, boundary='reflective')
         bilby.core.utils.check_directory_exists_and_if_not_mkdir('outdir')
 
     def tearDown(self):
@@ -511,8 +511,8 @@ class TestRunningSamplers(unittest.TestCase):
     def test_run_PTMCMCSampler(self):
         _ = bilby.run_sampler(
             likelihood=self.likelihood, priors=self.priors,
-            sampler= 'PTMCMCsampler', Niter=101, burn =2,
-            isave = 100 ,save=False)
+            sampler='PTMCMCsampler', Niter=101, burn=2,
+            isave=100, save=False)
 
 
 if __name__ == '__main__':