Index: sansmodels/include/coresecondmoment.h
===================================================================
--- sansmodels/include/coresecondmoment.h	(revision cd2f75d4f567cddfd486b783bd32c6fd199619e4)
+++ sansmodels/include/coresecondmoment.h	(revision cd2f75d4f567cddfd486b783bd32c6fd199619e4)
@@ -0,0 +1,76 @@
+#if !defined(coresecondmoment_h)
+#define coresecondmoment_h
+#include "parameters.hh"
+
+/**
+ * Structure definition for sphere parameters
+ */
+ //[PYTHONCLASS] = CoreSecondMomentModel
+ //[DISP_PARAMS] = radius_core
+ //[DESCRIPTION] =<text>Calculate CoreSecondMoment Model
+ //
+ //				scale:calibration factor,
+ //				density_poly: density of the layer
+ //				sld_poly: the SLD of the layer
+ //				volf_cores: volume fraction of cores
+ //				ads_amount: adsorbed amount
+ //				second_moment: second moment of the layer
+ //				sld_solv: the SLD of the solvent
+ //				background
+ //
+ //		</text>
+ //[FIXED]=  radius_core.width
+ //[ORIENTATION_PARAMS]= <text> </text>
+
+class CoreSecondMomentModel{
+public:
+  // Model parameters
+  /// Scale factor
+  //  [DEFAULT]=scale= 1.0
+  Parameter scale;
+
+  /// Density of layer[g/cm^(3)]
+  //  [DEFAULT]=density_poly=0.7 [g/cm^(3)]
+  Parameter density_poly;
+
+  /// sld_poly [1/A^(2)]
+  //  [DEFAULT]=sld_poly= 1.5e-6 [1/A^(2)]
+  Parameter sld_poly;
+
+  /// radius_core [A]
+  //  [DEFAULT]=radius_core= 500.0 [A]
+  Parameter radius_core;
+
+  // Model parameters
+  /// volume fraction of_cores
+  //  [DEFAULT]=volf_cores= 0.14
+  Parameter volf_cores;
+
+  /// adsorbed amount [mg/m^(2)]
+  //  [DEFAULT]=ads_amount=1.9 [mg/m^(2)]
+  Parameter ads_amount;
+
+  /// sld_solv [1/A^(2)]
+  //  [DEFAULT]=sld_solv= 6.3e-6 [1/A^(2)]
+  Parameter sld_solv;
+
+  /// second_moment [A]
+  //  [DEFAULT]=second_moment=23.0 [A]
+  Parameter second_moment;
+
+ /// Incoherent Background [1/cm]
+ //  [DEFAULT]=background=0 [1/cm]
+ Parameter background;
+
+  // Constructor
+ CoreSecondMomentModel();
+
+  // Operators to get I(Q)
+  double operator()(double q);
+  double operator()(double qx, double qy);
+  double calculate_ER();
+  double evaluate_rphi(double q, double phi);
+};
+
+
+#endif
Index: sansmodels/src/c_models/c_models.cpp
===================================================================
--- sansmodels/src/c_models/c_models.cpp	(revision d9547e786c812bc1eaab873b688362cb21ecc3d1)
+++ sansmodels/src/c_models/c_models.cpp	(revision cd2f75d4f567cddfd486b783bd32c6fd199619e4)
@@ -33,4 +33,5 @@
 void addCHayterMSAStructure(PyObject *module);
 void addCCoreShellModel(PyObject *module);
+void addCCoreSecondMomentModel(PyObject *module);
 void addCCoreFourShellModel(PyObject *module);
 void addCCoreShellCylinderModel(PyObject *module);
@@ -252,4 +253,5 @@
   addCCoreShellModel(m);
   addCCoreFourShellModel(m);
+  addCCoreSecondMomentModel(m);
   addCEllipsoidModel(m);
   addCSphereModel(m);
