Index: sasmodels/convert.py
===================================================================
--- sasmodels/convert.py	(revision 44bd2be361a937362169e016a821f398577e4661)
+++ sasmodels/convert.py	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
@@ -15,5 +15,6 @@
     'be_polyelectrolyte',
     'correlation_length',
-    'binary_hard_sphere'
+    'binary_hard_sphere',
+    'fractal_core_shell'
 ]
 
Index: sasmodels/models/core_shell_sphere.c
===================================================================
--- sasmodels/models/core_shell_sphere.c	(revision edc9f8d2c5449514c0206c9ed35db99d865b35b6)
+++ sasmodels/models/core_shell_sphere.c	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
@@ -5,18 +5,13 @@
 
 double Iq(double q, double radius, double thickness, double core_sld, double shell_sld, double solvent_sld) {
-    // Core first, then add in shell
-    const double core_qr = q * radius;
-    const double core_contrast = core_sld - shell_sld;
-    const double core_bes = sph_j1c(core_qr);
-    const double core_volume = 4.0 * M_PI / 3.0 * radius * radius * radius;
-    double f = core_volume * core_bes * core_contrast;
 
-    // Now the shell
-    const double shell_qr = q * (radius + thickness);
-    const double shell_contrast = shell_sld - solvent_sld;
-    const double shell_bes = sph_j1c(shell_qr);
-    const double shell_volume = 4.0 * M_PI / 3.0 * pow((radius + thickness), 3);
-    f += shell_volume * shell_bes * shell_contrast;
-    return f * f * 1.0e-4;
+
+    double intensity = core_shell_kernel(q,
+                              radius,
+                              thickness,
+                              core_sld,
+                              shell_sld,
+                              solvent_sld);
+    return intensity;
 }
 
Index: sasmodels/models/core_shell_sphere.py
===================================================================
--- sasmodels/models/core_shell_sphere.py	(revision fa8011eb0e6b527e15b594945876ee39b6a46dbd)
+++ sasmodels/models/core_shell_sphere.py	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
@@ -73,5 +73,5 @@
 # pylint: enable=bad-whitespace, line-too-long
 
