diff --git a/coder_sniffer/Drupal/Sniffs/Commenting/FunctionCommentSniff.php b/coder_sniffer/Drupal/Sniffs/Commenting/FunctionCommentSniff.php
index 858a8e5..c91b9f5 100644
--- a/coder_sniffer/Drupal/Sniffs/Commenting/FunctionCommentSniff.php
+++ b/coder_sniffer/Drupal/Sniffs/Commenting/FunctionCommentSniff.php
@@ -215,7 +215,15 @@ class Drupal_Sniffs_Commenting_FunctionCommentSniff implements PHP_CodeSniffer_S
                     // Check return type (can be multiple, separated by '|').
                     $typeNames      = explode('|', $type);
                     $suggestedNames = array();
+                    $hasNull = false;
+                    $hasMultiple = false;
+                    if (count($typeNames) > 0) {
+                      $hasMultiple = true;
+                    }
                     foreach ($typeNames as $i => $typeName) {
+                        if (strtolower($typeName) == 'null') {
+                          $hasNull = true;
+                        }
                         $suggestedName = $this->suggestType($typeName);
                         if (in_array($suggestedName, $suggestedNames) === false) {
                             $suggestedNames[] = $suggestedName;
@@ -246,16 +254,39 @@ class Drupal_Sniffs_Commenting_FunctionCommentSniff implements PHP_CodeSniffer_S
                         // somewhere in the function that returns something.
                         if (isset($tokens[$stackPtr]['scope_closer']) === true) {
                             $endToken    = $tokens[$stackPtr]['scope_closer'];
-                            $returnToken = $phpcsFile->findNext(T_RETURN, $stackPtr, $endToken);
-                            if ($returnToken === false) {
-                                $error = '@return doc comment specified, but function has no return statement';
-                                $phpcsFile->addError($error, $return, 'InvalidNoReturn');
-                            } else {
-                                $semicolon = $phpcsFile->findNext(T_WHITESPACE, ($returnToken + 1), null, true);
-                                if ($tokens[$semicolon]['code'] === T_SEMICOLON) {
-                                    $error = 'Function return type is not void, but function is returning void here';
-                                    $phpcsFile->addError($error, $returnToken, 'InvalidReturnNotVoid');
+                            $foundReturnToken = false;
+                            $searchStart = $stackPtr;
+                            $foundNonVoidReturn = false;
+                            do {
+                                $returnToken = $phpcsFile->findNext(T_RETURN, $searchStart, $endToken);
+                                if (!$returnToken && !$foundReturnToken) {
+                                    $error = '@return doc comment specified, but function has no return statement';
+                                    $phpcsFile->addError($error, $return, 'InvalidNoReturn');
+                                }
+                                else {
+                                  // Check for return token as the last loop after the last return
+                                  // in the function will enter this else condition
+                                  // but without the returnToken
+                                  if ($returnToken) {
+                                    $foundReturnToken = true;
+                                    $semicolon = $phpcsFile->findNext(T_WHITESPACE, ($returnToken + 1), null, true);
+                                    if ($tokens[$semicolon]['code'] === T_SEMICOLON) {
+                                        // Void return is allowed if the @return type has null in it.
+                                        if (!$hasNull) {
+                                          $error = 'Function return type is not void, but function is returning void here';
+                                          $phpcsFile->addError($error, $returnToken, 'InvalidReturnNotVoid');
+                                        }
+                                    }
+                                    else {
+                                      $foundNonVoidReturn = true;
+                                    }
+                                    $searchStart = $returnToken + 1;
+                                  }
                                 }
+                            } while ($returnToken);
+                            if (!$foundNonVoidReturn && $foundReturnToken) {
+                              $error = 'Function return type is not void, but function does not have a non-void return statement';
+                              $phpcsFile->addError($error, $return, 'InvalidReturnNotVoid');
                             }
                         }
                     }//end if
diff --git a/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc b/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc
index 1ced43c..2d528d3 100644
--- a/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc
+++ b/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc
@@ -187,3 +187,39 @@ function test15(Test $foo) {
 function test16() {
 
 }
+
+/**
+ * Void returns allowed when null is given in @return.
+ *
+ * When null is a potential return value it should be alright to have return
+ * statements with void return.
+ *
+ * @return bool|null
+ *   It should be alright to have a void return in the function.
+ */
+function test17() {
+  if (1 == 2) {
+    // This should be alright.
+    return;
+  }
+  return TRUE;
+}
+
+/**
+ * Even when null is given in @return there must be at least 1 valid return.
+ *
+ * When null is a potential return value it should be alright to have return
+ * statements with void return but this does not mean that all returns can
+ * be void. There must be at least one non-void return.
+ *
+ * @return bool|null
+ *   It should be alright to have a void return in the function.
+ */
+function test18() {
+  if (1 == 2) {
+    // This should be alright.
+    return;
+  }
+  // All the returns in the functions return void, that can't be.
+  return;
+}
diff --git a/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc.fixed b/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc.fixed
index 22ec528..30e81ae 100644
--- a/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc.fixed
+++ b/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.inc.fixed
@@ -198,3 +198,39 @@ function test15(Test $foo) {
 function test16() {
 
 }
+
+/**
+ * Void returns allowed when null is given in @return.
+ *
+ * When null is a potential return value it should be alright to have return
+ * statements with void return.
+ *
+ * @return bool|null
+ *   It should be alright to have a void return in the function.
+ */
+function test17() {
+  if (1 == 2) {
+    // This should be alright.
+    return;
+  }
+  return TRUE;
+}
+
+/**
+ * Even when null is given in @return there must be at least 1 valid return.
+ *
+ * When null is a potential return value it should be alright to have return
+ * statements with void return but this does not mean that all returns can
+ * be void. There must be at least one non-void return.
+ *
+ * @return bool|null
+ *   It should be alright to have a void return in the function.
+ */
+function test18() {
+  if (1 == 2) {
+    // This should be alright.
+    return;
+  }
+  // All the returns in the functions return void, that can't be.
+  return;
+}
diff --git a/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.php b/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.php
index 0c18bfd..4e874ff 100644
--- a/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.php
+++ b/coder_sniffer/Drupal/Test/Commenting/FunctionCommentUnitTest.php
@@ -31,6 +31,7 @@ class Drupal_Sniffs_Commenting_FunctionCommentUnitTest extends CoderSniffUnitTes
                 148 => 3,
                 180 => 1,
                 187 => 1,
+                215 => 1,
                );
 
     }//end getErrorList()