Index: sansmodels/src/c_models/coresecondmoment.cpp
===================================================================
--- sansmodels/src/c_models/coresecondmoment.cpp	(revision cd2f75d4f567cddfd486b783bd32c6fd199619e4)
+++ sansmodels/src/c_models/coresecondmoment.cpp	(revision cd2f75d4f567cddfd486b783bd32c6fd199619e4)
@@ -0,0 +1,130 @@
+/**
+ * Scattering model classes
+ *
+ */
+
+#include <math.h>
+#include "parameters.hh"
+#include <stdio.h>
+using namespace std;
+#include "coresecondmoment.h"
+
+static double core_secondmoment_kernel(double dp[], double q) {
+  //fit parameters
+  double scale = dp[0];
+  double density_poly = dp[1];
+  double sld_poly = dp[2];
+  double radius_core = dp[3];
+  double volf_cores = dp[4];
+  double ads_amount = dp[5];
+  double second_moment = dp[6];
+  double sld_solv = dp[7];
+  double background = dp[8];
+  // Not valid for very small r
+  if (radius_core < 0.001){
+	  return 0.0;
+  }
+  //others
+  double form_factor = 0.0;
+  double x_val = 0.0;
+  //Pi
+  double pi = 4.0 * atan(1.0);
+  //relative sld
+  double contrast = sld_poly - sld_solv;
+  //x for exp
+  x_val = q*second_moment;
+  x_val *= x_val;
+  //computation
+  form_factor = contrast * ads_amount;
+  form_factor /= (q * density_poly);
+  form_factor *= form_factor;
+  form_factor *= (6.0 * pi * volf_cores * 1.0e+10);
+  form_factor /= radius_core;
+  form_factor *= exp(-x_val);
+
+  // scale and background
+  form_factor *= scale;
+  form_factor += background;
+  return (form_factor);
+}
+
+CoreSecondMomentModel :: CoreSecondMomentModel() {
+	scale = Parameter(1.0);
+	density_poly = Parameter(0.7);
+	sld_poly = Parameter(1.5e-6);
+	radius_core = Parameter(500.0, true);
+	radius_core.set_min(0.0);
+	volf_cores = Parameter(0.14);
+	ads_amount = Parameter(1.9);
+	second_moment = Parameter(23.0);
+	sld_solv   = Parameter(6.3e-6);
+	background = Parameter(0.0);
+}
+
+/**
+ * Function to evaluate 1D scattering function
+ * @param q: q-value
+ * @return: function value
+ */
+double CoreSecondMomentModel :: operator()(double q) {
+	double dp[9];
+
+	// Add the background after averaging
+	dp[0] = scale();
+	dp[1] = density_poly();
+	dp[2] = sld_poly();
+	dp[3] = radius_core();
+	dp[4] = volf_cores();
+	dp[5] = ads_amount();
+	dp[6] = second_moment();
+	dp[7] = sld_solv();
+	dp[8] = 0.0;
+
+	// Get the dispersion points for the radius
+	vector<WeightPoint> weights_rad;
+	radius_core.get_weights(weights_rad);
+
+	// Perform the computation, with all weight points
+	double sum = 0.0;
+	double norm = 0.0;
+
+	// Loop over radius weight points
+	for(size_t i=0; i<weights_rad.size(); i++) {
+		dp[3] = weights_rad[i].value;
+		//weighted sum
+		sum += weights_rad[i].weight
+			* core_secondmoment_kernel(dp, q);
+		norm += weights_rad[i].weight;
+	}
+	return sum/norm + background();
+}
+
+/**
+ * Function to evaluate 2D scattering function
+ * @param q_x: value of Q along x
+ * @param q_y: value of Q along y
+ * @return: function value
+ */
+double CoreSecondMomentModel :: operator()(double qx, double qy) {
+	double q = sqrt(qx*qx + qy*qy);
+	return (*this).operator()(q);
+}
+
+/**
+ * Function to evaluate 2D scattering function
+ * @param pars: parameters of the sphere
+ * @param q: q-value
+ * @param phi: angle phi
+ * @return: function value
+ */
+double CoreSecondMomentModel :: evaluate_rphi(double q, double phi) {
+	return (*this).operator()(q);
+}
+
+/**
+ * Function to calculate effective radius
+ * @return: effective radius value
+ */
+double CoreSecondMomentModel :: calculate_ER() {
+	return 0.0;
+}