-source = ["lib/sph_j1c.c", "core_shell_sphere.c"]
+source = ["lib/sph_j1c.c", "lib/core_shell.c", "core_shell_sphere.c"]
 
 demo = dict(scale=1, background=0, radius=60, thickness=10,
Index: sasmodels/models/fractal_core_shell.c
===================================================================
--- sasmodels/models/fractal_core_shell.c	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
+++ sasmodels/models/fractal_core_shell.c	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
@@ -0,0 +1,81 @@
+double form_volume(double radius, double thickness);
+
+double Iq(double q,
+          double radius,
+          double thickness,
+          double core_sld,
+          double shell_sld,
+          double solvent_sld,
+          double volfraction,
+          double frac_dim,
+          double cor_length);
+
+double Iqxy(double qx, double qy,
+            double radius,
+            double thickness,
+            double core_sld,
+            double shell_sld,
+            double solvent_sld,
+            double volfraction,
+            double frac_dim,
+            double cor_length);
+
+double form_volume(double radius, double thickness)
+{
+    return 4.0 * M_PI / 3.0 * pow((radius + thickness), 3);
+}
+
+double Iq(double q,
+          double radius,
+          double thickness,
+          double core_sld,
+          double shell_sld,
+          double solvent_sld,
+          double volfraction,
+          double frac_dim,
+          double cor_length) {
+
+
+   double intensity = core_shell_kernel(q,
+                              radius,
+                              thickness,
+                              core_sld,
+                              shell_sld,
+                              solvent_sld);
+    //calculate S(q)
+    double frac_1 = frac_dim-1.0;
+    double qr = q*radius;
+
+    double t1 = frac_dim*exp(lanczos_gamma(frac_1))*sin(frac_1*atan(q*cor_length));
+    double t2 = (1.0 + 1.0/(q*cor_length)/(q*cor_length));
+    double t3 = pow(qr, frac_dim) * pow(t2, (frac_1/2.0));
+    double sq = t1/t3;
+    sq += 1.0;
+
+    return sq*intensity*volfraction;
+}
+
+double Iqxy(double qx, double qy,
+            double radius,
+            double thickness,
+            double core_sld,
+            double shell_sld,
+            double solvent_sld,
+            double volfraction,
+            double frac_dim,
+            double cor_length) {
+
+    const double q = sqrt(qx*qx+qy*qy);
+    return Iq(q,
+              radius,
+              thickness,
+              core_sld,
+              shell_sld,
+              solvent_sld,
+              volfraction,
+              frac_dim,
+              cor_length);
+
+}
+
+
Index: sasmodels/models/fractal_core_shell.py
===================================================================
--- sasmodels/models/fractal_core_shell.py	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
+++ sasmodels/models/fractal_core_shell.py	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
@@ -0,0 +1,123 @@
+r"""
+Calculates the scattering from a fractal structure with a primary building
+block of core-shell spheres, as opposed to just homogeneous spheres in
+the fractal model.
+This model could find use for aggregates of coated particles, or aggregates
+of vesicles.
+
+Definition
+----------
+
+.. math::
+
+    I(q) = \text{background} + P(q)S(q)
+
+The form factor $P(q)$ is that from core_shell model with $bkg$ = 0
+
+
+.. math::
+
+    P(q)=\frac{scale}{V_s}\left[3V_c(\rho_c-\rho_s)
+    \frac{\sin(qr_c)-qr_c\cos(qr_c)}{(qr_c)^3}+
+    3V_s(\rho_s-\rho_{solv})
+    \frac{\sin(qr_s)-qr_s\cos(qr_s)}{(qr_s)^3}\right]^2
+
+
+while the fractal structure factor $S(q)$ is
+
+.. math::
+
+    S(q) = \frac{D_f\Gamma(D_f-1)\sin((D_f-1)\tan^{-1}(q\xi))}
+    {(qr_c)^{D_f}\left(1+\frac{1}{q^2\xi ^2} \right)^{\frac{D_f-1}{2}}}
+
+where $D_f$ = frac_dim, |xi| = cor_length, $r_c$ = (core) radius, and
+$scale$ = volume fraction.
+
+The fractal structure is as documented in the fractal model.
+Polydispersity of radius and thickness is provided for.
+
+For 2D data: The 2D scattering intensity is calculated in the same way as 1D,
+where the $q$ vector is defined as
+
+.. math::
+
+    q = \sqrt{q_x^2 + q_y^2}
+
+.. figure:: img/fractal_core_shell_1d.jpg
+
+    1D plot using the default values (w/500 data point).
+
+Reference
+---------
+
+See the core_shell and fractal model descriptions
+
+"""
+
+from numpy import pi, inf
+
+name = "fractal_core_shell"
+title = ""
+description = """
+
+"""
+category = "shape-independent"
+
+# pylint: disable=bad-whitespace, line-too-long
+#   ["name", "units", default, [lower, upper], "type","description"],
+parameters = [
+    ["radius",      "Ang",        60.0, [0, inf],    "volume", "Sphere core radius"],
+    ["thickness",   "Ang",        10.0, [0, inf],    "volume", "Sphere shell thickness"],
+    ["core_sld",    "1e-6/Ang^2", 1.0,  [-inf, inf], "",       "Sphere core scattering length density"],
+    ["shell_sld",   "1e-6/Ang^2", 2.0,  [-inf, inf], "",       "Sphere shell scattering length density"],
+    ["solvent_sld", "1e-6/Ang^2", 3.0,  [-inf, inf], "",       "Solvent scattering length density"],
+    ["volfraction", "",           1.0,  [0, inf],    "",       "Volume fraction of building block spheres"],
+    ["frac_dim",    "",           2.0,  [-inf, inf], "",       "Fractal dimension"],
+    ["cor_length",  "Ang",      100.0,  [0, inf],    "",       "Correlation length of fractal-like aggregates"]]
+# pylint: enable=bad-whitespace, line-too-long
+
+source = ["lib/sph_j1c.c", "lib/lanczos_gamma.c", "lib/core_shell.c", "fractal_core_shell.c"]
+
+demo = dict(scale=0.05,
+            background=0,
+            radius=20,
+            thickness=5,
+            core_sld=3.5,
+            shell_sld=1.0,
+            solvent_sld=6.35,
+            volfraction=0.05,
+            frac_dim=2.0,
+            cor_length=100.0)
+
+oldname = 'FractalCoreShellModel'
+oldpars = {}
+
+def ER(radius, thickness):
+    """
+        Equivalent radius
+        @param radius: core radius
+        @param thickness: shell thickness
+    """
+    return radius + thickness
+
+def VR(radius, thickness):
+    """
+        Volume ratio
+        @param radius: core radius
+        @param thickness: shell thickness
+    """
+    whole = 4.0 * pi / 3.0 * pow((radius + thickness), 3)
+    core = 4.0 * pi / 3.0 * radius * radius * radius
+    return whole, whole-core
+
+tests = [[{'radius': 20.0, 'thickness': 10.0}, 'ER', 30.0],
+         [{'radius': 20.0, 'thickness': 10.0}, 'VR', 0.703703704],
+
+         # The SasView test result was 0.00169, with a background of 0.001
+         [{'radius': 60.0,
+           'thickness': 10.0,
+           'core_sld': 1.0,
+           'shell_sld': 2.0,
+           'solvent_sld': 3.0,
+           'background': 0.0
+          }, 0.4, 0.00070126]]
Index: sasmodels/models/lib/core_shell.c
===================================================================
--- sasmodels/models/lib/core_shell.c	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
+++ sasmodels/models/lib/core_shell.c	(revision 7d4b2ae2af901813f3ff60e60aa0eae98f4dfd5e)
@@ -0,0 +1,29 @@
+/*******************************************************************
+
+core_shell_kernel
+
+Form factor used in core_shell and fractal_core_shell
+
+********************************************************************/
+static
+double core_shell_kernel(double q,
+                         double radius,
+                         double thickness,
+                         double core_sld,
+                         double shell_sld,
+                         double solvent_sld) {
+    // Core first, then add in shell
+    const double core_qr = q * radius;
+    const double core_contrast = core_sld - shell_sld;
+    const double core_bes = sph_j1c(core_qr);
+    const double core_volume = 4.0 * M_PI / 3.0 * radius * radius * radius;
+    double f = core_volume * core_bes * core_contrast;
+
+    // Now the shell
+    const double shell_qr = q * (radius + thickness);
+    const double shell_contrast = shell_sld - solvent_sld;
+    const double shell_bes = sph_j1c(shell_qr);
+    const double shell_volume = 4.0 * M_PI / 3.0 * pow((radius + thickness), 3);
+    f += shell_volume * shell_bes * shell_contrast;
+    return f * f * 1.0e-4;
+}
