diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp
index 2b37aa0d0f8d9743f1c9a36a4eb23844a337e88c..4738f160177b127df8c7587f8a547b0c49c77001 100644
--- a/src/pulsaranimationwidget.cpp
+++ b/src/pulsaranimationwidget.cpp
@@ -20,6 +20,9 @@
 
 #include "pulsaranimationwidget.h"
 
+// workaround for lack of C99 support in C++
+#define isnan(x) ((x) != (x))
+
 #define GL_PI 3.1415f
 const double PulsarAnimationWidget::deg2rad = PI/180.0;
 
@@ -332,7 +335,7 @@ void PulsarAnimationWidget::paintGL()
             glRotatef(-m_pulsarSpinAxisInclination, 1.0, 0.0, 0.0);
 
             glRotatef(m_pulsarRotationAngle - 90.0, 0.0, 0.0, 1.0);
-            glRotatef(-m_pulsarMagneticAxisInclination, 0.0, 1.0, 0.0);
+            glRotatef(m_pulsarMagneticAxisInclination, 0.0, 1.0, 0.0);
 
             // draw magnetic axis (for both cones)
             if(m_showRotationAxes) {
@@ -412,7 +415,7 @@ void PulsarAnimationWidget::paintGL()
             glRotatef(-m_pulsarSpinAxisInclination, 1.0, 0.0, 0.0);
 
             glRotatef(-m_pulsarRotationAngle - 90.0, 0.0, 0.0, 1.0);
-            glRotatef(-m_pulsarMagneticAxisInclination, 0.0, 1.0, 0.0);
+            glRotatef(m_pulsarMagneticAxisInclination, 0.0, 1.0, 0.0);
 
             glTranslatef(0.0, 0.0, -4.0);
 
@@ -603,7 +606,7 @@ void PulsarAnimationWidget::updateCameraPosition(const double angleH, const doub
 
     updateGL();
 
-    //	qDebug("Camera (x,y,z,+,h,v): %f, %f, %f, %f, %f, %f", m_cameraPosX, m_cameraPosY, m_cameraPosZ, zoom, angleH, angleV);
+    qDebug("Camera (x,y,z,+,h,v): %f, %f, %f, %f, %f, %f", m_cameraPosX, m_cameraPosY, m_cameraPosZ, zoom, angleH, angleV);
 }
 
 void PulsarAnimationWidget::setFramePerSecond(const unsigned int fps)
@@ -635,6 +638,8 @@ void PulsarAnimationWidget::setPulsarMagneticAxisInclination(const int degrees)
 
 void PulsarAnimationWidget::setPulsarBeamAngle(const int degrees)
 {
+    m_pulsarBeamAngle = degrees;
+
     m_pulsarBeamOuterRadius = tan(deg2rad * degrees * 0.5f) * m_pulsarBeamLength;
     m_pulsarBeamInnerRadius = m_pulsarBeamOuterRadius - m_pulsarBeamRimSize;
     if(m_pulsarBeamInnerRadius < 0.0) m_pulsarBeamInnerRadius = 0.0;
@@ -654,33 +659,30 @@ void PulsarAnimationWidget::resetParameters()
 void PulsarAnimationWidget::updatePulseProfile()
 {
     // prepare parameters (e.g. convert to radians where necessary)
-    const double    i               = deg2rad * m_pulsarSpinAxisInclination;
-    const double    y               = deg2rad * m_pulsarMagneticAxisInclination;
-    double          phiOrb          = 0.0;
     const double    deltaPhiRot     = deg2rad * 1.0;
-    const double    deltaPhiOrb     = deg2rad * deltaPhiRot;
-    const double    rp              = 0.0;
-    const double    xk              = -m_cameraPosZ;
-    const double    yk              = -m_cameraPosX;
-    const double    zk              = m_cameraPosY;
-    const double    cam             = pow(xk, 2.0) + pow(yk, 2.0) + pow(zk, 2.0);
-    const double    alpha           = deg2rad * (90.0 - m_mouseAngleH);
-    const double    delta           = deg2rad * m_mouseAngleV;
-    const double    gaussProfile    = 0.012337;
+    const double    gamma           = deg2rad * m_pulsarSpinAxisInclination;
+    const double    alpha           = deg2rad * m_pulsarMagneticAxisInclination;
+    const double    beta            = alpha - gamma;
+    const double    rho             = deg2rad * m_pulsarBeamAngle * 0.5;
+    const double    gaussProfile    = 0.04;
 
-    for(int x = 0; x < 360; ++x) {
-        // determine angle between pulsar's magnetic axis and line of sight
-        phiOrb += deltaPhiOrb;
-        const double phiRot = x * deltaPhiRot;
+    const double    t1              = pow(sin(rho*0.5), 2) - pow(sin(beta*0.5), 2);
+    const double    t2              = sin(alpha) * sin(beta+alpha);
+    const double    W               = 2 * asin(sqrt( t1 / t2 ));
 
-        double a = -sin(y) * sin(phiRot) * (xk + rp * cos(phiOrb)) \
-                   + (cos(i) * sin(y) * cos(phiRot) + sin(i) * cos(y)) * (yk + rp * sin(phiOrb)) \
-                   - (sin(i) * sin(y) * cos(phiRot) - cos(i) * cos(y)) * zk;
+    qDebug("alpha: %f, beta: %f, rho: %f, t1: %f, t2: %f, W: %f", alpha*180/PI, beta*180/PI, rho*180/PI, t1*180/PI, t2*180/PI, W*180/PI);
 
-        double b = sqrt(pow(rp,2.0) + cam - (2.0 * sqrt(cam) * rp * cos(delta) * sin(alpha + phiOrb)));
+    for(int x = 0; x < 360; ++x) {
+        // update pulsar rotation angle
+        const double phiRot = x * deltaPhiRot;
 
         // determine and store pulse amplitude
-        m_pulseProfile[x] = exp(-2.0 * (1.0 - fabs(a/b)) / gaussProfile);
+        if(!isnan(W)){
+            m_pulseProfile[x] = exp(-2.0 * pow(phiRot -W, 2) / gaussProfile) + exp(-2.0 * pow(phiRot + W - 2.0 * PI, 2) / gaussProfile);
+        }
+        else {
+            m_pulseProfile[x] = 0.0;
+        }
     }
 
     // propagate new profile
diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h
index 21b582d44d355643db41a1abec0ce55fbe611c19..91c3a65f2f1959d338cce4232c174ef8d697d46c 100644
--- a/src/pulsaranimationwidget.h
+++ b/src/pulsaranimationwidget.h
@@ -96,6 +96,7 @@ private:
     double m_pulsarSpinAxisInclination;
     double m_pulsarMagneticAxisInclination;
     double m_pulsarBeamLength;
+    double m_pulsarBeamAngle;
     double m_pulsarBeamInnerRadius;
     double m_pulsarBeamOuterRadius;
     double m_pulsarBeamRimSize;