[DRE-commits] [ruby-gsl] 03/08: Imported Upstream version 1.16.0.6+dfsg1

Balint Reczey rbalint at moszumanska.debian.org
Mon Oct 5 16:22:14 UTC 2015


This is an automated email from the git hooks/post-receive script.

rbalint pushed a commit to branch master
in repository ruby-gsl.

commit 0349b3dc2a5873327d842e1fb7530535d06d87e8
Author: Balint Reczey <balint at balintreczey.hu>
Date:   Sun Oct 4 18:45:41 2015 +0200

    Imported Upstream version 1.16.0.6+dfsg1
---
 .gitignore                                         |   12 +
 .travis.yml                                        |   24 +
 AUTHORS                                            |    8 +
 COPYING                                            |  680 +++----
 ChangeLog                                          | 1199 +++++------
 Gemfile                                            |    4 +
 README                                             |   28 -
 README.md                                          |   77 +
 Rakefile                                           |   47 +-
 THANKS                                             |    2 +-
 examples/blas/blas.rb                              |    2 +-
 examples/bspline.rb                                |    6 +-
 examples/complex/functions.rb                      |    8 +-
 examples/complex/mul.rb                            |    2 +-
 examples/const/physconst.rb                        |    8 +-
 examples/const/travel.rb                           |    8 +-
 examples/eigen/nonsymmv.rb                         |    2 +-
 examples/eigen/qhoscillator.rb                     |    6 +-
 examples/fft/radix2.rb                             |    2 +-
 examples/fft/real-halfcomplex.rb                   |    6 +-
 examples/fft/real-halfcomplex2.rb                  |    6 +-
 examples/fit/expfit.rb                             |    2 +-
 examples/fit/multifit.rb                           |    2 +-
 examples/fit/ndlinear.rb                           |   88 +-
 examples/fit/nonlinearfit.rb                       |    2 +-
 examples/fit/wlinear.rb                            |    6 +-
 examples/function/function.rb                      |    2 +-
 examples/function/min.rb                           |    2 +-
 examples/function/synchrotron.rb                   |    4 +-
 examples/gallery/koch.rb                           |    2 +-
 examples/histogram/cauchy.rb                       |    4 +-
 examples/histogram/exponential.rb                  |    2 +-
 examples/histogram/histo3d.rb                      |    2 +-
 examples/histogram/histogram-pdf.rb                |    4 +-
 examples/histogram/xexp.rb                         |    2 +-
 examples/integration/ahmed.rb                      |    4 +-
 examples/integration/cosmology.rb                  |   14 +-
 examples/integration/friedmann.rb                  |    8 +-
 examples/integration/qng.rb                        |    2 +-
 examples/interp/demo.rb                            |    4 +-
 examples/linalg/LQ_solve.rb                        |    2 +-
 examples/linalg/LU.rb                              |    2 +-
 examples/linalg/LU2.rb                             |    2 +-
 examples/linalg/LU_narray.rb                       |    2 +-
 examples/linalg/PTLQ.rb                            |    2 +-
 examples/linalg/QRPT.rb                            |    2 +-
 examples/linalg/chol.rb                            |    2 +-
 examples/linalg/chol_narray.rb                     |    2 +-
 examples/linalg/complex.rb                         |    2 +-
 examples/math/elementary.rb                        |    2 +-
 examples/math/functions.rb                         |    2 +-
 examples/math/inf_nan.rb                           |    2 +-
 examples/math/minmax.rb                            |    2 +-
 examples/math/power.rb                             |    2 +-
 examples/math/test.rb                              |    2 +-
 examples/min.rb                                    |    2 +-
 examples/multimin/bundle.rb                        |    2 +-
 examples/multimin/cqp.rb                           |   34 +-
 examples/multiroot/fsolver3.rb                     |    2 +-
 examples/odeiv/binarysystem.rb                     |   24 +-
 examples/odeiv/demo.rb                             |    6 +-
 examples/odeiv/frei1.rb                            |   14 +-
 examples/odeiv/frei2.rb                            |    8 +-
 examples/odeiv/oscillator.rb                       |    2 +-
 examples/odeiv/sedov.rb                            |    6 +-
 examples/odeiv/whitedwarf.rb                       |   22 +-
 examples/permutation/ex1.rb                        |    4 +-
 examples/permutation/permutation.rb                |    2 +-
 examples/poly/demo.rb                              |    2 +-
 examples/random/diffusion.rb                       |    2 +-
 examples/random/generator.rb                       |    4 +-
 examples/random/randomwalk.rb                      |    6 +-
 examples/random/rng.rb                             |    2 +-
 examples/roots/bisection.rb                        |    2 +-
 examples/roots/brent.rb                            |    2 +-
 examples/roots/demo.rb                             |    2 +-
 examples/roots/newton.rb                           |    4 +-
 examples/roots/recombination.gp                    |    1 -
 examples/sf/hyperg.rb                              |    2 +-
 examples/sf/sphbessel.rb                           |    2 +-
 examples/sort/sort.rb                              |    2 +-
 examples/tamu_anova.rb                             |    8 +-
 examples/vector/add.rb                             |    2 +-
 examples/vector/decimate.rb                        |    2 +-
 examples/vector/gnuplot.rb                         |   16 +-
 examples/vector/vector.rb                          |    4 +-
 examples/wavelet/wavelet1.rb                       |    2 +-
 ext/gsl/bspline.c                                  |  130 --
 ext/gsl/const.c                                    |  672 -------
 ext/gsl/cqp.c                                      |  283 ---
 ext/gsl/fcmp.c                                     |   64 -
 ext/gsl/fresnel.c                                  |  312 ---
 ext/gsl/jacobi.c                                   |  739 -------
 ext/gsl/ool.c                                      |  879 --------
 ext/gsl/oper_complex_source.c                      |  251 ---
 ext/gsl/sf_mathieu.c                               |  238 ---
 ext/{gsl => gsl_native}/alf.c                      |   18 +-
 ext/{gsl => gsl_native}/array.c                    |  215 +-
 ext/{gsl => gsl_native}/array_complex.c            |  124 +-
 ext/{gsl => gsl_native}/blas.c                     |    0
 ext/{gsl => gsl_native}/blas1.c                    |   64 +-
 ext/{gsl => gsl_native}/blas2.c                    |  112 +-
 ext/{gsl => gsl_native}/blas3.c                    |  108 +-
 ext/{gsl => gsl_native}/block.c                    |    9 +-
 .../block_source.c => gsl_native/block_source.h}   |  220 +-
 ext/gsl_native/bspline.c                           |  122 ++
 ext/{gsl => gsl_native}/bundle.c                   |    0
 ext/{gsl => gsl_native}/cdf.c                      |  164 +-
 ext/{gsl => gsl_native}/cheb.c                     |  159 +-
 ext/{gsl => gsl_native}/combination.c              |   25 +-
 ext/{gsl => gsl_native}/common.c                   |   44 +-
 ext/{gsl => gsl_native}/complex.c                  |  228 ++-
 ext/gsl_native/const.c                             |  331 +++
 ext/{gsl => gsl_native}/const_additional.c         |   45 +-
 ext/gsl_native/cqp.c                               |  283 +++
 ext/{gsl => gsl_native}/deriv.c                    |   52 +-
 ext/{gsl => gsl_native}/dht.c                      |   48 +-
 ext/{gsl => gsl_native}/diff.c                     |   48 +-
 ext/{gsl => gsl_native}/dirac.c                    |   89 +-
 ext/{gsl => gsl_native}/eigen.c                    | 2113 ++++++++++----------
 ext/{gsl => gsl_native}/error.c                    |   26 +-
 ext/{gsl => gsl_native}/extconf.rb                 |   18 +-
 ext/{gsl => gsl_native}/fft.c                      |  390 ++--
 ext/{gsl => gsl_native}/fit.c                      |   32 +-
 ext/gsl_native/fresnel.c                           |  312 +++
 ext/{gsl => gsl_native}/function.c                 |   64 +-
 ext/{gsl => gsl_native}/geometry.c                 |   30 +-
 ext/{gsl => gsl_native}/graph.c                    |  124 +-
 ext/{gsl => gsl_native}/gsl.c                      |   33 +-
 ext/{gsl => gsl_native}/gsl_narray.c               |   39 +-
 ext/{gsl => gsl_native}/histogram.c                |  273 ++-
 ext/{gsl => gsl_native}/histogram2d.c              |  167 +-
 ext/{gsl => gsl_native}/histogram3d.c              |  144 +-
 ext/{gsl => gsl_native}/histogram3d_source.c       |  391 ++--
 ext/{gsl => gsl_native}/histogram_find.c           |   64 +-
 ext/{gsl => gsl_native}/histogram_oper.c           |   95 +-
 ext/{gsl => gsl_native}/ieee.c                     |   22 +-
 ext/{gsl => gsl_native}/include/rb_gsl.h           |    7 -
 ext/{gsl => gsl_native}/include/rb_gsl_array.h     |   40 +-
 ext/{gsl => gsl_native}/include/rb_gsl_cheb.h      |    0
 ext/{gsl => gsl_native}/include/rb_gsl_common.h    |   96 +-
 ext/{gsl => gsl_native}/include/rb_gsl_complex.h   |    0
 ext/{gsl => gsl_native}/include/rb_gsl_const.h     |    5 -
 ext/{gsl => gsl_native}/include/rb_gsl_dirac.h     |    0
 ext/{gsl => gsl_native}/include/rb_gsl_eigen.h     |    0
 ext/{gsl => gsl_native}/include/rb_gsl_fft.h       |    3 -
 ext/{gsl => gsl_native}/include/rb_gsl_fit.h       |    0
 ext/{gsl => gsl_native}/include/rb_gsl_function.h  |    0
 ext/{gsl => gsl_native}/include/rb_gsl_graph.h     |    4 +-
 ext/{gsl => gsl_native}/include/rb_gsl_histogram.h |   16 +-
 .../include/rb_gsl_histogram3d.h                   |  100 +-
 .../include/rb_gsl_integration.h                   |    0
 ext/{gsl => gsl_native}/include/rb_gsl_interp.h    |    0
 ext/{gsl => gsl_native}/include/rb_gsl_linalg.h    |    1 -
 ext/{gsl => gsl_native}/include/rb_gsl_math.h      |    4 -
 ext/{gsl => gsl_native}/include/rb_gsl_odeiv.h     |    0
 ext/{gsl => gsl_native}/include/rb_gsl_poly.h      |    6 +-
 ext/{gsl => gsl_native}/include/rb_gsl_rational.h  |    2 +-
 ext/{gsl => gsl_native}/include/rb_gsl_rng.h       |    0
 ext/{gsl => gsl_native}/include/rb_gsl_root.h      |    0
 ext/{gsl => gsl_native}/include/rb_gsl_sf.h        |   82 +-
 .../include/rb_gsl_statistics.h                    |    0
 ext/{gsl => gsl_native}/include/rb_gsl_tensor.h    |    0
 .../include/rb_gsl_with_narray.h                   |    0
 ext/{gsl => gsl_native}/include/templates_off.h    |    0
 ext/{gsl => gsl_native}/include/templates_on.h     |    2 +-
 ext/{gsl => gsl_native}/integration.c              |  343 ++--
 ext/{gsl => gsl_native}/interp.c                   |   54 +-
 ext/gsl_native/jacobi.c                            |  733 +++++++
 ext/{gsl => gsl_native}/linalg.c                   | 1024 +++++-----
 ext/{gsl => gsl_native}/linalg_complex.c           |  182 +-
 ext/{gsl => gsl_native}/math.c                     |  108 +-
 ext/{gsl => gsl_native}/matrix.c                   |   10 +-
 ext/{gsl => gsl_native}/matrix_complex.c           |  225 +--
 ext/{gsl => gsl_native}/matrix_double.c            |  151 +-
 ext/{gsl => gsl_native}/matrix_int.c               |   99 +-
 .../matrix_source.c => gsl_native/matrix_source.h} |  582 +++---
 ext/{gsl => gsl_native}/min.c                      |  117 +-
 ext/{gsl => gsl_native}/monte.c                    |  104 +-
 ext/{gsl => gsl_native}/multifit.c                 |  285 ++-
 ext/{gsl => gsl_native}/multimin.c                 |  138 +-
 ext/{gsl => gsl_native}/multimin_fsdf.c            |   30 +-
 ext/{gsl => gsl_native}/multiroots.c               |  125 +-
 ext/{gsl => gsl_native}/multiset.c                 |   10 +-
 ext/{gsl => gsl_native}/ndlinear.c                 |  641 +++---
 ext/{gsl => gsl_native}/nmf.c                      |   22 +-
 ext/{gsl => gsl_native}/nmf_wrap.c                 |    2 +-
 ext/{gsl => gsl_native}/ntuple.c                   |   26 +-
 ext/{gsl => gsl_native}/odeiv.c                    |  201 +-
 ext/gsl_native/ool.c                               |  879 ++++++++
 ext/{gsl => gsl_native}/permutation.c              |   70 +-
 ext/{gsl => gsl_native}/poly.c                     |    7 +-
 ext/{gsl => gsl_native}/poly2.c                    |   12 +-
 .../poly_source.c => gsl_native/poly_source.h}     |  507 +++--
 ext/{gsl => gsl_native}/qrng.c                     |   23 +-
 ext/{gsl => gsl_native}/randist.c                  |  461 ++---
 ext/{gsl => gsl_native}/rational.c                 |   18 +-
 ext/{gsl => gsl_native}/rng.c                      |   74 +-
 ext/{gsl => gsl_native}/root.c                     |   86 +-
 ext/{gsl => gsl_native}/sf.c                       |  360 ++--
 ext/{gsl => gsl_native}/sf_airy.c                  |    0
 ext/{gsl => gsl_native}/sf_bessel.c                |   12 +-
 ext/{gsl => gsl_native}/sf_clausen.c               |    0
 ext/{gsl => gsl_native}/sf_coulomb.c               |   78 +-
 ext/{gsl => gsl_native}/sf_coupling.c              |   58 +-
 ext/{gsl => gsl_native}/sf_dawson.c                |    0
 ext/{gsl => gsl_native}/sf_debye.c                 |    9 -
 ext/{gsl => gsl_native}/sf_dilog.c                 |    0
 ext/{gsl => gsl_native}/sf_elementary.c            |    4 +-
 ext/{gsl => gsl_native}/sf_ellint.c                |   84 +-
 ext/{gsl => gsl_native}/sf_elljac.c                |    4 +-
 ext/{gsl => gsl_native}/sf_erfc.c                  |    4 -
 ext/{gsl => gsl_native}/sf_exp.c                   |    4 +-
 ext/{gsl => gsl_native}/sf_expint.c                |   12 +-
 ext/{gsl => gsl_native}/sf_fermi_dirac.c           |    0
 ext/{gsl => gsl_native}/sf_gamma.c                 |    6 +-
 ext/{gsl => gsl_native}/sf_gegenbauer.c            |    0
 ext/{gsl => gsl_native}/sf_hyperg.c                |    0
 ext/{gsl => gsl_native}/sf_laguerre.c              |    6 +-
 ext/{gsl => gsl_native}/sf_lambert.c               |    0
 ext/{gsl => gsl_native}/sf_legendre.c              |    0
 ext/{gsl => gsl_native}/sf_log.c                   |    6 +-
 ext/gsl_native/sf_mathieu.c                        |  235 +++
 ext/{gsl => gsl_native}/sf_power.c                 |    0
 ext/{gsl => gsl_native}/sf_psi.c                   |   13 +-
 ext/{gsl => gsl_native}/sf_synchrotron.c           |    0
 ext/{gsl => gsl_native}/sf_transport.c             |    0
 ext/{gsl => gsl_native}/sf_trigonometric.c         |    6 +-
 ext/{gsl => gsl_native}/sf_zeta.c                  |    4 -
 ext/{gsl => gsl_native}/signal.c                   |  124 +-
 ext/{gsl => gsl_native}/siman.c                    |   76 +-
 ext/{gsl => gsl_native}/sort.c                     |    7 +-
 ext/{gsl => gsl_native}/spline.c                   |   68 +-
 ext/{gsl => gsl_native}/stats.c                    |  217 +-
 ext/{gsl => gsl_native}/sum.c                      |   64 +-
 ext/{gsl => gsl_native}/tamu_anova.c               |    0
 ext/{gsl => gsl_native}/tensor.c                   |    6 +-
 .../tensor_source.c => gsl_native/tensor_source.h} |  288 +--
 ext/{gsl => gsl_native}/vector.c                   |    6 +-
 ext/{gsl => gsl_native}/vector_complex.c           |  336 ++--
 ext/{gsl => gsl_native}/vector_double.c            |  341 ++--
 ext/{gsl => gsl_native}/vector_int.c               |   48 +-
 .../vector_source.c => gsl_native/vector_source.h} |  814 ++++----
 ext/{gsl => gsl_native}/wavelet.c                  |  451 ++---
 gsl.gemspec                                        |   29 +
 lib/gsl.rb                                         |    8 +-
 lib/gsl/gnuplot.rb                                 |    4 +-
 lib/gsl/version.rb                                 |    4 +-
 metadata.yml                                       |  460 ++---
 test/gsl/blas_test.rb                              |    2 +-
 test/gsl/index_test.rb                             |   61 +
 test/gsl/matrix_test.rb                            |   21 +
 uncrustify.cfg                                     | 1693 ++++++++++++++++
 253 files changed, 13417 insertions(+), 13264 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c314621
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+doc
+doc.local
+pkg
+tmp
+.gh-pages
+Makefile
+mkmf.log
+*.so
+*.o
+extconf.h
+Gemfile.lock
+*~
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..765341a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,24 @@
+language:
+  ruby
+
+rvm:
+  - 1.9
+  - 2.0
+  - 2.1
+  - 2.2
+  - ruby-head
+  - rbx-2
+
+env:
+  matrix:
+    - "NARRAY=1"
+    - ""
+
+matrix:
+  allow_failures:
+    - rvm: ruby-head
+    - rvm: rbx-2
+
+before_install:
+  - sudo apt-get update -qq
+  - sudo apt-get install -y libgsl0-dev
diff --git a/AUTHORS b/AUTHORS
index ac6bea9..359b27b 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -4,3 +4,11 @@ David MacMahon
   davidm at astro.berkeley.edu
 Jens Wille
   jens.wille at gmail.com
+Daniel Mendler
+  mail at daniel-mendler.de
+Sameer Deshmukh
+  sameer.deshmukh93 at gmail.com
+John Woods
+  john.o.woods at gmail.com
+Daniel Mendler
+  mail at daniel-mendler.de
diff --git a/COPYING b/COPYING
index a43ea21..e8bd143 100644
--- a/COPYING
+++ b/COPYING
@@ -1,339 +1,341 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                          675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-	Appendix: How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) 19yy  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) 19yy name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+= License for Ruby/GSL
+
+                      GNU GENERAL PUBLIC LICENSE
+                         Version 2, June 1991
+
+   Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                            675 Mass Ave, Cambridge, MA 02139, USA
+   Everyone is permitted to copy and distribute verbatim copies
+   of this license document, but changing it is not allowed.
+
+                              Preamble
+
+    The licenses for most software are designed to take away your
+  freedom to share and change it.  By contrast, the GNU General Public
+  License is intended to guarantee your freedom to share and change free
+  software--to make sure the software is free for all its users.  This
+  General Public License applies to most of the Free Software
+  Foundation's software and to any other program whose authors commit to
+  using it.  (Some other Free Software Foundation software is covered by
+  the GNU Library General Public License instead.)  You can apply it to
+  your programs, too.
+
+    When we speak of free software, we are referring to freedom, not
+  price.  Our General Public Licenses are designed to make sure that you
+  have the freedom to distribute copies of free software (and charge for
+  this service if you wish), that you receive source code or can get it
+  if you want it, that you can change the software or use pieces of it
+  in new free programs; and that you know you can do these things.
+
+    To protect your rights, we need to make restrictions that forbid
+  anyone to deny you these rights or to ask you to surrender the rights.
+  These restrictions translate to certain responsibilities for you if you
+  distribute copies of the software, or if you modify it.
+
+    For example, if you distribute copies of such a program, whether
+  gratis or for a fee, you must give the recipients all the rights that
+  you have.  You must make sure that they, too, receive or can get the
+  source code.  And you must show them these terms so they know their
+  rights.
+
+    We protect your rights with two steps: (1) copyright the software, and
+  (2) offer you this license which gives you legal permission to copy,
+  distribute and/or modify the software.
+
+    Also, for each author's protection and ours, we want to make certain
+  that everyone understands that there is no warranty for this free
+  software.  If the software is modified by someone else and passed on, we
+  want its recipients to know that what they have is not the original, so
+  that any problems introduced by others will not reflect on the original
+  authors' reputations.
+
+    Finally, any free program is threatened constantly by software
+  patents.  We wish to avoid the danger that redistributors of a free
+  program will individually obtain patent licenses, in effect making the
+  program proprietary.  To prevent this, we have made it clear that any
+  patent must be licensed for everyone's free use or not licensed at all.
+
+    The precise terms and conditions for copying, distribution and
+  modification follow.
+  

+                      GNU GENERAL PUBLIC LICENSE
+     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+    0. This License applies to any program or other work which contains
+  a notice placed by the copyright holder saying it may be distributed
+  under the terms of this General Public License.  The "Program", below,
+  refers to any such program or work, and a "work based on the Program"
+  means either the Program or any derivative work under copyright law:
+  that is to say, a work containing the Program or a portion of it,
+  either verbatim or with modifications and/or translated into another
+  language.  (Hereinafter, translation is included without limitation in
+  the term "modification".)  Each licensee is addressed as "you".
+
+  Activities other than copying, distribution and modification are not
+  covered by this License; they are outside its scope.  The act of
+  running the Program is not restricted, and the output from the Program
+  is covered only if its contents constitute a work based on the
+  Program (independent of having been made by running the Program).
+  Whether that is true depends on what the Program does.
+
+    1. You may copy and distribute verbatim copies of the Program's
+  source code as you receive it, in any medium, provided that you
+  conspicuously and appropriately publish on each copy an appropriate
+  copyright notice and disclaimer of warranty; keep intact all the
+  notices that refer to this License and to the absence of any warranty;
+  and give any other recipients of the Program a copy of this License
+  along with the Program.
+
+  You may charge a fee for the physical act of transferring a copy, and
+  you may at your option offer warranty protection in exchange for a fee.
+
+    2. You may modify your copy or copies of the Program or any portion
+  of it, thus forming a work based on the Program, and copy and
+  distribute such modifications or work under the terms of Section 1
+  above, provided that you also meet all of these conditions:
+
+      a) You must cause the modified files to carry prominent notices
+      stating that you changed the files and the date of any change.
+
+      b) You must cause any work that you distribute or publish, that in
+      whole or in part contains or is derived from the Program or any
+      part thereof, to be licensed as a whole at no charge to all third
+      parties under the terms of this License.
+
+      c) If the modified program normally reads commands interactively
+      when run, you must cause it, when started running for such
+      interactive use in the most ordinary way, to print or display an
+      announcement including an appropriate copyright notice and a
+      notice that there is no warranty (or else, saying that you provide
+      a warranty) and that users may redistribute the program under
+      these conditions, and telling the user how to view a copy of this
+      License.  (Exception: if the Program itself is interactive but
+      does not normally print such an announcement, your work based on
+      the Program is not required to print an announcement.)
+  

+  These requirements apply to the modified work as a whole.  If
+  identifiable sections of that work are not derived from the Program,
+  and can be reasonably considered independent and separate works in
+  themselves, then this License, and its terms, do not apply to those
+  sections when you distribute them as separate works.  But when you
+  distribute the same sections as part of a whole which is a work based
+  on the Program, the distribution of the whole must be on the terms of
+  this License, whose permissions for other licensees extend to the
+  entire whole, and thus to each and every part regardless of who wrote it.
+
+  Thus, it is not the intent of this section to claim rights or contest
+  your rights to work written entirely by you; rather, the intent is to
+  exercise the right to control the distribution of derivative or
+  collective works based on the Program.
+
+  In addition, mere aggregation of another work not based on the Program
+  with the Program (or with a work based on the Program) on a volume of
+  a storage or distribution medium does not bring the other work under
+  the scope of this License.
+
+    3. You may copy and distribute the Program (or a work based on it,
+  under Section 2) in object code or executable form under the terms of
+  Sections 1 and 2 above provided that you also do one of the following:
+
+      a) Accompany it with the complete corresponding machine-readable
+      source code, which must be distributed under the terms of Sections
+      1 and 2 above on a medium customarily used for software interchange; or,
+
+      b) Accompany it with a written offer, valid for at least three
+      years, to give any third party, for a charge no more than your
+      cost of physically performing source distribution, a complete
+      machine-readable copy of the corresponding source code, to be
+      distributed under the terms of Sections 1 and 2 above on a medium
+      customarily used for software interchange; or,
+
+      c) Accompany it with the information you received as to the offer
+      to distribute corresponding source code.  (This alternative is
+      allowed only for noncommercial distribution and only if you
+      received the program in object code or executable form with such
+      an offer, in accord with Subsection b above.)
+
+  The source code for a work means the preferred form of the work for
+  making modifications to it.  For an executable work, complete source
+  code means all the source code for all modules it contains, plus any
+  associated interface definition files, plus the scripts used to
+  control compilation and installation of the executable.  However, as a
+  special exception, the source code distributed need not include
+  anything that is normally distributed (in either source or binary
+  form) with the major components (compiler, kernel, and so on) of the
+  operating system on which the executable runs, unless that component
+  itself accompanies the executable.
+
+  If distribution of executable or object code is made by offering
+  access to copy from a designated place, then offering equivalent
+  access to copy the source code from the same place counts as
+  distribution of the source code, even though third parties are not
+  compelled to copy the source along with the object code.
+  

+    4. You may not copy, modify, sublicense, or distribute the Program
+  except as expressly provided under this License.  Any attempt
+  otherwise to copy, modify, sublicense or distribute the Program is
+  void, and will automatically terminate your rights under this License.
+  However, parties who have received copies, or rights, from you under
+  this License will not have their licenses terminated so long as such
+  parties remain in full compliance.
+
+    5. You are not required to accept this License, since you have not
+  signed it.  However, nothing else grants you permission to modify or
+  distribute the Program or its derivative works.  These actions are
+  prohibited by law if you do not accept this License.  Therefore, by
+  modifying or distributing the Program (or any work based on the
+  Program), you indicate your acceptance of this License to do so, and
+  all its terms and conditions for copying, distributing or modifying
+  the Program or works based on it.
+
+    6. Each time you redistribute the Program (or any work based on the
+  Program), the recipient automatically receives a license from the
+  original licensor to copy, distribute or modify the Program subject to
+  these terms and conditions.  You may not impose any further
+  restrictions on the recipients' exercise of the rights granted herein.
+  You are not responsible for enforcing compliance by third parties to
+  this License.
+
+    7. If, as a consequence of a court judgment or allegation of patent
+  infringement or for any other reason (not limited to patent issues),
+  conditions are imposed on you (whether by court order, agreement or
+  otherwise) that contradict the conditions of this License, they do not
+  excuse you from the conditions of this License.  If you cannot
+  distribute so as to satisfy simultaneously your obligations under this
+  License and any other pertinent obligations, then as a consequence you
+  may not distribute the Program at all.  For example, if a patent
+  license would not permit royalty-free redistribution of the Program by
+  all those who receive copies directly or indirectly through you, then
+  the only way you could satisfy both it and this License would be to
+  refrain entirely from distribution of the Program.
+
+  If any portion of this section is held invalid or unenforceable under
+  any particular circumstance, the balance of the section is intended to
+  apply and the section as a whole is intended to apply in other
+  circumstances.
+
+  It is not the purpose of this section to induce you to infringe any
+  patents or other property right claims or to contest validity of any
+  such claims; this section has the sole purpose of protecting the
+  integrity of the free software distribution system, which is
+  implemented by public license practices.  Many people have made
+  generous contributions to the wide range of software distributed
+  through that system in reliance on consistent application of that
+  system; it is up to the author/donor to decide if he or she is willing
+  to distribute software through any other system and a licensee cannot
+  impose that choice.
+
+  This section is intended to make thoroughly clear what is believed to
+  be a consequence of the rest of this License.
+  

+    8. If the distribution and/or use of the Program is restricted in
+  certain countries either by patents or by copyrighted interfaces, the
+  original copyright holder who places the Program under this License
+  may add an explicit geographical distribution limitation excluding
+  those countries, so that distribution is permitted only in or among
+  countries not thus excluded.  In such case, this License incorporates
+  the limitation as if written in the body of this License.
+
+    9. The Free Software Foundation may publish revised and/or new versions
+  of the General Public License from time to time.  Such new versions will
+  be similar in spirit to the present version, but may differ in detail to
+  address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the Program
+  specifies a version number of this License which applies to it and "any
+  later version", you have the option of following the terms and conditions
+  either of that version or of any later version published by the Free
+  Software Foundation.  If the Program does not specify a version number of
+  this License, you may choose any version ever published by the Free Software
+  Foundation.
+
+    10. If you wish to incorporate parts of the Program into other free
+  programs whose distribution conditions are different, write to the author
+  to ask for permission.  For software which is copyrighted by the Free
+  Software Foundation, write to the Free Software Foundation; we sometimes
+  make exceptions for this.  Our decision will be guided by the two goals
+  of preserving the free status of all derivatives of our free software and
+  of promoting the sharing and reuse of software generally.
+
+                              NO WARRANTY
+
+    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+  FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+  OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+  PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+  OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+  TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+  PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+  REPAIR OR CORRECTION.
+
+    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+  WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+  REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+  INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+  OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+  TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+  YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+  PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+  POSSIBILITY OF SUCH DAMAGES.
+
+                       END OF TERMS AND CONDITIONS
+  

+          Appendix: How to Apply These Terms to Your New Programs
+
+    If you develop a new program, and you want it to be of the greatest
+  possible use to the public, the best way to achieve this is to make it
+  free software which everyone can redistribute and change under these terms.
+
+    To do so, attach the following notices to the program.  It is safest
+  to attach them to the start of each source file to most effectively
+  convey the exclusion of warranty; and each file should have at least
+  the "copyright" line and a pointer to where the full notice is found.
+
+      <one line to give the program's name and a brief idea of what it does.>
+      Copyright (C) 19yy  <name of author>
+
+      This program is free software; you can redistribute it and/or modify
+      it under the terms of the GNU General Public License as published by
+      the Free Software Foundation; either version 2 of the License, or
+      (at your option) any later version.
+
+      This program is distributed in the hope that it will be useful,
+      but WITHOUT ANY WARRANTY; without even the implied warranty of
+      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+      GNU General Public License for more details.
+
+      You should have received a copy of the GNU General Public License
+      along with this program; if not, write to the Free Software
+      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+  Also add information on how to contact you by electronic and paper mail.
+
+  If the program is interactive, make it output a short notice like this
+  when it starts in an interactive mode:
+
+      Gnomovision version 69, Copyright (C) 19yy name of author
+      Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+      This is free software, and you are welcome to redistribute it
+      under certain conditions; type `show c' for details.
+
+  The hypothetical commands `show w' and `show c' should show the appropriate
+  parts of the General Public License.  Of course, the commands you use may
+  be called something other than `show w' and `show c'; they could even be
+  mouse-clicks or menu items--whatever suits your program.
+
+  You should also get your employer (if you work as a programmer) or your
+  school, if any, to sign a "copyright disclaimer" for the program, if
+  necessary.  Here is a sample; alter the names:
+
+    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+    `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+    <signature of Ty Coon>, 1 April 1989
+    Ty Coon, President of Vice
+
+  This General Public License does not permit incorporating your program into
+  proprietary programs.  If your program is a subroutine library, you may
+  consider it more useful to permit linking proprietary applications with the
+  library.  If this is what you want to do, use the GNU Library General
+  Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
index 91761f4..30b5563 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,117 +1,129 @@
-Fri Dec 19 2014
-  * Ruby/GSL 1.16.0.4
-    * Optimize and extract multiplication and division operations on Fixnum
-      and Float. Pull request #8 by Veselin Vasilev.
-    * Fixed division in GSL::Oper for GSL::Vector::Col. Issue #9.
-
-Tue Oct 21 2014
-  * Ruby/GSL 1.16.0.3
-    * Fixed RDoc issues. Issue #6 by @bigtunacan.
-    * Fixed $LOAD_PATH problem. Pull request #7 by Takahiro SATOH.
-
-Wed Jul  9 2014
-  * Ruby/GSL 1.16.0.2
-    * Fixed linking problem.
-
-Thu Apr 24 2014
-  * Ruby/GSL 1.16.0.1
-    * Extensive cleanup.
-    * Fixed linking problems.
-    * Required Ruby version >= 1.8.7.
-
-Fri Jan 24 2014
-  * Ruby/GSL 1.16.0
-    * GSL-1.16 support.
-
-Fri Jan 24 2014
-  * Ruby/GSL 1.15.3.2
-    * Windows compatibility.
-    * Ruby 2.x compatibility.
-    * Ported tests to Test::Unit.
-    * Silenced compilation warnings.
-    * Switched to rake-compiler for compilation.
-
-Sat Feb 26 2011
-  * Ruby/GSL 1.14.7
-    * Fix conversion of non-DFLOAT NArray to GSL::Vector and
-      GSL::Vector::Complex.
-
-Thu Feb 24 2011
-  * Ruby/GSL 1.14.6
-    * Add Vector::Complex support to NArray conversions
-    * Raise exception when trying to create View from NArray object of
-      incompatible type.
-
-Sun Nov 14 2010
-  * Ruby/GSL 1.14.5
-    * Convert docs from rdtool to rdoc
-    * Fix object id handling bugs on 64-bit systems
-    * Fix Vector's handling of Range parameters
-
-Wed Sep 29 2010
-  * Modification for ruby-1.9.2
-    * Replaced STR2CSTR to StringValuePtr
-
-Mon Mar 22 2010
-  * GSL-1.14 support
-    * Added GSL::Multiset class
-    * Added GSL::Function#glfixed(a, b table)
-
-Sun Aug 16 2009
-  * Added Non-negative Matrix Factorization (NMF) support (by Roman Shterenzon)
-
-Sat Aug  8 2009
-  * Added GSL-1.13 features:
-    * Added GSL::Monte::Miser#params_get, GSL::Monte::Vegas#params_get
-    * Added GSL::BSpline::greville_abscissa(i)
-    * Added GSL::Poly#eval_derivs(x)
-    * Added a new minimization algorithm "quad_golden"
-    * Added a new multimin algorithm "nmsimplex2rand"
-
-Tue Jun  9 2009
-  * Fixed bug in linalg.c (bug [#25842])
-
-Thu Feb  2 2009
-  * Fixed a bug in GSL::Histogram.alloc_uniform() (bug [#23040])
-  * Fixed a bug in GSL::Vector#/ (bug [#23334])
-
-Thu Nov  6 2008
-  * Match with the tensor extension version 0.99
-    * now not compatible for the versions older than tensor-0.97.
-
-Sat Jul 26 2008
-  * GSL::Poly.eval now handles complex numbers (GSL-1.11)
-  * Added new quasi-random generators "halton" and "reversehalton"
-  * Added a module function GSL::MultiFit::linear_residuals() (GSL-1.11)
-  * Fixed a bug in ODE solver
-
-Mon Jun 30 2008
-  * Fixed GSL::Vector#normalize (#20865)
-
-Mon May 26 2008
-  * Fixed a bug in GSL::Matrix::to_v (#19757)
-  * Fixed a bug in GSL::Vector::Int multiplication (#19924)
-
-Sat Dec  8 2007
-  * Version 1.10.3
-
-Tue Dec  2 2007
-  * Improved GSL::Vector#get for a Range arg
-  * Improved GSL::Vector#concat for an Array arg
-  * Fixed a bug in GSL::Matrix.alloc with column vector arguments
-
-Thu Dec  2 2007
-  * Added methods GSL::Vector#pow(p), GSL::Vector#pow!(p)
-
-Wed Oct 17 2007
-  * Fixed a bug in poly_source.c
-
-Sun Oct  7 2007
-  * Version 1.10.0
-  * ndlinear extension support
-
-Sat Sep 22 2007
-  Added GSL-1.10 features
+# markup: rd
+
+== Thu Jul 03 2015
+* Ruby/GSL 1.16.0.6
+  * rb-gsl and gsl are now the same gem
+
+== Thu Jul 02 2015
+* Ruby/GSL 1.16.0.5
+  * Optional narray support
+  * Drop Ruby 1.8 support
+  * Drop support for GSL < 1.15
+
+== Fri Dec 19 2014
+* Ruby/GSL 1.16.0.4
+  * Optimize and extract multiplication and division operations on Fixnum
+    and Float. Pull request #8 by Veselin Vasilev.
+  * Fixed division in GSL::Oper for GSL::Vector::Col. Issue #9.
+
+== Tue Oct 21 2014
+* Ruby/GSL 1.16.0.3
+  * Fixed RDoc issues. Issue #6 by @bigtunacan.
+  * Fixed $LOAD_PATH problem. Pull request #7 by Takahiro SATOH.
+
+== Wed Jul  9 2014
+* Ruby/GSL 1.16.0.2
+  * Fixed linking problem.
+
+== Thu Apr 24 2014
+* Ruby/GSL 1.16.0.1
+  * Extensive cleanup.
+  * Fixed linking problems.
+  * Required Ruby version >= 1.8.7.
+
+== Fri Jan 24 2014
+* Ruby/GSL 1.16.0
+  * GSL-1.16 support.
+
+== Fri Jan 24 2014
+* Ruby/GSL 1.15.3.2
+  * Windows compatibility.
+  * Ruby 2.x compatibility.
+  * Ported tests to Test::Unit.
+  * Silenced compilation warnings.
+  * Switched to rake-compiler for compilation.
+
+== Sat Feb 26 2011
+* Ruby/GSL 1.14.7
+  * Fix conversion of non-DFLOAT NArray to GSL::Vector and
+    GSL::Vector::Complex.
+
+== Thu Feb 24 2011
+* Ruby/GSL 1.14.6
+  * Add Vector::Complex support to NArray conversions
+  * Raise exception when trying to create View from NArray object of
+    incompatible type.
+
+== Sun Nov 14 2010
+* Ruby/GSL 1.14.5
+  * Convert docs from rdtool to rdoc
+  * Fix object id handling bugs on 64-bit systems
+  * Fix Vector's handling of Range parameters
+
+== Wed Sep 29 2010
+* Modification for ruby-1.9.2
+  * Replaced STR2CSTR to StringValuePtr
+
+== Mon Mar 22 2010
+* GSL-1.14 support
+  * Added GSL::Multiset class
+  * Added GSL::Function#glfixed(a, b table)
+
+== Sun Aug 16 2009
+* Added Non-negative Matrix Factorization (NMF) support (by Roman Shterenzon)
+
+== Sat Aug  8 2009
+* Added GSL-1.13 features:
+  * Added GSL::Monte::Miser#params_get, GSL::Monte::Vegas#params_get
+  * Added GSL::BSpline::greville_abscissa(i)
+  * Added GSL::Poly#eval_derivs(x)
+  * Added a new minimization algorithm "quad_golden"
+  * Added a new multimin algorithm "nmsimplex2rand"
+
+== Tue Jun  9 2009
+* Fixed bug in linalg.c (bug [#25842])
+
+== Thu Feb  2 2009
+* Fixed a bug in GSL::Histogram.alloc_uniform() (bug [#23040])
+* Fixed a bug in GSL::Vector#/ (bug [#23334])
+
+== Thu Nov  6 2008
+* Match with the tensor extension version 0.99
+  * now not compatible for the versions older than tensor-0.97.
+
+== Sat Jul 26 2008
+* GSL::Poly.eval now handles complex numbers (GSL-1.11)
+* Added new quasi-random generators "halton" and "reversehalton"
+* Added a module function GSL::MultiFit::linear_residuals() (GSL-1.11)
+* Fixed a bug in ODE solver
+
+== Mon Jun 30 2008
+* Fixed GSL::Vector#normalize (#20865)
+
+== Mon May 26 2008
+* Fixed a bug in GSL::Matrix::to_v (#19757)
+* Fixed a bug in GSL::Vector::Int multiplication (#19924)
+
+== Sat Dec  8 2007
+* Version 1.10.3
+
+== Tue Dec  2 2007
+* Improved GSL::Vector#get for a Range arg
+* Improved GSL::Vector#concat for an Array arg
+* Fixed a bug in GSL::Matrix.alloc with column vector arguments
+
+== Thu Dec  2 2007
+* Added methods GSL::Vector#pow(p), GSL::Vector#pow!(p)
+
+== Wed Oct 17 2007
+* Fixed a bug in poly_source.c
+
+== Sun Oct  7 2007
+* Version 1.10.0
+* ndlinear extension support
+
+== Sat Sep 22 2007
+* Added GSL-1.10 features
   * Added generalized eigensystem methods
   * Added method GSL::Stats::correlation(v1, v2) to compute
     Pearson correlation of two datasets
@@ -125,476 +137,489 @@ Sat Sep 22 2007
     and GSL::Linalg::Chomplex::Cholesky::svx
   * Added method GSL::hypot3(x, y, z)
 
-Sat Aug 11 2007
-  * Modified ext/extconf.rb: Check gsl_stats_correlation()
-
-Sun Aug  5 2007
-  * Improved GSL::Vector::filescan()
-Tue May 15 2007
-  * Fixed a bug in Vector#get (Thank to Daigo Moriwaki)
-
-Sun Feb 18 2007
-	* Completed GSL-1.8.90 features
-		* Change names "unsymm" ---> "nonsymm" for non-symmetric eigen systems
-		* Added Mathieu functions
-		* Added Vector#ispos, isneg
-		* Added knuthran2002 generator
-		* Added a new minimization method GSL::MultiMin::FdfMinimizer::BFGS2
-
-Sun Dec 31 2006
-  * Remove the module function GSL::equal?, which breaks the Ruby policy.
-
-Sun Dec 24 2006
-	* Added Basis splines
-  * CQP and Bundle extentions support
-
-Wed Dec 13 2006
-  * OOL extension support (OOL version 0.2)
-    * OOL: Open Optimization Library
-
-Mon Dec 11 2006
-  * Add a quasi-random sequence generator hdsobol
-    (require the qrngextra extension)
-
-Tue Sep 26 2006
-	* Fixed a bug in GSL::Vector#*
-
-Sun Sep 24 2006
-	* Fixed a bug in GSL::Matrix.vandermonde()
-	* Added methods GSL::Vector#join, zip, cumsum, cumprod
-
-Thu Sep 21 2006
-	* Added methods to calculate eigenvectors of nonsymmetric matrices
-	* Added test scripts tests/eigen/unsymm.rb, tests/eigen/unsymmv.rb
-
-Wed Aug 23 2006
-	* Added methods to calculate eigenvalues of nonsymmetric matrices
-
-Fri Aug 18 2006
-	* Fixed bug in Sf::hypot
-
-Sat Apr 29 2006
-	* Applied patch provided by Cameron McBride, to fix a bug in
-		randist.c
-	* Applied patched by zunda to fix some test/ scripts.
-
-Thu Apr 13 2006
-	* Version 1.8.0
-	* Added cumulative distribution functions under the module GSL::Cdf:
-		binomial, poisson, geometric, negative binomial, pascal and hypergeometric.
-	* Added module functions GSL::Cdf::beta_Pinv, beta_Qinv, fdist_Pinv, and
-		fdist_Qinv.
-	* Added the multilinear fit estimator function GSL::MultiFit::linear_est.
-	* Added new random variate generators,
-		GSL::Ran::gaussian_ziggurat and gamma_mt.
-	* Added Debye functions for n=5 and n=6, as
-		GSL::Sf::debye_5 and debye_6.
-	* Added GSL::Spline#min_size
-	* Added the Debye unit to physical constants.
-
-Fri Dec  2 2005
-	* Singleton method "new" ---> "alloc"
-
-Sun Nov 27 2005
-	* Apply patch by zunda to improve multifit.
-	* Fix bug in dirac.c
-
-Tue Apr  3 JST 2005
-	* Added Vector#collect!, Matrix#collect!
-	* Added lib/rbgsl.rb, in which the GSL module is not included by default
-
-Wed Apr 27 2005
-	* The following Linalg methods now can handle NArray objects:
-		* GSL::Linalg::
-			* LU.decomp(m)
-			* LU.solve(lu, b)
-			* LU.svx(lu, bx)
-			* LU.det(lu, sign)
-			* LU.lndet(lu)
-			* LU.invert(lu, perm)
-			* QR.decomp(m)
-			* QR.solve(qr, tau, b)
-			* QR.svx(qr, tau, bx)
-			* SV.decomp(m)
-			* SV.solve(u, v, s, b)
-			* SV.svx(u, v, s, bx)
-			* Cholesky.decomp(m)
-			* Cholesky.solve(u, v, s, b)
-			* Cholesky.svx(u, v, s, bx)
-			* HH.solve(m, b)
-			* HH.svx(m, bx)
-
-Mon Apr 18 2005
-  * Improved gsl_narray.c (thanks to T. Horinouchi)
-	* Modified extconf.rb
-		* Automatic finding of NArray
-	* Applied a patch by zunda
-
-Thu Apr  7 2005
-	* Modified extconf.rb
-
-Mon Mar 21 2005
-	* Version 1.6.2
-
-Sat Mar 19 2005
-	* Fixed Blas.dgemm, .zgemm
-	* Fixed method re-definitions
-
-Tue Mar 15 2005
-	* Added class GSL::Block::Byte, GSL::Block::Index
-	* Added NArray-like methods, Vector#eq, ne, gt, where, any? etc.
-	* Added methods Vector#floor, Vector#ceil,
-		and Vector#round (if the system has)
-
-Sat Mar 12 2005
-	* Fixed Vector#get
-
-Sat Feb 26 2005
-	* Ruby 1.9.0 support
-
-Sat Feb  5 2005
-	* Version 1.6.1
-
-Wed Jan 26 2005
-	* Added in-place FFT methods
-        * Fixed FFT document
-
-Thu Jan 20 2005
-	* Added Vector#decimate, Vector#diff
-	* Added Matrix#rot90
-	* Fixed Matrix::Complex
-
-Thu Jan 06 2005
-	* Some methods which receive GSL::Vector now can also manipulate
-		NArray objects.
-		* Special functions
-		* Probability distributions
-		* Statistics
-		* FFTs
-		* Wavelet transforms
-		* Interpolations
-		* Serices accelerations
-	* Added method Vector#decimate
-	* Sf::exp now can receive Complex or Vector::Complex
-
-Tue Jan 04
-	* Version 1.6.0
-
-Thu Dec 30 2004 Yoshiki Tsunesada
-	* Update for GSL-1.5.90
-			* Added Sf::psi_1
-		* Added ODE stepper rk2simp
-		* Added LQ, PTLQ decompositions
-		* Added methods Cdf::exppow_P, Cdf::exppow_Q
-
-Mon Dec 27 2004 Yoshiki Tsunesada
-	* All Ruby/GSL classes are defined as derivatives of the base class
-	GSL::Object.
-	* Defined the method GSL::Object#info
-	* Added Vector#histogram
-	* Added Vector.filescan
-	* Modified the methods Histogram#increment, accumulate
-	* Added methods Poly.fit, Poly.wfit, MultiFit.polyfit
-	* Added methods Vector::Complex#abs2, abs, arg
-	* Modified FFT methods: now they return FFTed data as a new vector,
-		and do not destroy the input vector.
-
-Sat Dec 11 2004 Yoshiki Tsunesada
-	* Modified Histogram#integral
-
-Fri Dec 10 2004 Yoshiki Tsunesada
-	* Added methods Histogram#reverse, Histogram2d#integrate,
-	Histogram2d#normalize
-
-Mon Dec  6 2004 Yoshiki Tsunesada
-	* Version 1.5.4
-
-Fri Dec  3 2004 Yoshiki Tsunesada
-	* Added Histogram#rebin
-
-Fri Nov 26 2004 Yoshiki Tsunesada
-	* Added method Vector#to_m
-	* Added methods Matrix#reverse_rows, Matrix#reverse_columns
-
-Tue Nov 16 2004 Yoshiki Tsunesada
-	* The method Matrix#** is now obsolete, use "*"
-          for matrix multiplication instead.
-	* Improved Matrix#* and Vetor#*
-	* Added methods Vector#to_m_diagonal, Vector#to_m_circulant,
-	Vector#collect
-	* Added methods Matrix.hilbert, Matrix.invhilbert, Matrix.pascal,
-		Matrix.vandermonde, Matrix.toeplitz, Matrix.circulant
-	* Added methods Vector.indgen, Vector#indgen,
-		Matrix.indgen, Matrix#indgen (mimics NArray)
-	* Added class GSL::Histogram3d
-	* Checked GSL lower version compatibilities
-		* gsl-1.0 ~ gsl-1.5: OK
-		* gsl-0.9.4: OK
-		* gsl-0.9.3 or older: not tested
-		* gsl-1.6 (development version, CVS Nov2004): OK
-	
-Sun Nov  7 2004 Yoshiki Tsunesada
-	* Support the gsl_tensor package
-		* http://sources.redhat.com/ml/gsl-discuss/2004-q4/msg00053.html
-		* Added class GSL::Tensor, GSL::Tensor::Int
-	* The methods Vector#get, Vector#[] now receive multiple
-		arguments, or an Array, or a Range object.
-
-Thu Nov  4 2004 Yoshiki Tsunesada
-	* Added class GSL::Histogram::Integral, which represents the
-		cumulative distribution.
-	* Added method GSL::Histogram#integrate, which creates a
-		GSL::Histogram::Integral object.
-	* Added methods GSL::Histogram2d#xproject, yproject, normalize, increment2.
-
-Sun Oct 31 2004 Yoshiki Tsunesada
-	* Fix the document for Polynomials
-	* Added methods Poly::hermite(n), Poly::cheb(n), and Poly::cheb_II(n) etc..
-	* Added method Poly#compan, which returns the companion matrix.
-	* The method Matrix#/ is improved: if a Vector is given, this method
-		solves the linear system.
-
-Mon Oct 25 2004 Yoshiki Tsunesada
-        * Split the source file "randist.c" into "randist.c" and "cdf.c"
-        * Split the source file "diff.c" into "diff.c" and "deriv.c"
-	* Split the source file "interp.c" into "interp.c" and "spline.c"
-	* Added methods Vector#abs, sqrt, square, normalize
-	* Added sample scripts odeiv/frei1.rb, fft/frei2.rb
-		and eigen/qhoscillator.rb, which deal with quantum mechanical
-		calculations. These are translated from the C++ code in the
-		Harald Wiedemann's textbook "Numerische Physik"
-		(Springer 2004, ISBN 3-540-40774-X).
-		
-Sat Oct 23 2004 Yoshiki Tsunesada
-        * Added a method GSL::Vector#logspace2. The following two are
-		equivalent:
-			 v1 = Vector.logspace(1, 3, 5)
-			 v2 = Vector.logspace2(10, 1000, 5)
-
-Tue Oct 19 2004 Yoshiki Tsunesada
-        * Support the rngextra package
-		* http://www.network-theory.co.uk/download/rngextra/
-          * Added two random number generators "rngextra_rng1" and "rngextra_rng2"
-        * Fixed a bug in the method Vector#subvector_with_stride
-
-Mon Oct 18 2004 Yoshiki Tsunesada
-        * Added a sample script dht.rb
-
-Fri Oct  8 2004 Yoshiki Tsunesada
-        * Version 1.5.3
-
-Thu Oct  7 2004 Yoshiki Tsunesada
-        * The methods Vector.graph and GSL::graph improved.
-	* Added sample scripts of special functions and probability distribution
-		functions.
-
-Sat Oct  2 2004 Yoshiki Tsunesada
-        * Discrete wavelet transform (experimental)
-        * Presently this is only for CVS trackers,
-          since DWT is not supported in the latest version GSL-1.5.
-        * Added methods Vector.connect, Vector#connect
-
-Thu Sep 30 2004 Yoshiki Tsunesada
-        * The methods Vector#[] and Vector#[]= accept an index of
-		negative integer. For example, v[-1] returns the last element
-		of the vector v, v[-2] does the second last, and so on.
-
-Fri Sep 24 2004 Yoshiki Tsunesada
-        * Fixed bug in Sf::legendre_Ql
-
-Wed Sep  1 2004 Yoshiki Tsunesada
-        * Version 1.5.2
-
-Fri Aug 27 2004 Yoshiki Tsunesada
-        * Experimental implementation of GNU plotutils graph and GNUPLOT interfaces
-        * Added unary minus operators for GSL::Vector, GSL::Matrix
-
-Thu Aug 19 2004 Yoshiki Tsunesada
-        * Added class GSL::Matrix::Int
-        * Correct descriptions of GSL::Matrix#get_row, get_col
-        * Changed behaviour of methods NArray#to_gv, NArray#to_gm,
-          added methods NArray#to_gv_view, NArray#to_gm_view
-
-Wed Aug 18 2004
-        * Added method GSL::set_error_handler
-
-Tue Aug 17 2004
-        * Version 1.5.1
-
-Sat Aug 14 2004 Yoshiki Tsunesada
-        * Changed behaviour of the methods Odeiv::Evolve#apply, Odeiv::Solver#apply
-        * Fixed bug in GSL::Histogram#get
-        * Fixed buf in GSL::Vector#matrix_view_with_tda
-        * Added class GSL::Vector::Int
-        * Added test suite
-
-Wed Aug 11 2004 Yoshiki Tsunesada
-        * Fixed bug in GSL::Sf::legendle_Ql_e
-        * Fixed bug in GSL::MultiFit.linear
-
-Tue Aug 10 2004 Yoshiki Tsunesada
-        * Fixed bugs in GSL::Cdf::gumbel2_P, gumbel2_Q
-        * Version 1.5.0
-
-Fri Aug  6 2004 Yoshiki Tsunesada
-        * Fixed bug in Histogram2d.new_uniform
-
-4.Aug.2004
-        * Correct source code errors in interp.c, multifit.c
-
-2.Aug.2004
-        * Added methods GSL::Vector#dot (inner product)
-        * Added classes GSL::Vector::Col < GSL::Vector,
-		GSL::Vector::Col::View < GSL::Vector::Col
-
-1.Aug.2004
-        * Version 0.9.9
-
-30.Jul.2004
-        * Added methods GSL::Rng.default_seed, GSL::Rng.default_seed=(seed)
-
-26.Jul.2004
-        * Cumulative distribution functions
-        * Changed module path GSL::Ran:: ---> GSL::Cdf
-        * Constants GSL::VERSION, GSL::RUBY_GSL_VERSION defined
-
-24.Jul.2004
-        * Experimental implementation of discrete wavelet transforms (tests/wavelet)
-
-22.Jul.2004
-        * Elementary functions as GSL::sin now can take argument of Integer, Float,
-		Array, Vector or Matrix.
-        * Strict type check
-
-20.Jul.2004
-        * Added methods GSL::heapsort, Vector#heapsort, Vector::Complex#heapsort
-        * Added methods GSL::heapsort_index, Vector#heapsort_index,
-		Vector::Complex#heapsort_index
-        * version 0.9.4
-
-18.Jul.2004
-        * Added missing functions GSL::Sf::legendre_Ql
-        * Added missing functions GSL::Sf::psi_e
-        * Added missing functions GSL::Sf::zetam1, zetam1_int
-
-17.Jul.2004
-        * Added GSL::Eigen::Symmv::sort, GSL::Eigen::Hermv::sort
-        * Update GSL::Monte
-
-15.Jul.2004
-        * Version 0.9.2
-        * Added methods Matrix#each_row, Matrix#each_col
-        * Added methods Matrix::Complex#each_row, Matrix::Complex#each_col
-        * Fixed bug in Complex::polar
-        * Fixed bug in Complex#abs, arg, abs2, logabs
-
-13.Jul.2004
-        * Added Matrix#trace, Matrix::Complex#trace
-
-11.Jul.2004
-        * version 0.9.0
-        * Householder Transformations
-        * LU decomposition for complex matrices
-        * All the GSL functions implemented.
-
-10.Jul.2004
-        * Blas level 3
-        * Fixed GSL::Vector::sort_index
-
-8.Jul.2004
-        * Correct document on random distributions
-
-7.Jul.2004
-        * Fixed bug in the method GSL::Sf::coulomb_wave_sphF_array
-
-6.Jul.2004
-       * GSL 1.5 support
-       * Fixed a bug in the method GSL::Sf::bessel_sequence_Jnu_e
-
-5.Jul.2004
-       * Compile test with -Wall option:
-         * remove unused variables, check missing prototype declarations
-       * Fixed a bug in the method GSL::Multimin::test_size (wrong binding)
-
-30.Jun.2004
-       * ver 0.4.7
-
-28.Jun.2004
-       * Switch rb_f_lambda() and rb_block_proc(), for proper ruby version.
-
-20.Jun.2004
-       * Added Linalg::balance_comlumns(A, D) and Matrix#balance_columns(D)
-       * BLAS support
-         * Level 1
-         * Level 2
-
-19.Jun.2004
-       * Support gsl-1.4.90
-         * Added Stefan-Boltzmann constant, Thomson scattering cross section
-         * Module Deriv
-
-13.Jun.2004
-       * Fixed a bug in the sample script integration/friedmann.rb
-       * Improved interfaces of polynomial equations
-       * Correct the document on GSL::Complex
-
-10.Jun.2004
-       * ver 0.4.2
-       * The module GSL::Math removed
-       * The module name GSL::Const is changed to GSL::CONST
-
-09.Jun.2004
-       * ver 0.4.1
-       * Add random number generators  borosh13, coveyou, fishman18,
-	 fishman20, fishman2x, knuthran, knuthran2, lecuyer21, waterman14.
-       * Correct the documentation on random number generators
-       * Add functions expint_E1_scaled,expint_E2_scaled, and others
-       * Add methods Rng::fwrite, fread
-       * Add function binomial_tpe
-
-05.Jun.2004
-       * 0.4.0
-
-02.Jun.2004
-       * rb_gc_mark
-       * Implemented simulated annealing, Ntuples
-
-25.Apr.2004
-       * Vector, Matrix, Matrix::Complex coerce
-
-24.Apr.2004 version 0.3.11
-       * GSL::Complex, coerce
-
-22.Apr.2004  version 0.3.10
-       * polish sources of special functions
-
-18.Apr.2004, version 0.3.9
-       * bug fix Eigensystems, Interpolation
-
-16.Apr.2004
-       * bug fix Vector, Matrix, Linalg
-
-14.Apr.2004, version 0.3.8
-       * N-tuples
-       * Improvement in NArray object conversions (thanks to S. Nishizawa)
-
-13.Apr.2004
-       * Poly divided-difference reporesentation, Taylor expansion
-       * Apply patch by S. Nishizawa, for type checks in C code,
-         and some modifications in sample scripts
-
-12.Apr.2004, version 0.3.7
-       * Add mathematical functions ldexp, frexp
-       * Add gsl_sf_hazard function
-       * QRng bug fix
-       * GSL::Stats module
-
-version 0.3.6 Monte-Carlo integration
-version 0.3.5 Multidimensional minimization
-version 0.3.4 Combinations, One dimensional minimization, Multidimensional
-root-finding
-version 0.3.3 Nonlinear least-squared fitting
-versoin 0.3.2 Least-squared fitting
-version 0.3.1 One dimensional root-finding
-version 0.3.0 FFTs, Ordinary differential equations
-2002 version 0.2.5
+== Sat Aug 11 2007
+* Modified ext/extconf.rb: Check gsl_stats_correlation()
+
+== Sun Aug  5 2007
+* Improved GSL::Vector::filescan()
+== Tue May 15 2007
+* Fixed a bug in Vector#get (Thank to Daigo Moriwaki)
+
+== Sun Feb 18 2007
+* Completed GSL-1.8.90 features
+  * Change names "unsymm" ---> "nonsymm" for non-symmetric eigen systems
+  * Added Mathieu functions
+  * Added Vector#ispos, isneg
+  * Added knuthran2002 generator
+  * Added a new minimization method GSL::MultiMin::FdfMinimizer::BFGS2
+
+== Sun Dec 31 2006
+* Remove the module function GSL::equal?, which breaks the Ruby policy.
+
+== Sun Dec 24 2006
+* Added Basis splines
+* CQP and Bundle extentions support
+
+== Wed Dec 13 2006
+* OOL extension support (OOL version 0.2)
+  * OOL: Open Optimization Library
+
+== Mon Dec 11 2006
+* Add a quasi-random sequence generator hdsobol
+  (require the qrngextra extension)
+
+== Tue Sep 26 2006
+* Fixed a bug in GSL::Vector#*
+
+== Sun Sep 24 2006
+* Fixed a bug in GSL::Matrix.vandermonde()
+* Added methods GSL::Vector#join, zip, cumsum, cumprod
+
+== Thu Sep 21 2006
+* Added methods to calculate eigenvectors of nonsymmetric matrices
+* Added test scripts tests/eigen/unsymm.rb, tests/eigen/unsymmv.rb
+
+== Wed Aug 23 2006
+* Added methods to calculate eigenvalues of nonsymmetric matrices
+
+== Fri Aug 18 2006
+* Fixed bug in Sf::hypot
+
+== Sat Apr 29 2006
+* Applied patch provided by Cameron McBride, to fix a bug in
+  randist.c
+* Applied patched by zunda to fix some test/ scripts.
+
+== Thu Apr 13 2006
+* Version 1.8.0
+  * Added cumulative distribution functions under the module GSL::Cdf:
+    binomial, poisson, geometric, negative binomial, pascal and hypergeometric.
+  * Added module functions GSL::Cdf::beta_Pinv, beta_Qinv, fdist_Pinv, and
+    fdist_Qinv.
+  * Added the multilinear fit estimator function GSL::MultiFit::linear_est.
+  * Added new random variate generators,
+    GSL::Ran::gaussian_ziggurat and gamma_mt.
+  * Added Debye functions for n=5 and n=6, as
+    GSL::Sf::debye_5 and debye_6.
+  * Added GSL::Spline#min_size
+  * Added the Debye unit to physical constants.
+
+== Fri Dec  2 2005
+* Singleton method "new" ---> "alloc"
+
+== Sun Nov 27 2005
+* Apply patch by zunda to improve multifit.
+* Fix bug in dirac.c
+
+== Tue Apr  3 JST 2005
+* Added Vector#collect!, Matrix#collect!
+* Added lib/rbgsl.rb, in which the GSL module is not included by default
+
+== Wed Apr 27 2005
+* The following Linalg methods now can handle NArray objects:
+  * GSL::Linalg::
+    * LU.decomp(m)
+    * LU.solve(lu, b)
+    * LU.svx(lu, bx)
+    * LU.det(lu, sign)
+    * LU.lndet(lu)
+    * LU.invert(lu, perm)
+    * QR.decomp(m)
+    * QR.solve(qr, tau, b)
+    * QR.svx(qr, tau, bx)
+    * SV.decomp(m)
+    * SV.solve(u, v, s, b)
+    * SV.svx(u, v, s, bx)
+    * Cholesky.decomp(m)
+    * Cholesky.solve(u, v, s, b)
+    * Cholesky.svx(u, v, s, bx)
+    * HH.solve(m, b)
+    * HH.svx(m, bx)
+
+== Mon Apr 18 2005
+* Improved gsl_narray.c (thanks to T. Horinouchi)
+* Modified extconf.rb
+  * Automatic finding of NArray
+* Applied a patch by zunda
+
+== Thu Apr  7 2005
+* Modified extconf.rb
+
+== Mon Mar 21 2005
+* Version 1.6.2
+
+== Sat Mar 19 2005
+* Fixed Blas.dgemm, .zgemm
+* Fixed method re-definitions
+
+== Tue Mar 15 2005
+* Added class GSL::Block::Byte, GSL::Block::Index
+* Added NArray-like methods, Vector#eq, ne, gt, where, any? etc.
+* Added methods Vector#floor, Vector#ceil,
+  and Vector#round (if the system has)
+
+== Sat Mar 12 2005
+* Fixed Vector#get
+
+== Sat Feb 26 2005
+* Ruby 1.9.0 support
+
+== Sat Feb  5 2005
+* Version 1.6.1
+
+== Wed Jan 26 2005
+* Added in-place FFT methods
+  * Fixed FFT document
+
+== Thu Jan 20 2005
+* Added Vector#decimate, Vector#diff
+* Added Matrix#rot90
+* Fixed Matrix::Complex
+
+== Thu Jan 06 2005
+* Some methods which receive GSL::Vector now can also manipulate
+  NArray objects.
+  * Special functions
+  * Probability distributions
+  * Statistics
+  * FFTs
+  * Wavelet transforms
+  * Interpolations
+  * Serices accelerations
+* Added method Vector#decimate
+* Sf::exp now can receive Complex or Vector::Complex
+
+== Tue Jan 04
+* Version 1.6.0
+
+== Thu Dec 30 2004 Yoshiki Tsunesada
+* Update for GSL-1.5.90
+  * Added Sf::psi_1
+  * Added ODE stepper rk2simp
+  * Added LQ, PTLQ decompositions
+  * Added methods Cdf::exppow_P, Cdf::exppow_Q
+
+== Mon Dec 27 2004 Yoshiki Tsunesada
+* All Ruby/GSL classes are defined as derivatives of the base class
+  GSL::Object.
+* Defined the method GSL::Object#info
+* Added Vector#histogram
+* Added Vector.filescan
+* Modified the methods Histogram#increment, accumulate
+* Added methods Poly.fit, Poly.wfit, MultiFit.polyfit
+* Added methods Vector::Complex#abs2, abs, arg
+* Modified FFT methods: now they return FFTed data as a new vector,
+  and do not destroy the input vector.
+
+== Sat Dec 11 2004 Yoshiki Tsunesada
+* Modified Histogram#integral
+
+== Fri Dec 10 2004 Yoshiki Tsunesada
+* Added methods Histogram#reverse, Histogram2d#integrate,
+  Histogram2d#normalize
+
+== Mon Dec  6 2004 Yoshiki Tsunesada
+* Version 1.5.4
+
+== Fri Dec  3 2004 Yoshiki Tsunesada
+* Added Histogram#rebin
+
+== Fri Nov 26 2004 Yoshiki Tsunesada
+* Added method Vector#to_m
+* Added methods Matrix#reverse_rows, Matrix#reverse_columns
+
+== Tue Nov 16 2004 Yoshiki Tsunesada
+* The method Matrix#** is now obsolete, use "*"
+  for matrix multiplication instead.
+* Improved Matrix#* and Vetor#*
+* Added methods Vector#to_m_diagonal, Vector#to_m_circulant,
+  Vector#collect
+* Added methods Matrix.hilbert, Matrix.invhilbert, Matrix.pascal,
+  Matrix.vandermonde, Matrix.toeplitz, Matrix.circulant
+* Added methods Vector.indgen, Vector#indgen,
+  Matrix.indgen, Matrix#indgen (mimics NArray)
+* Added class GSL::Histogram3d
+* Checked GSL lower version compatibilities
+  * gsl-1.0 ~ gsl-1.5: OK
+  * gsl-0.9.4: OK
+  * gsl-0.9.3 or older: not tested
+  * gsl-1.6 (development version, CVS Nov2004): OK
+
+== Sun Nov  7 2004 Yoshiki Tsunesada
+* Support the gsl_tensor package
+  * http://sources.redhat.com/ml/gsl-discuss/2004-q4/msg00053.html
+  * Added class GSL::Tensor, GSL::Tensor::Int
+* The methods Vector#get, Vector#[] now receive multiple
+  arguments, or an Array, or a Range object.
+
+== Thu Nov  4 2004 Yoshiki Tsunesada
+* Added class GSL::Histogram::Integral, which represents the
+  cumulative distribution.
+* Added method GSL::Histogram#integrate, which creates a
+  GSL::Histogram::Integral object.
+* Added methods GSL::Histogram2d#xproject, yproject, normalize, increment2.
+
+== Sun Oct 31 2004 Yoshiki Tsunesada
+* Fix the document for Polynomials
+* Added methods Poly::hermite(n), Poly::cheb(n), and Poly::cheb_II(n) etc..
+* Added method Poly#compan, which returns the companion matrix.
+* The method Matrix#/ is improved: if a Vector is given, this method
+  solves the linear system.
+
+== Mon Oct 25 2004 Yoshiki Tsunesada
+* Split the source file "randist.c" into "randist.c" and "cdf.c"
+* Split the source file "diff.c" into "diff.c" and "deriv.c"
+* Split the source file "interp.c" into "interp.c" and "spline.c"
+* Added methods Vector#abs, sqrt, square, normalize
+* Added sample scripts odeiv/frei1.rb, fft/frei2.rb
+  and eigen/qhoscillator.rb, which deal with quantum mechanical
+  calculations. These are translated from the C++ code in the
+  Harald Wiedemann's textbook "Numerische Physik"
+  (Springer 2004, ISBN 3-540-40774-X).
+
+== Sat Oct 23 2004 Yoshiki Tsunesada
+* Added a method GSL::Vector#logspace2. The following two are
+  equivalent:
+     v1 = Vector.logspace(1, 3, 5)
+     v2 = Vector.logspace2(10, 1000, 5)
+
+== Tue Oct 19 2004 Yoshiki Tsunesada
+* Support the rngextra package
+  * http://www.network-theory.co.uk/download/rngextra/
+  * Added two random number generators "rngextra_rng1" and "rngextra_rng2"
+  * Fixed a bug in the method Vector#subvector_with_stride
+
+== Mon Oct 18 2004 Yoshiki Tsunesada
+* Added a sample script dht.rb
+
+== Fri Oct  8 2004 Yoshiki Tsunesada
+* Version 1.5.3
+
+== Thu Oct  7 2004 Yoshiki Tsunesada
+* The methods Vector.graph and GSL::graph improved.
+* Added sample scripts of special functions and probability distribution
+  functions.
+
+== Sat Oct  2 2004 Yoshiki Tsunesada
+* Discrete wavelet transform (experimental)
+* Presently this is only for CVS trackers,
+  since DWT is not supported in the latest version GSL-1.5.
+* Added methods Vector.connect, Vector#connect
+
+== Thu Sep 30 2004 Yoshiki Tsunesada
+* The methods Vector#[] and Vector#[]= accept an index of
+  negative integer. For example, v[-1] returns the last element
+  of the vector v, v[-2] does the second last, and so on.
+
+== Fri Sep 24 2004 Yoshiki Tsunesada
+* Fixed bug in Sf::legendre_Ql
+
+== Wed Sep  1 2004 Yoshiki Tsunesada
+* Version 1.5.2
+
+== Fri Aug 27 2004 Yoshiki Tsunesada
+* Experimental implementation of GNU plotutils graph and GNUPLOT interfaces
+* Added unary minus operators for GSL::Vector, GSL::Matrix
+
+== Thu Aug 19 2004 Yoshiki Tsunesada
+* Added class GSL::Matrix::Int
+* Correct descriptions of GSL::Matrix#get_row, get_col
+* Changed behaviour of methods NArray#to_gv, NArray#to_gm,
+  added methods NArray#to_gv_view, NArray#to_gm_view
+
+== Wed Aug 18 2004
+* Added method GSL::set_error_handler
+
+== Tue Aug 17 2004
+* Version 1.5.1
+
+== Sat Aug 14 2004 Yoshiki Tsunesada
+* Changed behaviour of the methods Odeiv::Evolve#apply, Odeiv::Solver#apply
+* Fixed bug in GSL::Histogram#get
+* Fixed buf in GSL::Vector#matrix_view_with_tda
+* Added class GSL::Vector::Int
+* Added test suite
+
+== Wed Aug 11 2004 Yoshiki Tsunesada
+* Fixed bug in GSL::Sf::legendle_Ql_e
+* Fixed bug in GSL::MultiFit.linear
+
+== Tue Aug 10 2004 Yoshiki Tsunesada
+* Fixed bugs in GSL::Cdf::gumbel2_P, gumbel2_Q
+* Version 1.5.0
+
+== Fri Aug  6 2004 Yoshiki Tsunesada
+* Fixed bug in Histogram2d.new_uniform
+
+== 4.Aug.2004
+* Correct source code errors in interp.c, multifit.c
+
+== 2.Aug.2004
+* Added methods GSL::Vector#dot (inner product)
+* Added classes GSL::Vector::Col < GSL::Vector,
+  GSL::Vector::Col::View < GSL::Vector::Col
+
+== 1.Aug.2004
+* Version 0.9.9
+
+== 30.Jul.2004
+* Added methods GSL::Rng.default_seed, GSL::Rng.default_seed=(seed)
+
+== 26.Jul.2004
+* Cumulative distribution functions
+* Changed module path GSL::Ran:: ---> GSL::Cdf
+* Constants GSL::VERSION, GSL::RUBY_GSL_VERSION defined
+
+== 24.Jul.2004
+* Experimental implementation of discrete wavelet transforms (tests/wavelet)
+
+== 22.Jul.2004
+* Elementary functions as GSL::sin now can take argument of Integer, Float,
+  Array, Vector or Matrix.
+* Strict type check
+
+== 20.Jul.2004
+* Added methods GSL::heapsort, Vector#heapsort, Vector::Complex#heapsort
+* Added methods GSL::heapsort_index, Vector#heapsort_index,
+  Vector::Complex#heapsort_index
+* version 0.9.4
+
+== 18.Jul.2004
+* Added missing functions GSL::Sf::legendre_Ql
+* Added missing functions GSL::Sf::psi_e
+* Added missing functions GSL::Sf::zetam1, zetam1_int
+
+== 17.Jul.2004
+* Added GSL::Eigen::Symmv::sort, GSL::Eigen::Hermv::sort
+* Update GSL::Monte
+
+== 15.Jul.2004
+* Version 0.9.2
+* Added methods Matrix#each_row, Matrix#each_col
+* Added methods Matrix::Complex#each_row, Matrix::Complex#each_col
+* Fixed bug in Complex::polar
+* Fixed bug in Complex#abs, arg, abs2, logabs
+
+== 13.Jul.2004
+* Added Matrix#trace, Matrix::Complex#trace
+
+== 11.Jul.2004
+* version 0.9.0
+* Householder Transformations
+* LU decomposition for complex matrices
+* All the GSL functions implemented.
+
+== 10.Jul.2004
+* Blas level 3
+* Fixed GSL::Vector::sort_index
+
+== 8.Jul.2004
+* Correct document on random distributions
+
+== 7.Jul.2004
+* Fixed bug in the method GSL::Sf::coulomb_wave_sphF_array
+
+== 6.Jul.2004
+* GSL 1.5 support
+* Fixed a bug in the method GSL::Sf::bessel_sequence_Jnu_e
+
+== 5.Jul.2004
+* Compile test with -Wall option:
+  * remove unused variables, check missing prototype declarations
+* Fixed a bug in the method GSL::Multimin::test_size (wrong binding)
+
+== 30.Jun.2004
+* ver 0.4.7
+
+== 28.Jun.2004
+* Switch rb_f_lambda() and rb_block_proc(), for proper ruby version.
+
+== 20.Jun.2004
+* Added Linalg::balance_comlumns(A, D) and Matrix#balance_columns(D)
+* BLAS support
+  * Level 1
+  * Level 2
+
+== 19.Jun.2004
+* Support gsl-1.4.90
+  * Added Stefan-Boltzmann constant, Thomson scattering cross section
+  * Module Deriv
+
+== 13.Jun.2004
+* Fixed a bug in the sample script integration/friedmann.rb
+* Improved interfaces of polynomial equations
+* Correct the document on GSL::Complex
+
+== 10.Jun.2004
+* ver 0.4.2
+* The module GSL::Math removed
+* The module name GSL::Const is changed to GSL::CONST
+
+== 09.Jun.2004
+* ver 0.4.1
+* Add random number generators  borosh13, coveyou, fishman18,
+  fishman20, fishman2x, knuthran, knuthran2, lecuyer21, waterman14.
+* Correct the documentation on random number generators
+* Add functions expint_E1_scaled,expint_E2_scaled, and others
+* Add methods Rng::fwrite, fread
+* Add function binomial_tpe
+
+== 05.Jun.2004
+* 0.4.0
+
+== 02.Jun.2004
+* rb_gc_mark
+* Implemented simulated annealing, Ntuples
+
+== 25.Apr.2004
+* Vector, Matrix, Matrix::Complex coerce
+
+== 24.Apr.2004 version 0.3.11
+* GSL::Complex, coerce
+
+== 22.Apr.2004  version 0.3.10
+* polish sources of special functions
+
+== 18.Apr.2004, version 0.3.9
+* bug fix Eigensystems, Interpolation
+
+== 16.Apr.2004
+* bug fix Vector, Matrix, Linalg
+
+== 14.Apr.2004, version 0.3.8
+* N-tuples
+* Improvement in NArray object conversions (thanks to S. Nishizawa)
+
+== 13.Apr.2004
+* Poly divided-difference reporesentation, Taylor expansion
+* Apply patch by S. Nishizawa, for type checks in C code,
+  and some modifications in sample scripts
+
+== 12.Apr.2004, version 0.3.7
+* Add mathematical functions ldexp, frexp
+* Add gsl_sf_hazard function
+* QRng bug fix
+* GSL::Stats module
+
+== version 0.3.6
+* Monte-Carlo integration
+
+== version 0.3.5
+* Multidimensional minimization
+
+== version 0.3.4
+* Combinations, One dimensional minimization, Multidimensional root-finding
+
+== version 0.3.3
+* Nonlinear least-squared fitting
+
+== versoin 0.3.2
+* Least-squared fitting
+
+== version 0.3.1
+* One dimensional root-finding
+
+== version 0.3.0
+* FFTs, Ordinary differential equations
+
+== 2002 version 0.2.5
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..ab57309
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+gemspec
+
+gem 'narray' if ENV['NARRAY']
diff --git a/README b/README
deleted file mode 100644
index b0f19ed..0000000
--- a/README
+++ /dev/null
@@ -1,28 +0,0 @@
-== Description
-
-Ruby/GSL, a ruby interface to GSL (GNU Scientific library)
-
-== Installation
-
-See http://blackwinter.github.com/rb-gsl.
-
-== Reference
-
-See http://blackwinter.github.com/rb-gsl/rdoc/ref_rdoc.
-
-== Licence
-
-Ruby/GSL is free software: you can redistribute it and/or modify it
-under the terms of the GNU General Public License.
-This library is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY.
-
-== Bug Reports
-
-Any bug reports are welcome. If you encounter bugs in Ruby/GSL, please
-report them on GitHub: https://github.com/blackwinter/rb-gsl/issues.
-
-== Authors
-
-* Yoshiki Tsunesada <y-tsunesada at mm dot em-net dot ne dot jp> (Original author)
-* Jens Wille <mailto:jens.wille at gmail.com>
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..52a97bb
--- /dev/null
+++ b/README.md
@@ -0,0 +1,77 @@
+# Ruby/GSL, a Ruby interface to GSL (GNU Scientific library)
+
+Permission is granted to copy, distribute and/or modify this document under
+the terms of the GNU Free Documentation License.
+
+## Description
+
+Ruby/GSL is a Ruby interface to the [GNU Scientific Library](https://gnu.org/software/gsl/)
+(GSL), for numerical computing with [Ruby](http://www.ruby-lang.org/).
+
+
+## Installation
+
+Ruby/GSL may be installed as a Ruby Gem by simply running
+
+  gem install rb-gsl
+
+Note that the GSL libraries must already be installed before Ruby/GSL
+can be installed:
+
+Debian/Ubuntu: +libgsl0-dev+
+Fedora/SuSE:   +gsl-devel+
+Gentoo:        +sci-libs/gsl+
+OS X:          <tt>brew install gsl</tt>
+
+It is recommended to install the [GNU plotutils](https://gnu.org/software/plotutils/plotutils.html)
+package. Some of the example scripts in the +examples/+ directory use the
++graph+ utility included in the package to plot the results. Windows cygwin
+binaries of <tt>GNU plotutils</tt> and related packages are available
+[here](http://gnuwin32.sourceforge.net/packages/plotutils.htm).
+
+
+## Reference
+
+The [Ruby/GSL reference manual](link:rdoc/ref_rdoc.html) follows and borrows
+large parts of the GSL reference manual.
+
+
+## Examples
+
+See scripts in +examples/+ and +test/+ directories.
+
+
+## Related Projects
+
+* [ruby-gsl](http://ruby-gsl.sourceforge.net/): Another Ruby binding,
+  developed by Arno Erpenbeck.
+
+
+## Licence
+
+Ruby/GSL is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License.
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY.
+
+
+## Bug Reports
+
+Any bug reports are welcome. If you encounter bugs in Ruby/GSL, please
+report them on GitHub(https://github.com/SciRuby/rb-gsl/issues).
+
+
+## Links
+
+Documentation: https://sciruby.github.com/rb-gsl
+Source code:   https://github.com/SciRuby/rb-gsl
+RubyGem:       https://rubygems.org/gems/rb-gsl
+Bug tracker:   https://github.com/SciRuby/rb-gsl/issues
+Travis CI:     https://travis-ci.org/SciRuby/rb-gsl
+
+
+## Authors
+
+* Yoshiki Tsunesada <y-tsunesada at mm dot em-net dot ne dot jp> (July, 2004)
+* David MacMahon <davidm at astro.berkeley.edu> (November, 2010)
+* Jens Wille <mailto:jens.wille at gmail.com> (November, 2013)
diff --git a/Rakefile b/Rakefile
index 69c8936..780cebb 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,39 +1,20 @@
 require File.expand_path(%q{../lib/gsl/version}, __FILE__)
 
-begin
-  require 'hen'
+require 'bundler/setup'
+require 'rubygems/package_task'
+require 'rake/extensiontask'
+require 'rake/testtask'
 
-  note = '[Ruby 2.x and GSL 1.16 compatible fork]'
+Bundler::GemHelper.install_tasks
 
-  Hen.lay! {{
-    :gem => {
-      :name          => %q{rb-gsl},
-      :version       => GSL::RB_GSL_VERSION,
-      :summary       => %Q{Ruby interface to the GNU Scientific Library #{note}},
-      :description   => %Q{Ruby/GSL is a Ruby interface to the GNU Scientific Library, for numerical computing with Ruby #{note}},
-      :authors       => ['Yoshiki Tsunesada', 'David MacMahon', 'Jens Wille'],
-      :email         => %q{jens.wille at gmail.com},
-      :license       => %q{GPL-2.0},
-      :homepage      => :blackwinter,
-      :dependencies  => [['narray', '>= 0.5.9']],
-      :requirements  => ['GSL (http://www.gnu.org/software/gsl/)'],
-
-      :extra_files => FileList['examples/**/*', 'rdoc/*'].to_a,
+Rake::TestTask.new do |t|
+  t.libs << 'test'
+  t.libs << 'test/gsl'
+  t.test_files = FileList['test/*.rb', 'test/gsl/*.rb']
+end
 
-      :extension => { :cross_compile => false },
+spec = eval(IO.read('gsl.gemspec'))
+Gem::PackageTask.new(spec).define
+Rake::ExtensionTask.new(:gsl_native, spec)
 
-      :required_ruby_version => '>= 1.8.7'
-    },
-    :rdoc => {
-      :title      => 'Ruby/GSL{version: (v%s)}',
-      :rdoc_files => FileList['rdoc/*'].to_a,
-      :main       => 'index.rdoc',
-      :root       => 'rdoc'
-    },
-    :test => {
-      :libs => %w[lib test]
-    }
-  }}
-rescue LoadError => err
-  warn "Please install the `hen' gem. (#{err})"
-end
+task :default => [:compile, :test]
diff --git a/THANKS b/THANKS
index 2f5f4df..4085f5b 100644
--- a/THANKS
+++ b/THANKS
@@ -1,5 +1,5 @@
 Takeshi Horinouchi
-Masahide Kikkawa 
+Masahide Kikkawa
 Seiya Nishizawa (Patches, NArray supports)
 Arno Erpenbeck (ruby-gsl project)
 Austin Newton
diff --git a/examples/blas/blas.rb b/examples/blas/blas.rb
index 3a0f000..957c7b6 100755
--- a/examples/blas/blas.rb
+++ b/examples/blas/blas.rb
@@ -10,4 +10,4 @@ B = b.matrix_view(3, 2)
 C = GSL::Blas.dgemm(GSL::Blas::NoTrans, GSL::Blas::NoTrans, 1.0, A, B, 0.0)
 p C
 
-p A*B 
+p A*B
diff --git a/examples/bspline.rb b/examples/bspline.rb
index f9e6b73..6758be3 100755
--- a/examples/bspline.rb
+++ b/examples/bspline.rb
@@ -19,15 +19,15 @@ w = GSL::Vector.alloc(N)
 for i in 0...N do
   xi = (15.0/(N-1)/1)*i
   yi = Math::cos(xi)*Math::exp(-0.1*xi)
-  
+
   sigma = 0.1
   dy = GSL::Ran.gaussian(r, sigma)
   yi += dy
-  
+
   x[i] = xi
   y[i] = yi
   w[i] = sigma
-  
+
 #  printf("%f %f\n", xi, yi)
 end
 
diff --git a/examples/complex/functions.rb b/examples/complex/functions.rb
index 0812096..5b88e5a 100755
--- a/examples/complex/functions.rb
+++ b/examples/complex/functions.rb
@@ -26,8 +26,8 @@ p f.log == z
 p z.pow(f)  # [1.931e-02 1.752e-02], verified with Octave result
 
 # The results below are verified with the Octave results
-p GSL::Complex.sin(z) 
-p GSL::Complex.cos(z) 
+p GSL::Complex.sin(z)
+p GSL::Complex.cos(z)
 p GSL::Complex.tan(z)
 p GSL::Complex.sec(z)
 p GSL::Complex.csc(z)
@@ -43,8 +43,8 @@ p GSL::Complex.arccsc(z)
 p GSL::Complex.arccsc_real(2)
 p GSL::Complex.arccot(z)
 
-p GSL::Complex.sinh(z) 
-p GSL::Complex.cosh(z) 
+p GSL::Complex.sinh(z)
+p GSL::Complex.cosh(z)
 p GSL::Complex.tanh(z)
 p GSL::Complex.sech(z)
 p GSL::Complex.csch(z)
diff --git a/examples/complex/mul.rb b/examples/complex/mul.rb
index 3e5a28d..5177c7e 100755
--- a/examples/complex/mul.rb
+++ b/examples/complex/mul.rb
@@ -3,7 +3,7 @@ require 'gsl'
 
 a = GSL::Complex.rect(1, 2)
 b = GSL::Complex[3, 4]
- 
+
 p a*b  # -5 + 10i
 p a.mul(b)
 p a
diff --git a/examples/const/physconst.rb b/examples/const/physconst.rb
index b662a48..afb1c03 100755
--- a/examples/const/physconst.rb
+++ b/examples/const/physconst.rb
@@ -42,7 +42,7 @@ MENU[2] = ["", "ASTRONOMICAL_UNIT", "GRAVITATIONAL_CONSTANT",
 MENU[3] = ["", "ELECTRON_CHARGE", "ELECTRON_VOLT", "UNIFIED_ATOMIC_MASS",
            "MASS_ELECTRON", "MASS_MUON", "MASS_PROTON", "MASS_NEUTRON",
            "FINE_STRUCTURE", "RYDBERG", "BOHR_RADIUS", "ANGSTROM",
-           "BARN", "BOHR_MAGNETON", "NUCLEAR_MAGNETON", 
+           "BARN", "BOHR_MAGNETON", "NUCLEAR_MAGNETON",
            "ELECTRON_MAGNETIC_MOMENT", "PROTON_MAGNETIC_MOMENT",
            "THOMSON_CROSS_SECTION"]
 
@@ -56,10 +56,10 @@ MENU[9] = ["", "POUND_MASS", "OUNCE_MASS", "TON", "METRIC_TON", "UK_TON",
            "TROY_OUNCE", "CARAT", "GRAM_FORCE", "POUND_FORCE",
            "KILOPOUND_FORCE", "POUNDAL"]
 MENU[10] = ["", "CALORIE", "BTU", "THERM", "HORSEPOWER"]
-MENU[11] = ["", "BAR", "STD_ATMOSPHERE", "TORR", "METER_OF_MERCURY", 
+MENU[11] = ["", "BAR", "STD_ATMOSPHERE", "TORR", "METER_OF_MERCURY",
             "INCH_OF_MERCURY", "INCH_OF_WATER", "PSI"]
 MENU[12] = ["", "POISE", "STOKES"]
-MENU[13] = ["", "STILB", "LUMEN", "LUX", "PHOT", "FOOTCANDLE", 
+MENU[13] = ["", "STILB", "LUMEN", "LUX", "PHOT", "FOOTCANDLE",
             "LAMBERT", "FOOTLAMBERT"]
 MENU[14] = ["", "CURIE", "ROENTGEN", "RAD"]
 MENU[15] = ["", "NEWTON", "DYNE", "JOULE", "ERG"]
@@ -96,7 +96,7 @@ def show_submenu(ind, w)
   w.setpos(i+=1, 1)
   str = "    ? ['m' to menu]: "
   w.addstr(str)
-  w.setpos(i, str.size+1)  
+  w.setpos(i, str.size+1)
   w.box('|', '-')
   w.refresh
 end
diff --git a/examples/const/travel.rb b/examples/const/travel.rb
index efe8b9c..a2d894a 100755
--- a/examples/const/travel.rb
+++ b/examples/const/travel.rb
@@ -8,8 +8,8 @@ c  = SPEED_OF_LIGHT;
 au = ASTRONOMICAL_UNIT;
 minutes = MINUTE;
 
-# distance stored in meters 
-r_earth = 1.00 * au;  
+# distance stored in meters
+r_earth = 1.00 * au;
 r_mars  = 1.52 * au;
 
 t_min = (r_mars - r_earth) / c;
@@ -30,8 +30,8 @@ c  = SPEED_OF_LIGHT;
 au = ASTRONOMICAL_UNIT;
 minutes = MINUTE;
 
-# distance stored in meters 
-r_earth = 1.00 * au;  
+# distance stored in meters
+r_earth = 1.00 * au;
 r_mars  = 1.52 * au;
 
 t_min = (r_mars - r_earth) / c;
diff --git a/examples/eigen/nonsymmv.rb b/examples/eigen/nonsymmv.rb
index 71bd38e..27091d7 100755
--- a/examples/eigen/nonsymmv.rb
+++ b/examples/eigen/nonsymmv.rb
@@ -13,7 +13,7 @@ p eval
 p evec
 
 =begin
-This can be compared with the corresponding output from GNU OCTAVE, 
+This can be compared with the corresponding output from GNU OCTAVE,
 
   octave> [v,d] = eig(vander([-1 -2 3 4]));
 octave> diag(d)
diff --git a/examples/eigen/qhoscillator.rb b/examples/eigen/qhoscillator.rb
index 48c26bf..96b0988 100755
--- a/examples/eigen/qhoscillator.rb
+++ b/examples/eigen/qhoscillator.rb
@@ -61,13 +61,13 @@ end
 # The differences with Tabelle 5.1 are from NMAX and dx.
 # If we use NMAX=512 and dx=0.02, we obtain the same results (but much slower).
 STDERR.puts("  Eigen values:")
-STDERR.printf("  %2s Exact %5s %10s | %2s Exact %5s %10s\n", 
+STDERR.printf("  %2s Exact %5s %10s | %2s Exact %5s %10s\n",
               "n", "E", "err\(\%\)", "n", "E", "err\(\%\)")
 STDERR.print("  -----------------------------------------------------\n")
 for n1 in 0..6 do
   exact1 = n1 + 0.5
   exact2 = n1 + 7 + 0.5
-  STDERR.printf("  %2d %4.1f %8.5f %+7.5f | %2d %4.1f %8.5f %+7.5f\n", 
+  STDERR.printf("  %2d %4.1f %8.5f %+7.5f | %2d %4.1f %8.5f %+7.5f\n",
                 n1, exact1, eval[n1], (exact1 - eval[n1])/exact1*100,
                 n1+7, exact2, eval[n1+7], (exact2-eval[n1+7])/exact2*100)
 end
@@ -75,7 +75,7 @@ STDERR.flush
 
 # Eigen vectors of n = 0, 1, 2, 10. See p217 "Abb 5.3"
 c = Math::sqrt(1.0/dx)
-vec0 = evec.col(0).scale(c)    
+vec0 = evec.col(0).scale(c)
 vec1 = evec.col(1).scale(c)
 vec2 = evec.col(2).scale(c)
 vec10 = evec.col(10).scale(c)
diff --git a/examples/fft/radix2.rb b/examples/fft/radix2.rb
index c07a5d1..6bd5f47 100755
--- a/examples/fft/radix2.rb
+++ b/examples/fft/radix2.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 n = 128
 data = GSL::Vector::Complex.alloc(n)
diff --git a/examples/fft/real-halfcomplex.rb b/examples/fft/real-halfcomplex.rb
index cbf6a2f..609ada7 100755
--- a/examples/fft/real-halfcomplex.rb
+++ b/examples/fft/real-halfcomplex.rb
@@ -11,7 +11,7 @@ end
 
 rtable = GSL::FFT::RealWavetable.alloc(n)
 rwork = GSL::FFT::RealWorkspace.alloc(n)
-  
+
 #ffted = data.real_transform(rtable, rwork)
 #ffted = data.real_transform(rtable)
 #ffted = data.real_transform(rwork)
@@ -22,9 +22,9 @@ ffted = data.real_transform()
 for i in 11...n do
   ffted[i] = 0.0
 end
-  
+
 hctable = GSL::FFT::HalfComplexWavetable.alloc(n)
-  
+
 #data2 = ffted.halfcomplex_inverse(hctable, rwork)
 #data2 = ffted.halfcomplex_inverse()
 #data2 = ffted.ifft
diff --git a/examples/fft/real-halfcomplex2.rb b/examples/fft/real-halfcomplex2.rb
index 8162c53..4069137 100755
--- a/examples/fft/real-halfcomplex2.rb
+++ b/examples/fft/real-halfcomplex2.rb
@@ -12,15 +12,15 @@ org = data.clone
 
 rtable = GSL::FFT::RealWavetable.alloc(n)
 rwork = GSL::FFT::RealWorkspace.alloc(n)
-  
+
 data.real_transform!(rtable, rwork)
 
 for i in 11...n do
   data[i] = 0.0
 end
-  
+
 hctable = GSL::FFT::HalfComplexWavetable.alloc(n)
-  
+
 #data.halfcomplex_inverse!(hctable, rwork)
 #data.halfcomplex_inverse!()
 #data.ifft!
diff --git a/examples/fit/expfit.rb b/examples/fit/expfit.rb
index 658a180..c31d280 100755
--- a/examples/fit/expfit.rb
+++ b/examples/fit/expfit.rb
@@ -22,7 +22,7 @@ p err
 GSL::graph(x, y, y0+amp*GSL::Sf::exp(-b*x))
 
 # This will result in
-# [ 1.019e+00 5.045e+00 1.040e-01 ] 
+# [ 1.019e+00 5.045e+00 1.040e-01 ]
 # [ 3.385e-02 5.395e-02 2.826e-03 ]
 
 # GNUPLOT results:
diff --git a/examples/fit/multifit.rb b/examples/fit/multifit.rb
index 213e731..44b6da4 100755
--- a/examples/fit/multifit.rb
+++ b/examples/fit/multifit.rb
@@ -2,7 +2,7 @@
 require("gsl")
 
 GSL::Rng.env_setup()
-  
+
 r = GSL::Rng.alloc(GSL::Rng::DEFAULT)
 
 n = 19
diff --git a/examples/fit/ndlinear.rb b/examples/fit/ndlinear.rb
index 610cd4d..ad710d8 100755
--- a/examples/fit/ndlinear.rb
+++ b/examples/fit/ndlinear.rb
@@ -2,8 +2,8 @@
 require("gsl")
 
 unless GSL::MultiFit.const_defined?("Ndlinear")
-	puts("The extension library NDLINEAR is not installed.")
-	exit()
+  puts("The extension library NDLINEAR is not installed.")
+  exit()
 end
 
 N_DIM = 3
@@ -13,33 +13,33 @@ N_SUM_PHI = 9
 R_MAX = 3.0
 
 def psi_real_exact(k, l, m, r, theta, phi)
-  rr = GSL::pow(r, l)*Math::exp(-r*r)*GSL::Sf::laguerre_n(k, l + 0.5, 2 * r * r)	 
+  rr = GSL::pow(r, l)*Math::exp(-r*r)*GSL::Sf::laguerre_n(k, l + 0.5, 2 * r * r)
 
-	tt = GSL::Sf::legendre_sphPlm(l, m, Math::cos(theta))
+  tt = GSL::Sf::legendre_sphPlm(l, m, Math::cos(theta))
 
-	pp = Math::cos(m*phi)
+  pp = Math::cos(m*phi)
 
-	rr*tt*pp
+  rr*tt*pp
 end
 
 basis_r = Proc.new { |r, y, params|
-	params.eval(r, y)
+  params.eval(r, y)
 }
 
 basis_theta = Proc.new { |theta, y, params|
-	for i in 0...N_SUM_THETA do
-		y[i] = GSL::Sf::legendre_Pl(i, Math::cos(theta));
-	end
+  for i in 0...N_SUM_THETA do
+    y[i] = GSL::Sf::legendre_Pl(i, Math::cos(theta));
+  end
 }
 
 basis_phi = Proc.new { |phi, y, params|
-	for i in 0...N_SUM_PHI do
-		if i%2 == 0
-			y[i] = Math::cos(i*0.5*phi)
-		else
-			y[i] = Math::sin((i+1.0)*0.5*phi)
-		end
-	end
+  for i in 0...N_SUM_PHI do
+    if i%2 == 0
+      y[i] = Math::cos(i*0.5*phi)
+    else
+      y[i] = Math::sin((i+1.0)*0.5*phi)
+    end
+  end
 }
 
 
@@ -67,19 +67,19 @@ data = GSL::Vector.alloc(NDATA)
 
 for i in 0...NDATA do
 
-	r = rng.uniform()*R_MAX
-	theta = rng.uniform()*Math::PI
-	phi = rng.uniform()*2*Math::PI
+  r = rng.uniform()*R_MAX
+  theta = rng.uniform()*Math::PI
+  phi = rng.uniform()*2*Math::PI
 
-	psi = psi_real_exact(k, l, m, r, theta, phi)
+  psi = psi_real_exact(k, l, m, r, theta, phi)
 
-	dpsi = rng.gaussian(0.05*psi)
+  dpsi = rng.gaussian(0.05*psi)
 
-	vars[i,0] = r
-	vars[i,1] = theta
-	vars[i,2] = phi		
+  vars[i,0] = r
+  vars[i,1] = theta
+  vars[i,2] = phi
 
-	data[i] = psi + dpsi
+  data[i] = psi + dpsi
 end
 
 #GSL::MultiFit::Ndlinear::design(vars, X, ndlinear)
@@ -99,18 +99,18 @@ x = GSL::Vector.alloc(N_DIM)
 
 r = 0.01
 while r < R_MAX do
-	theta = 0.0
-	while theta < Math::PI do
-		phi = 0.0
-		while phi < 2*Math::PI do
-			dV = r*r*Math::sin(theta)*dr*dtheta*dphi
-			x[0] = r
-			x[1] = theta
-			x[2] = phi
-
-			psi_model, err = GSL::MultiFit::Ndlinear.calc(x, coeffs, cov, ndlinear)
-			psi = psi_real_exact(k, l, m, r, theta, phi)
-			err = psi_model - psi
+  theta = 0.0
+  while theta < Math::PI do
+    phi = 0.0
+    while phi < 2*Math::PI do
+      dV = r*r*Math::sin(theta)*dr*dtheta*dphi
+      x[0] = r
+      x[1] = theta
+      x[2] = phi
+
+      psi_model, err = GSL::MultiFit::Ndlinear.calc(x, coeffs, cov, ndlinear)
+      psi = psi_real_exact(k, l, m, r, theta, phi)
+      err = psi_model - psi
       eps_rms += err * err * dV;
       volume += dV;
 
@@ -118,13 +118,13 @@ while r < R_MAX do
          printf("%e %e %e %e\n", r, theta, psi, psi_model)
       end
 
-			phi += dphi
-		end
-		theta += dtheta
-	end
-	printf("\n");
+      phi += dphi
+    end
+    theta += dtheta
+  end
+  printf("\n");
 
-	r += dr
+  r += dr
 end
 
 eps_rms /= volume
diff --git a/examples/fit/nonlinearfit.rb b/examples/fit/nonlinearfit.rb
index 63e9816..cf26446 100755
--- a/examples/fit/nonlinearfit.rb
+++ b/examples/fit/nonlinearfit.rb
@@ -5,7 +5,7 @@ FFF = GSL::Function.alloc { |t, params|
   a = params[0]; lambda = params[1]; b = params[2]
   a*Math::exp(-lambda*t) + b
 }
-  
+
 procf = Proc.new { |x, t, y, sigma, f|
   a = x[0]; lambda = x[1]; b = x[2]
   FFF.set_params(x)
diff --git a/examples/fit/wlinear.rb b/examples/fit/wlinear.rb
index 3cf2946..b335821 100755
--- a/examples/fit/wlinear.rb
+++ b/examples/fit/wlinear.rb
@@ -10,7 +10,7 @@ c0, c1, cov00, cov01, cov11, chisq = GSL::Fit::wlinear(x, w, y)
 
 printf("# best fit: Y = %g + %g X\n", c0, c1);
 printf("# covariance matrix:\n");
-printf("# [ %g, %g\n#   %g, %g]\n", 
+printf("# [ %g, %g\n#   %g, %g]\n",
         cov00, cov01, cov01, cov11);
 printf("# chisq = %g\n", chisq);
 
@@ -26,9 +26,9 @@ begin
   flo = File.open("lo.dat", "w")
   for i in -30...130 do
     xf = x[0] + (i/100.0) * (x[n-1] - x[0])
-    
+
     yf, yf_err = GSL::Fit::linear_est(xf, c0, c1, cov00, cov01, cov11)
-    
+
     ffit.printf("%g %g\n", xf, yf)
     fhi.printf("%g %g\n", xf, yf + yf_err)
     flo.printf("%g %g\n", xf, yf - yf_err)
diff --git a/examples/function/function.rb b/examples/function/function.rb
index fcaf680..2d4790a 100755
--- a/examples/function/function.rb
+++ b/examples/function/function.rb
@@ -2,7 +2,7 @@
 require("gsl")
 include Math
 
-f = GSL::Function::alloc{ |x, params| 
+f = GSL::Function::alloc{ |x, params|
   a = params[0]
   b = params[1]
   c = params[2]
diff --git a/examples/function/min.rb b/examples/function/min.rb
index 8c72d23..8186e18 100755
--- a/examples/function/min.rb
+++ b/examples/function/min.rb
@@ -14,7 +14,7 @@ gmf.set(humps, m, a, b)
 printf("Using %s method\n", gmf.name)
 printf("%5s [%9s, %9s] %9s %10s %9s\n", "iter", "lower", "upper", "min",
        "err", "err(est)")
-printf("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n", 
+printf("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
        iter, a, b, m, m - m_expected, b - a)
 begin
   iter += 1
diff --git a/examples/function/synchrotron.rb b/examples/function/synchrotron.rb
index 1fbee8f..88a7673 100755
--- a/examples/function/synchrotron.rb
+++ b/examples/function/synchrotron.rb
@@ -5,8 +5,8 @@ require("gsl")
 # Create Function object from the module function
 F = GSL::Function.alloc { |x| GSL::Sf::synchrotron_1(x) }
 # Derivative of the function
-DF = GSL::Function.alloc { |x|  
-  result, abserr, status = F.deriv_central(x, 1e-6)  
+DF = GSL::Function.alloc { |x|
+  result, abserr, status = F.deriv_central(x, 1e-6)
   result
 }
 # Find zero-point of the derivative in interval (0.01, 5)
diff --git a/examples/gallery/koch.rb b/examples/gallery/koch.rb
index 9b871ae..c01a80f 100755
--- a/examples/gallery/koch.rb
+++ b/examples/gallery/koch.rb
@@ -15,7 +15,7 @@ def koch(x, y, theta, size, order, file)
     x, y = koch(x, y, theta, size/3, order-1, file)
     theta += Math::PI/3
     x, y = koch(x, y, theta, size/3, order-1, file)
-    theta -= 2.0*Math::PI/3    
+    theta -= 2.0*Math::PI/3
     x, y = koch(x, y, theta, size/3, order-1, file)
     theta += Math::PI/3
     x, y = koch(x, y, theta, size/3, order-1, file)
diff --git a/examples/histogram/cauchy.rb b/examples/histogram/cauchy.rb
index 13ed3a3..467bd19 100755
--- a/examples/histogram/cauchy.rb
+++ b/examples/histogram/cauchy.rb
@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 # Usage from command line:
-#  % gsl-randist 0 10000 cauchy 30 | ./hist1d.rb -100 100 200 
+#  % gsl-randist 0 10000 cauchy 30 | ./hist1d.rb -100 100 200
 
 require("gsl")
 
@@ -24,4 +24,4 @@ end
 h.graph("-C -g 3 -L 'gsl-randist 0 10000 cauchy 30'")
 
 
- 
+
diff --git a/examples/histogram/exponential.rb b/examples/histogram/exponential.rb
index bff7899..94e8435 100755
--- a/examples/histogram/exponential.rb
+++ b/examples/histogram/exponential.rb
@@ -16,4 +16,4 @@ x = GSL::Vector.linspace(0, 15, 100)
 y = a*GSL::Sf::exp(x*b)
 GSL::graph(h, [x, y], "-C -g 3")
 
-  
+
diff --git a/examples/histogram/histo3d.rb b/examples/histogram/histo3d.rb
index f30c3be..165d286 100755
--- a/examples/histogram/histo3d.rb
+++ b/examples/histogram/histo3d.rb
@@ -5,7 +5,7 @@ N = 5000
 BINS = 50
 rng = GSL::Rng.alloc(1)
 
-h = GSL::Histogram3d.alloc(BINS, [-5, 5], BINS, [-4, 8], BINS, [-8, 3]) 
+h = GSL::Histogram3d.alloc(BINS, [-5, 5], BINS, [-4, 8], BINS, [-8, 3])
 sig1 = 1
 sig2 = 2
 sig3 = 1.3
diff --git a/examples/histogram/histogram-pdf.rb b/examples/histogram/histogram-pdf.rb
index 655ddef..6ef9803 100755
--- a/examples/histogram/histogram-pdf.rb
+++ b/examples/histogram/histogram-pdf.rb
@@ -16,8 +16,8 @@ rng2 = GSL::Rng.alloc()
 h2 = GSL::Histogram.alloc(NBINS, [-MAX, MAX])
 NDATA2 = 10000
 for i in 0...NDATA2 do
-	val = hpdf.sample(rng2.uniform())
-	h2.fill(val)
+  val = hpdf.sample(rng2.uniform())
+  h2.fill(val)
 end
 
 GSL::graph(h, h2)
diff --git a/examples/histogram/xexp.rb b/examples/histogram/xexp.rb
index 6ce508c..4ed75b5 100755
--- a/examples/histogram/xexp.rb
+++ b/examples/histogram/xexp.rb
@@ -18,4 +18,4 @@ x = GSL::Vector.linspace(0, 15, 100)
 y = amp*x*GSL::Sf::exp(-x*b)
 GSL::graph(h, [x, y], "-C -g 3")
 
-  
+
diff --git a/examples/integration/ahmed.rb b/examples/integration/ahmed.rb
index 1474c4f..625cf5b 100755
--- a/examples/integration/ahmed.rb
+++ b/examples/integration/ahmed.rb
@@ -6,7 +6,7 @@ require("gsl")
 include GSL
 include Math
 
-f = Function.alloc { |x| 
+f = Function.alloc { |x|
   sqrtx22 = sqrt(x*x + 2)
   atan(sqrtx22)/(sqrtx22*(x*x + 1))
 }
@@ -18,4 +18,4 @@ puts("Expect: 5pi^2/96 = #{5.0*M_PI*M_PI/96}")
 puts("QNG result:        #{val}")
 
 
- 
+
diff --git a/examples/integration/cosmology.rb b/examples/integration/cosmology.rb
index fc24e45..11a3352 100755
--- a/examples/integration/cosmology.rb
+++ b/examples/integration/cosmology.rb
@@ -18,18 +18,18 @@ module Cosmology
     1.0/sqrt(k*z12 + lambda + matter*z12*zplus1 + radiation*z12*z12)
   }
   WSpace = GSL::Integration::Workspace.alloc(1000)
-  
+
   class Universe
     H2H0 = 3.24e-18
     G = GRAVITATIONAL_CONSTANT
     RAD_DENSITY = 8.0*pow_5(PI)*pow_4(BOLTZMANN)/15.0/pow_3(PLANCKS_CONSTANT_H*SPEED_OF_LIGHT)
     #  p SPEED_OF_LIGHT/(0.71*100*1e5*1e3)*13
-    
+
     def initialize(matter = 0.3, lambda = 0.7, cmbT = 2.7, h = 0.7)
       # Hubble parameter at present
       @h = h
       @H0 = H2H0*h
-      
+
       # Density parameters
       @matter = matter
       @lambda = lambda
@@ -39,12 +39,12 @@ module Cosmology
       @k = 1.0 - @Omega
       @q = @matter/2.0 + @radiation - @lambda  # Decceleration parameter
     end
-    
+
     def comoving_distance(z)
       InvHz.set_params(self)
       InvHz.integration_qags([0.0, z], WSpace)[0]
     end
-    
+
     # r: comoving distance
     def conformal_factor(r)
       tmp = sqrt(@k)
@@ -56,13 +56,13 @@ module Cosmology
         r
       end
     end
-    
+
     def luminosity_distance(z)
       r = self.comoving_distance(z)
       s = self.conformal_factor(r)
       [r, (1.0 + z)*s]  # comoving distance, luminosity distance
     end
-    
+
     attr_reader :h
     attr_reader :H0
     attr_reader :matter
diff --git a/examples/integration/friedmann.rb b/examples/integration/friedmann.rb
index c0ec395..9ff1527 100755
--- a/examples/integration/friedmann.rb
+++ b/examples/integration/friedmann.rb
@@ -18,10 +18,10 @@ begin
   z = 0.01
   while z <= 3
     # comoving distance, luminosity distance
-    chi10, ldist10 = u10.luminosity_distance(z)  
-    chi37, ldist37 = u37.luminosity_distance(z)  
-    chi01, ldist01 = u01.luminosity_distance(z)  
-    file.printf("%e %e %e %e %e %e %e\n", 
+    chi10, ldist10 = u10.luminosity_distance(z)
+    chi37, ldist37 = u37.luminosity_distance(z)
+    chi01, ldist01 = u01.luminosity_distance(z)
+    file.printf("%e %e %e %e %e %e %e\n",
                 z, chi10, ldist10, chi37, ldist37, chi01, ldist01)
     z += 0.1
   end
diff --git a/examples/integration/qng.rb b/examples/integration/qng.rb
index 93fe4e5..553ac80 100755
--- a/examples/integration/qng.rb
+++ b/examples/integration/qng.rb
@@ -6,7 +6,7 @@ include Math
 f = Function.alloc { |x| Math::sin(x)/x }
 
 p f.qng(0, 2.0*Math::PI)
- 
+
 # Singular at x = 0
 f2 = Function.alloc { |x| exp(-x)/sqrt(x) }
 
diff --git a/examples/interp/demo.rb b/examples/interp/demo.rb
index 0167c3d..f4c3a1b 100755
--- a/examples/interp/demo.rb
+++ b/examples/interp/demo.rb
@@ -27,9 +27,9 @@ def spline_compare(type, xa, ya, filename)
   end
 end
 
-types = ["linear", "polynomial", "cspline", "cspline_periodic", 
+types = ["linear", "polynomial", "cspline", "cspline_periodic",
          "akima", "akima_periodic"]
-         
+
 types.each do |t|
   filename = t + ".dat"
   spline_compare(t, xa, ya, filename)
diff --git a/examples/linalg/LQ_solve.rb b/examples/linalg/LQ_solve.rb
index 3ab3e1b..7ebffad 100755
--- a/examples/linalg/LQ_solve.rb
+++ b/examples/linalg/LQ_solve.rb
@@ -3,7 +3,7 @@ require("gsl")
 include GSL
 
 m = GSL::Matrix::alloc([0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
-		    [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
+        [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
 m.transpose!
 lq, tau = m.LQ_decomp
 
diff --git a/examples/linalg/LU.rb b/examples/linalg/LU.rb
index 08df546..67d4069 100755
--- a/examples/linalg/LU.rb
+++ b/examples/linalg/LU.rb
@@ -4,7 +4,7 @@ include GSL
 include Linalg
 
 m = Matrix::alloc([0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
-		    [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
+                  [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
 m.print
 
 lu, perm = m.LU_decomp
diff --git a/examples/linalg/LU2.rb b/examples/linalg/LU2.rb
index 3998a70..df946b7 100755
--- a/examples/linalg/LU2.rb
+++ b/examples/linalg/LU2.rb
@@ -4,7 +4,7 @@ include GSL
 include Linalg
 
 m = Matrix::alloc([0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
-		    [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
+                  [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
 m.print
 
 lu, perm = m.LU_decomp
diff --git a/examples/linalg/LU_narray.rb b/examples/linalg/LU_narray.rb
index 0626569..058d497 100755
--- a/examples/linalg/LU_narray.rb
+++ b/examples/linalg/LU_narray.rb
@@ -4,7 +4,7 @@ include GSL
 include Linalg
 
 m = NArray[[0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
-		    [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85]]
+           [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85]]
 b = NArray[1.0, 2, 3, 4]
 
 lu, perm, signum = LU.decomp(m)
diff --git a/examples/linalg/PTLQ.rb b/examples/linalg/PTLQ.rb
index 6739ad1..da8dc72 100755
--- a/examples/linalg/PTLQ.rb
+++ b/examples/linalg/PTLQ.rb
@@ -3,7 +3,7 @@ require("gsl")
 include GSL
 
 m = Matrix::alloc([0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
-		    [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
+                  [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
 m.transpose!
 lq, tau = m.PTLQ_decomp
 p lq.class
diff --git a/examples/linalg/QRPT.rb b/examples/linalg/QRPT.rb
index a357b01..6c5ca63 100755
--- a/examples/linalg/QRPT.rb
+++ b/examples/linalg/QRPT.rb
@@ -4,7 +4,7 @@ include GSL
 
 
 m = Matrix::alloc([0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
-		    [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
+                  [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
 qr, tau = m.QRPT_decomp
 p qr.class
 p tau.class
diff --git a/examples/linalg/chol.rb b/examples/linalg/chol.rb
index 9352fd1..faf450a 100755
--- a/examples/linalg/chol.rb
+++ b/examples/linalg/chol.rb
@@ -14,7 +14,7 @@ p Cholesky.solve(c, b)    # Expected [-0.125, 0.75]
 begin
   m = Matrix::alloc([0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
                   [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
-  
+
   c = Cholesky.decomp(m)
   b = [1, 2, 3, 4].to_gv
   p Cholesky.solve(c, b)
diff --git a/examples/linalg/chol_narray.rb b/examples/linalg/chol_narray.rb
index 9d9be86..4433923 100755
--- a/examples/linalg/chol_narray.rb
+++ b/examples/linalg/chol_narray.rb
@@ -11,5 +11,5 @@ b = NArray[1.0, 2]
 p Cholesky.solve(c, b)    # Expected [-0.125, 0.75]
 
 b = NArray[1.0, 2]
-Cholesky.svx(c, b)    
+Cholesky.svx(c, b)
 p b
diff --git a/examples/linalg/complex.rb b/examples/linalg/complex.rb
index 757ea08..18155f9 100755
--- a/examples/linalg/complex.rb
+++ b/examples/linalg/complex.rb
@@ -4,7 +4,7 @@ include GSL
 include Linalg
 
 m = Matrix::alloc([0.18, 0.60, 0.57, 0.96], [0.41, 0.24, 0.99, 0.58],
-		    [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
+                  [0.14, 0.30, 0.97, 0.66], [0.51, 0.13, 0.19, 0.85])
 m.inv.print
 p m.det
 
diff --git a/examples/math/elementary.rb b/examples/math/elementary.rb
index d1ad506..f7b3a9b 100755
--- a/examples/math/elementary.rb
+++ b/examples/math/elementary.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 puts("gsl_log1p")
 p GSL::log1p(0.1)
diff --git a/examples/math/functions.rb b/examples/math/functions.rb
index 3aefc5c..641c481 100755
--- a/examples/math/functions.rb
+++ b/examples/math/functions.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 puts("gsl_log1p")
 p GSL::log1p(0.1)
diff --git a/examples/math/inf_nan.rb b/examples/math/inf_nan.rb
index 83e266d..91d07d0 100755
--- a/examples/math/inf_nan.rb
+++ b/examples/math/inf_nan.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 include GSL
 
 puts("GSL_POSINF")
diff --git a/examples/math/minmax.rb b/examples/math/minmax.rb
index a81bbbe..b543d57 100755
--- a/examples/math/minmax.rb
+++ b/examples/math/minmax.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 p GSL::MAX(1, 2)
 p GSL::MAX(1, 2.0)
diff --git a/examples/math/power.rb b/examples/math/power.rb
index c77657d..a0f6ecb 100755
--- a/examples/math/power.rb
+++ b/examples/math/power.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 p GSL::pow_int(8, 3)
 p 8*8*8.0
diff --git a/examples/math/test.rb b/examples/math/test.rb
index aa3ed52..86de861 100755
--- a/examples/math/test.rb
+++ b/examples/math/test.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 puts("sign of 5.0")
 p GSL::SIGN(5.0)
diff --git a/examples/min.rb b/examples/min.rb
index bd7ea18..9875b36 100755
--- a/examples/min.rb
+++ b/examples/min.rb
@@ -10,7 +10,7 @@ gmf.set(fn1, m, a, b)
 printf("Using %s method\n", gmf.name)
 printf("%5s [%9s, %9s] %9s %10s %9s\n", "iter", "lower", "upper", "min",
        "err", "err(est)")
-printf("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n", 
+printf("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
        iter, a, b, m, m - m_expected, b - a)
 begin
   iter += 1
diff --git a/examples/multimin/bundle.rb b/examples/multimin/bundle.rb
index 9f542e0..b0264b5 100755
--- a/examples/multimin/bundle.rb
+++ b/examples/multimin/bundle.rb
@@ -53,7 +53,7 @@ begin
   iter += 1
   status = s.iterate
   status = s.test_convergence(1e-5)
-  printf("%4d  %14.7f  %13.8e  %13.8e\n", iter, s.f, subgradient.dnrm2, s.eps)  
+  printf("%4d  %14.7f  %13.8e  %13.8e\n", iter, s.f, subgradient.dnrm2, s.eps)
   if status == GSL::SUCCESS
     printf("\nMinimum is found at\n")
     x = s.x
diff --git a/examples/multimin/cqp.rb b/examples/multimin/cqp.rb
index ed4b9c3..e75c519 100755
--- a/examples/multimin/cqp.rb
+++ b/examples/multimin/cqp.rb
@@ -11,9 +11,9 @@ module GSL::CQP
       cqp_data.b = GSL::Vector.alloc(1); cqp_data.b[0] = 1.5
       cqp_data.C = GSL::Matrix[[1, 0, 0, 1], 2, 2]
       cqp_data.d = GSL::Vector.calloc(2)
-      
+
       Test_Problem.new("Goulds's problem", 2, 1, 2, cqp_data, 0.0)
-    end  
+    end
     def Test_Problem.betts()
       cqp_data = GSL::CQP::Data.alloc()
       cqp_data.Q = GSL::Matrix[[0.02, 0, 0, 2], 2, 2]
@@ -22,10 +22,10 @@ module GSL::CQP
       cqp_data.b = GSL::Vector.alloc(1); cqp_data.b[0] = 20
       cqp_data.C = GSL::Matrix.calloc(4, 2)
       cqp_data.C[0,0] = 1.0; cqp_data.C[1,1] = 1.0
-      cqp_data.C[2,0] = -1.0; cqp_data.C[3,1] = -11.0      
+      cqp_data.C[2,0] = -1.0; cqp_data.C[3,1] = -11.0
       cqp_data.d = GSL::Vector[2.0, -50, -50, -50]
-      
-      
+
+
       Test_Problem.new("Betts's problem", 2, 1, 4, cqp_data, 0.04)
     end
     def Test_Problem.beale()
@@ -36,12 +36,12 @@ module GSL::CQP
       cqp_data.b = GSL::Vector.alloc(1); cqp_data.b[0] = -3.0
       cqp_data.C = GSL::Matrix.eye(3, 3)
       cqp_data.d = GSL::Vector.calloc(3)
-      
+
       cqp_data.Q[0,0] = 4.0; cqp_data.Q[0,1] = 2.0
-      cqp_data.Q[1,0] = 2.0; cqp_data.Q[1,1] = 4.0      
-      cqp_data.Q[2,0] = 2.0; cqp_data.Q[2,2] = 2.0            
+      cqp_data.Q[1,0] = 2.0; cqp_data.Q[1,1] = 4.0
+      cqp_data.Q[2,0] = 2.0; cqp_data.Q[2,2] = 2.0
       Test_Problem.new("Beale's problem", 3, 1, 3, cqp_data, 9.0+1.0/9.0)
-    end  
+    end
 
     def initialize(name, n, me, mi, cqp, opt_value)
       @name = name
@@ -51,7 +51,7 @@ module GSL::CQP
       @cqp = cqp
       @opt_value = opt_value
     end
-  
+
     def solve()
       max_iter = 1000
       iter = 1
@@ -61,7 +61,7 @@ module GSL::CQP
       printf("********************  %s  ********************\n\n", @name)
 
       printf("== Itn ======= f ======== ||gap|| ==== ||residual||\n\n")
-    
+
       begin
         status = s.iterate
         status = s.test_convergence(1e-10, 1e-10)
@@ -70,7 +70,7 @@ module GSL::CQP
           printf("\nMinimum is found at\n");
           x = s.x
           lm_eq = s.lm_eq
-          lm_ineq = s.lm_ineq        
+          lm_ineq = s.lm_ineq
           for j in 0...x.size do
             printf("%9.6f ", x[j])
           end
@@ -79,21 +79,21 @@ module GSL::CQP
           for j in 0...lm_eq.size do
             printf("%9.6f ", lm_eq[j])
           end
-          printf("\n\n")        
+          printf("\n\n")
           printf("\nLagrange-multipliers for Cx>=d\n");
           for j in 0...lm_ineq.size do
             printf("%9.6f ", lm_ineq[j])
           end
-          printf("\n\n")        
+          printf("\n\n")
         else
           iter += 1
         end
-     end while status == GSL::CONTINUE and iter <= max_iter 
-      GSL::SUCCESS 
+     end while status == GSL::CONTINUE and iter <= max_iter
+      GSL::SUCCESS
     end
 
     attr_accessor :name, :n, :me, :mi
-    attr_accessor :cqp, :opt_value    
+    attr_accessor :cqp, :opt_value
   end
 
 end
diff --git a/examples/multiroot/fsolver3.rb b/examples/multiroot/fsolver3.rb
index 805f26e..12b2f2a 100755
--- a/examples/multiroot/fsolver3.rb
+++ b/examples/multiroot/fsolver3.rb
@@ -9,7 +9,7 @@ func = GSL::MultiRoot::Function.alloc(2) { |x, f|
   f[0] = -2.0*x0*x0 + 3.0*x0*x1 + 4.0*sin(x1) - 6.0
   f[1] = 3.0*x0*x0 - 2.0*x0*x1*x1 + 3.0*cos(x0) + 4.0
 }
-                            
+
 p func.solve([1.0, 2.0].to_gv, 1000, 1e-7, "hybrids")
 p func.solve([1.0, 2.0].to_gv, 1000, "broyden")
 p func.solve([1.0, 2.0], "hybrid")
diff --git a/examples/odeiv/binarysystem.rb b/examples/odeiv/binarysystem.rb
index 76898fa..754a8fd 100755
--- a/examples/odeiv/binarysystem.rb
+++ b/examples/odeiv/binarysystem.rb
@@ -2,13 +2,13 @@
 #      19/Apr/2004         by Yoshiki Tsunesada
 #
 #   This is an example to calculate the orbital evolution of
-# a double neutron star (binary) system. General relativity predicts 
-# that the binary orbital decays by radiating gravitational waves, 
-# and the two stars will coalesce in time scale of 100-1000 Mega-years. 
-#   The values used here are of the binary system J0730-3039 discovered 
-# in 2003 (Burgay et al., Nature 2003). The result shows that the two 
-# neutron stars will merge after about 85 Mega-years. From the age of 
-# the system 100 Mega-year, the lifetime of the system is estimated 
+# a double neutron star (binary) system. General relativity predicts
+# that the binary orbital decays by radiating gravitational waves,
+# and the two stars will coalesce in time scale of 100-1000 Mega-years.
+#   The values used here are of the binary system J0730-3039 discovered
+# in 2003 (Burgay et al., Nature 2003). The result shows that the two
+# neutron stars will merge after about 85 Mega-years. From the age of
+# the system 100 Mega-year, the lifetime of the system is estimated
 # about 185 Mega-years.
 #
 # References:
@@ -16,7 +16,7 @@
 #   2. Shapiro & Teukolsky, "Black holes, white dwarfs and neutron stars"
 #        John Wiley and Sans (1983)
 #
- 
+
 require("gsl")
 include Math
 
@@ -33,7 +33,7 @@ GMsolarC3 = 4.925490947e-6
 MegaYear = 3600*24*365*1e6
 
 # Time evolution of the binary orbital period and the eccentricity
-# due to gravitational radiation. 
+# due to gravitational radiation.
 # The calculation is based on general relativity (See e.g. Ref.2).
 #     y[0]: orbital period (pb)
 #     y[1]: eccentricity (e)
@@ -45,7 +45,7 @@ deriv = Proc.new { |t, y, dydt, binary|
   e = y[1]             # eccentricity
   m1 = binary.m1       # neutron star masses
   m2 = binary.m2
-  totalM = m1 + m2     # total mass                           
+  totalM = m1 + m2     # total mass
   mu = m1*m2/totalM    # reduced mass
   mm = mu*GSL::pow(totalM, 2.0/3.0)
   f_e = GSL::pow(1.0 - e*e, -3.5)*(1.0 + (73.0/24.0 + 37.0/96.0*e*e)*e*e);
@@ -85,8 +85,8 @@ tend = 2500*MegaYear
 h = 1.0*MegaYear
 
 begin
-  file = File.open("binarysystem.dat", "w") 
-  while t < tend 
+  file = File.open("binarysystem.dat", "w")
+  while t < tend
     t, h, status = solver.apply(t, tend, h, y)
     break if status != GSL::SUCCESS
     break if GSL::isnan?(y[0])
diff --git a/examples/odeiv/demo.rb b/examples/odeiv/demo.rb
index 2bad6b6..2d51f0d 100755
--- a/examples/odeiv/demo.rb
+++ b/examples/odeiv/demo.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-# Solve 
+# Solve
 #   dydt = -2y     ---> y(t) = exp(-2t)
 
 require("gsl")
@@ -40,11 +40,11 @@ def odeiv_compare_algorithm(solver, steptype, t0, tend, h0, y0, outfile)
 end
 
 if GSL::VERSION >= "1.5.90"
-  ALGORITHMS = ["rk2", "rk4", "rkf45", "rkck", "rk8pd", "rk2imp", "rk4imp", 
+  ALGORITHMS = ["rk2", "rk4", "rkf45", "rkck", "rk8pd", "rk2imp", "rk4imp",
                 "bsimp", "gear1", "gear2", "rk2simp"]
   gpfile = "demo2.gp"
 else
-  ALGORITHMS = ["rk2", "rk4", "rkf45", "rkck", "rk8pd", "rk2imp", "rk4imp", 
+  ALGORITHMS = ["rk2", "rk4", "rkf45", "rkck", "rk8pd", "rk2imp", "rk4imp",
                 "bsimp", "gear1", "gear2"]
   gpfile = "demo.gp"
 end
diff --git a/examples/odeiv/frei1.rb b/examples/odeiv/frei1.rb
index 40b54c8..5c2ae7f 100755
--- a/examples/odeiv/frei1.rb
+++ b/examples/odeiv/frei1.rb
@@ -1,13 +1,13 @@
 #!/usr/bin/env ruby
 #  Solve Schroedinger equation
 #
-#  This example is taken from frei1.cpp 
+#  This example is taken from frei1.cpp
 #  in "Numerische Physik" p201-204 (Springer),
 #  which simulates the time evolution of a probability density.
 #
 #  Name: frei1.cpp
-#  Zweck: Simuliert ein quantenmechanisches freies Teilchen 
-#  Gleichung: Schroedingergleichung ohne Potential verwendete 
+#  Zweck: Simuliert ein quantenmechanisches freies Teilchen
+#  Gleichung: Schroedingergleichung ohne Potential verwendete
 #  Bibiliothek: GSL
 #
 #  Reference:
@@ -20,7 +20,7 @@ require("gsl")
 #NMAX = 8192
 NMAX = 256
 
-# The wave equation: 
+# The wave equation:
 # calculate time derivative of the wave function.
 # The second spatial derivative is approximated by
 #   d2_psi/dx2 ~ (psi[n+1] - 2*psi[n] + pxi[n-1])/(dx*dx)
@@ -68,7 +68,7 @@ sum = 0.0
 for n in 0...NMAX do
   x = (n-NMAX/2) * $dx
   psi[n] = Math::exp(-GSL::pow_2(x/alpha)/2)
-  sum += GSL::pow_2(psi[n]) 
+  sum += GSL::pow_2(psi[n])
 end
 sum = 1.0/Math::sqrt(sum)
 
@@ -89,12 +89,12 @@ IO.popen("graph -T X -C -g 3", "w") do |io|
   c = GSL::Odeiv::Control.y_new(atol, rtol)
   evolve = GSL::Odeiv::Evolve.alloc(2*NMAX)
   sys = GSL::Odeiv::System.alloc(f, 2*NMAX)
-  
+
   t = 0.0
   for n in 1..n_out do
     t1 = n*dt
     STDOUT.printf("t = %2.1f (%2d/%2d)\n", t1-dt, n, n_out)
-    while t < t1 
+    while t < t1
       t, h, status = evolve.apply(c, step, sys, t, t1, h, psi)
       break if status != GSL::SUCCESS
     end
diff --git a/examples/odeiv/frei2.rb b/examples/odeiv/frei2.rb
index 4f2e396..c119cf8 100755
--- a/examples/odeiv/frei2.rb
+++ b/examples/odeiv/frei2.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-# This example is taken from frei2.cpp 
+# This example is taken from frei2.cpp
 # in "Numerische Physik" p205-206 (Springer).
 #
 # Reference:
@@ -45,10 +45,10 @@ IO.popen("graph -T X -C -g 3", "w") do |io|
     io.printf("%e %e\n", x, psi[n1].abs)
   end
   io.printf("\n")
-  
+
   psi_p.radix2_forward!
-  
-  
+
+
   t = 0.0
   for n in 1..n_out do
     t1 = n*dt
diff --git a/examples/odeiv/oscillator.rb b/examples/odeiv/oscillator.rb
index 8129ec2..46e75b3 100755
--- a/examples/odeiv/oscillator.rb
+++ b/examples/odeiv/oscillator.rb
@@ -5,7 +5,7 @@
 #   b: resist
 #   f: external force
 
-require("gsl") 
+require("gsl")
 
 dim = 2
 
diff --git a/examples/odeiv/sedov.rb b/examples/odeiv/sedov.rb
index 707fb07..3fde9c6 100755
--- a/examples/odeiv/sedov.rb
+++ b/examples/odeiv/sedov.rb
@@ -18,16 +18,16 @@ include Math
 Sedov = Proc.new { |logx, y, dydlogx, sh|
   a = -5.0*(6.0*y[2] - 15.0*y[2]*y[0]*sh + 2.0*y[0]*y[1] - 7.0*y[0]*y[0]*y[1] + 5.0*GSL::pow_3(y[0])*y[1])
   b = -25.0*y[2]*sh + 4.0*y[1] - 20.0*y[0]*y[1] + 25.0*y[0]*y[0]*y[1]
-  dydlogx[0] = a/b             
+  dydlogx[0] = a/b
 
   bb = -5.0*(6.0*y[2] - 15.0*y[2]*y[0]*sh + 2.0*y[0]*y[1] - 7.0*y[0]*y[0]*y[1])
 
   a = -5.0*(-30.0*y[2]*y[1] + 2.0*y[0]*y[1]*y[1] - 25.0*GSL::pow_2(y[0]*y[1]) + 50.0*GSL::pow_3(y[0])*GSL::pow_2(y[1]))
   bb = (-2.0 + 5.0*y[0])*(-25.0*y[2]*sh + 4.0*y[1] - 20.0*y[0]*y[1] + 25.0*y[0]*y[0]*y[1])
-  dydlogx[1] = a/bb       
+  dydlogx[1] = a/bb
 
   a = -5.0*y[2]*(-10.0*y[2]*sh + 4.0*y[1] - 14.0*y[0]*y[1] + 10.0*y[0]*y[0]*y[1] - y[0]*sh*y[1] + 10.0*y[0]*y[0]*sh*y[1])
-  dydlogx[2] = a/b             
+  dydlogx[2] = a/b
 }
 
 DIM = 3
diff --git a/examples/odeiv/whitedwarf.rb b/examples/odeiv/whitedwarf.rb
index a94da40..19987ea 100755
--- a/examples/odeiv/whitedwarf.rb
+++ b/examples/odeiv/whitedwarf.rb
@@ -15,8 +15,8 @@ module Degenerate
   hbar = PLANCKS_CONSTANT_HBAR    # Planck's constant
   me = MASS_ELECTRON              # Electron mass
   mn = MASS_NEUTRON               # Neutron mass
-  mu = UNIFIED_ATOMIC_MASS        
-  c = SPEED_OF_LIGHT            
+  mu = UNIFIED_ATOMIC_MASS
+  c = SPEED_OF_LIGHT
   ELambda = hbar/me/c             # Compton length of electron
   NLambda = hbar/mn/c
   MeC2 = me*c*c                   # Electron rest mass energy
@@ -29,24 +29,24 @@ module Degenerate
     tmp = sqrt(1.0 + x*x)
     (x*tmp*(2.0*x*x/3.0 - 1.0) + log(x + tmp))/8/PI/PI
   end
-  
+
   def chi(x)
     tmp = sqrt(1.0 + x*x)
     (x*tmp*(1.0 + 2*x*x) - log(x + tmp))/8/PI/PI
   end
-  
+
   def xe_rho_mue(rho, mue)
     Factor_xe*GSL::pow(rho/mue, 1.0/3.0)
   end
- 
+
   def xn_rho(rho)
     Factor_xn*GSL::pow(rho, 1.0/3.0)
   end
- 
+
 end
 
 # Polytrope gas sphere
-module Polytrope 
+module Polytrope
 
 # Lane-Emden equation
 #   n: polytrope index
@@ -59,7 +59,7 @@ module Polytrope
     dim = 2
     y = GSL::Vector[1.0, 0.0]
     dydx = GSL::Vector.alloc(dim)
-    
+
     solver = Solver.alloc(Step::RKF45, [1e-6, 0], EmdenEq, dim)
     solver.set_params(n)
     solver.reset
@@ -71,7 +71,7 @@ module Polytrope
     x = 0.0001
     xend = 10.0
     h = 1e-6
-    
+
     file = File.open("polytrope.dat", "w")
     i = 0
     while x < xend
@@ -94,10 +94,10 @@ module Polytrope
     vdy2 = vdy.subvector(0, i)
     spline = GSL::Spline.alloc(GSL::Interp::AKIMA, i)
     spline.init(vy2.reverse, vx2.reverse)
-    
+
 # Find star surface:
 # Star sufrace is defined as the zero point of density structure function
-    x1 = spline.eval(0.0)      
+    x1 = spline.eval(0.0)
     spline.init(vx2, vdy2)
     yx2 = spline.eval(x1).abs
     return [x1, yx2*x1*x1]
diff --git a/examples/permutation/ex1.rb b/examples/permutation/ex1.rb
index b93d053..5754cd2 100755
--- a/examples/permutation/ex1.rb
+++ b/examples/permutation/ex1.rb
@@ -11,12 +11,12 @@ pp.init
 pp.fprintf(STDOUT, " %u")
 printf("\n")
 
-puts(" random permutation:");  
+puts(" random permutation:");
 r.shuffle(pp)
 pp.fprintf(STDOUT, " %u")
 printf("\n");
 
-puts("inverse permutation:");  
+puts("inverse permutation:");
 q = pp.inverse
 q.fprintf(STDOUT, " %u")
 printf ("\n");
diff --git a/examples/permutation/permutation.rb b/examples/permutation/permutation.rb
index dd179c5..d15af08 100755
--- a/examples/permutation/permutation.rb
+++ b/examples/permutation/permutation.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 p = GSL::Permutation::alloc(10)
 p.init
diff --git a/examples/poly/demo.rb b/examples/poly/demo.rb
index 7bac055..bb503c5 100755
--- a/examples/poly/demo.rb
+++ b/examples/poly/demo.rb
@@ -6,7 +6,7 @@ include GSL
 poly = Poly[1.5, -1.25, -3.75, 0, 1]
 # Solve the equation p(x) == 0
 root = poly.solve    # Vector::Complex
-# Extract only the real parts 
+# Extract only the real parts
 # (imaginary parts are zero for this case)
 re = root.real       # Vector::View
 
diff --git a/examples/random/diffusion.rb b/examples/random/diffusion.rb
index 28264b8..d34485f 100755
--- a/examples/random/diffusion.rb
+++ b/examples/random/diffusion.rb
@@ -19,7 +19,7 @@ h[2] = GSL::Histogram.alloc(61, -30, 30)
 
 i = 0
 for n in [6, 50, 100] do
-  M.times do 
+  M.times do
     s = 0
     n.times do
       ds = rng.get%2 == 0 ? 1 : -1
diff --git a/examples/random/generator.rb b/examples/random/generator.rb
index a3601c9..ac8f1f3 100755
--- a/examples/random/generator.rb
+++ b/examples/random/generator.rb
@@ -7,8 +7,8 @@ names = ["default", "mt19937", "mt19937_1999", "mt19937_1998", "ranlxs0", "ranlx
 "gfsr4", "rand", "random_bsd", "random8_bsd", "random32_bsd", "random64_bsd",
 "random128_bsd", "random256_bsd", "random_libc5", "random_glibc2", "rand48", "ran0",
 "ran1", "ran2", "ran3", "ranf", "ranmar", "r250", "tt800", "vax", "transputer",
-"randu", "minstd", "uni", "uni32", "slatec", "zuf", "borosh13", "coveyou", 
-"fishman18", "fishman20", "fishman2x", "knuthran2", "knuthran", "lecuyer21", 
+"randu", "minstd", "uni", "uni32", "slatec", "zuf", "borosh13", "coveyou",
+"fishman18", "fishman20", "fishman2x", "knuthran2", "knuthran", "lecuyer21",
 "waterman14"]
 
 names.each do |name|
diff --git a/examples/random/randomwalk.rb b/examples/random/randomwalk.rb
index d58c1bf..4ba60be 100755
--- a/examples/random/randomwalk.rb
+++ b/examples/random/randomwalk.rb
@@ -17,7 +17,7 @@ sigma = Math::sqrt(N).to_i
 
 h = GSL::Histogram.alloc(8*sigma+1, [-4*sigma-0.5, 4*sigma+0.5])
 
-M.times do 
+M.times do
   s = 0
   N.times do
     ds = rng.get%2 == 0 ? 1 : -1
@@ -27,8 +27,8 @@ M.times do
 end
 
 x = GSL::Vector.linspace(-40, 40, 80)
-y = GSL::Ran::gaussian_pdf(x, sigma)*M*2  
-# Factor 2 is not important, but necessary 
+y = GSL::Ran::gaussian_pdf(x, sigma)*M*2
+# Factor 2 is not important, but necessary
 # because only the even ranges are filled:
 #   a + b = N     a: positive steps, b: negative steps
 #   a - b = s     s: the end point after the N steps
diff --git a/examples/random/rng.rb b/examples/random/rng.rb
index 9ae8b85..ef6942e 100755
--- a/examples/random/rng.rb
+++ b/examples/random/rng.rb
@@ -18,7 +18,7 @@ p r.max
 p r.get
 p r.get
 
-r2 = GSL::Random::Rng.alloc 
+r2 = GSL::Random::Rng.alloc
 p r2.uniform
 p r2.uniform
 
diff --git a/examples/roots/bisection.rb b/examples/roots/bisection.rb
index 5822b13..99421f3 100755
--- a/examples/roots/bisection.rb
+++ b/examples/roots/bisection.rb
@@ -8,7 +8,7 @@ f = GSL::Function.alloc { |x, params|
 }
 f.set_params(1, 0, -5)
 expected = Math::sqrt(5.0)
-printf("%5s [%9s, %9s] %9s %10s %9s\n", 
+printf("%5s [%9s, %9s] %9s %10s %9s\n",
        "iter", "lower", "upper", "root",  "err", "err(est)")
 solver.set(f, 0.0, 5.0)
 iter = 0
diff --git a/examples/roots/brent.rb b/examples/roots/brent.rb
index d44e15c..66bbb96 100755
--- a/examples/roots/brent.rb
+++ b/examples/roots/brent.rb
@@ -19,7 +19,7 @@ f.set_params(1, 0, -5)
 expected = sqrt(5.0)
 
 printf("%5s [%9s, %9s] %9s %10s %9s\n",
-          "iter", "lower", "upper", "root", 
+          "iter", "lower", "upper", "root",
           "err", "err(est)")
 
 solver.set(f, 0.0, 5.0)
diff --git a/examples/roots/demo.rb b/examples/roots/demo.rb
index 1ebd053..c4e6051 100755
--- a/examples/roots/demo.rb
+++ b/examples/roots/demo.rb
@@ -7,7 +7,7 @@ f = GSL::Function.alloc { |x, params|
 }
 f.set_params(1, 0, -5)
 expected = Math::sqrt(5.0)
-printf("%5s [%9s, %9s] %9s %10s %9s\n", "iter", 
+printf("%5s [%9s, %9s] %9s %10s %9s\n", "iter",
        "lower", "upper", "root", "err", "err(est)")
 solver.set(f, 0.0, 5.0)
 iter = 0; status = nil
diff --git a/examples/roots/newton.rb b/examples/roots/newton.rb
index 40d1b08..d1ab75e 100755
--- a/examples/roots/newton.rb
+++ b/examples/roots/newton.rb
@@ -2,14 +2,14 @@
 require("gsl")
 include Math
 
-f = Proc.new { |x, params| 
+f = Proc.new { |x, params|
   a = params[0]
   b = params[1]
   c = params[2]
   (a*x + b)*x + c
 }
 
-df = Proc.new { |x, params| 
+df = Proc.new { |x, params|
   a = params[0]
   b = params[1]
   2.0*a*x + b
diff --git a/examples/roots/recombination.gp b/examples/roots/recombination.gp
index 6af9921..9769b09 100644
--- a/examples/roots/recombination.gp
+++ b/examples/roots/recombination.gp
@@ -9,4 +9,3 @@ set ylabel 'Fractional ionization'
 set x2label 'Temperature of the Universe [K]'
 set grid
 plot 'recombination.dat' u 2:3 title '' w l lw 3, 1 title ''
- 
diff --git a/examples/sf/hyperg.rb b/examples/sf/hyperg.rb
index f9928ff..2a7c033 100755
--- a/examples/sf/hyperg.rb
+++ b/examples/sf/hyperg.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 p GSL::Sf.hyperg_0F1(2, 3)
 r = GSL::Sf.hyperg_0F1_e(2, 3)
diff --git a/examples/sf/sphbessel.rb b/examples/sf/sphbessel.rb
index 1da8f86..2e0f7cd 100755
--- a/examples/sf/sphbessel.rb
+++ b/examples/sf/sphbessel.rb
@@ -19,7 +19,7 @@ File.open("sphbessel.dat", "w") do |file|
     k0 = bessel_k0_scaled(x)
     k1 = bessel_k1_scaled(x)
     k2 = bessel_k2_scaled(x)
-    file.printf("%e %e %e %e %e %e %e %e %e %e %e %e %e %e\n", 
+    file.printf("%e %e %e %e %e %e %e %e %e %e %e %e %e %e\n",
                 x, j0, j1, j2, j3, y0, y1, y2, i0, i1, i2, k0, k1, k2)
     x += 0.1
   end
diff --git a/examples/sort/sort.rb b/examples/sort/sort.rb
index d8c518b..b9c4dcf 100755
--- a/examples/sort/sort.rb
+++ b/examples/sort/sort.rb
@@ -1,5 +1,5 @@
 #!/usr/bin/env ruby
-require("gsl") 
+require("gsl")
 
 N = 100000
 k = 5
diff --git a/examples/tamu_anova.rb b/examples/tamu_anova.rb
index d774fa8..e23f54c 100755
--- a/examples/tamu_anova.rb
+++ b/examples/tamu_anova.rb
@@ -1,16 +1,16 @@
 #!/usr/bin/env ruby
 require("gsl")
 
-data = GSL::Vector[88.60,73.20,91.40,68.00,75.20,63.00,53.90,69.20, 
-50.10,71.50,44.90,59.50,40.20,56.30,38.70,31.00, 
+data = GSL::Vector[88.60,73.20,91.40,68.00,75.20,63.00,53.90,69.20,
+50.10,71.50,44.90,59.50,40.20,56.30,38.70,31.00,
 39.60,45.30,25.20,22.70]
 factor = GSL::Vector::Int[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4]
 
 table = GSL::TAMU_ANOVA::Table.oneway(data, factor, 4)
 table.print
 
-data = GSL::Vector[45.50,45.30,45.40,44.40,44.60,43.90,44.60,44.00,44.20, 
-43.90,44.70,44.20,44.00,43.80,44.60,43.10,46.00,45.90, 
+data = GSL::Vector[45.50,45.30,45.40,44.40,44.60,43.90,44.60,44.00,44.20,
+43.90,44.70,44.20,44.00,43.80,44.60,43.10,46.00,45.90,
 44.80,46.20,45.10,45.50]
 factor = GSL::Vector::Int[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3]
 
diff --git a/examples/vector/add.rb b/examples/vector/add.rb
index 45a33b8..2ced74b 100755
--- a/examples/vector/add.rb
+++ b/examples/vector/add.rb
@@ -23,7 +23,7 @@ a += b
 a
 
 # Subtract b from a
-a -= b 
+a -= b
 
 # Show a
 a
diff --git a/examples/vector/decimate.rb b/examples/vector/decimate.rb
index aee0e8b..156f262 100755
--- a/examples/vector/decimate.rb
+++ b/examples/vector/decimate.rb
@@ -34,5 +34,5 @@ x1 = GSL::Vector.linspace(0, 20, N/DECIMATE1)
 x2 = GSL::Vector.linspace(0, 20, N/DECIMATE2)
 
 # y1 and y2 are shifted vertically for visual purpose
-GSL::graph([x0, y0], [x1, y1-1], [x2, y2-2])  
+GSL::graph([x0, y0], [x1, y1-1], [x2, y2-2])
 END
diff --git a/examples/vector/gnuplot.rb b/examples/vector/gnuplot.rb
index 27ef61c..b82bec2 100755
--- a/examples/vector/gnuplot.rb
+++ b/examples/vector/gnuplot.rb
@@ -9,28 +9,28 @@ require 'gsl/gnuplot';
 # Plot using gnuplot
 Gnuplot.open do |gp|
   Gnuplot::Plot.new( gp ) do |plot|
-  
+
     plot.xrange "[0:10]"
     plot.yrange "[-1.5:1.5]"
     plot.title  "Sin Wave Example"
     plot.xlabel "x"
     plot.ylabel "sin(x)"
     plot.pointsize 3
-    plot.grid 
+    plot.grid
 
     x = GSL::Vector[0..10]
     y = GSL::Sf::sin(x)
 
     plot.data = [
       Gnuplot::DataSet.new( "sin(x)" ) { |ds|
-	ds.with = "lines"
-	ds.title = "String function"
-	ds.linewidth = 4
+        ds.with = "lines"
+        ds.title = "String function"
+        ds.linewidth = 4
       },
-      
+
       Gnuplot::DataSet.new( [x, y] ) { |ds|
-	ds.with = "linespoints"
-	ds.title = "Array data"
+        ds.with = "linespoints"
+        ds.title = "Array data"
       }
     ]
 
diff --git a/examples/vector/vector.rb b/examples/vector/vector.rb
index 3a04784..0d06dfb 100755
--- a/examples/vector/vector.rb
+++ b/examples/vector/vector.rb
@@ -78,8 +78,8 @@ __END__
 
 v = GSL::Vector::alloc(10)
 for i in 1...10 do
-  v.set(i, i.to_f)	
-end	
+  v.set(i, i.to_f)
+end
 v.print
 
 v.swap_elements(3, 5)
diff --git a/examples/wavelet/wavelet1.rb b/examples/wavelet/wavelet1.rb
index 61bb769..fc8abca 100755
--- a/examples/wavelet/wavelet1.rb
+++ b/examples/wavelet/wavelet1.rb
@@ -31,7 +31,7 @@ perm = data2.abs.sort_index
 i = 0
 while (i + nc) < n
   data2[perm[i]] = 0.0
-  i += 1  
+  i += 1
 end
 
 # Choose as you like...
diff --git a/ext/gsl/bspline.c b/ext/gsl/bspline.c
deleted file mode 100644
index d96defe..0000000
--- a/ext/gsl/bspline.c
+++ /dev/null
@@ -1,130 +0,0 @@
-
-#include "include/rb_gsl.h"
-#ifdef GSL_1_9_LATER
-#include "gsl/gsl_bspline.h"
-
-static VALUE cBSWS;
-
-static VALUE rb_gsl_bspline_alloc(VALUE klass, VALUE k, VALUE n)
-{
-	gsl_bspline_workspace *w;
-	w = gsl_bspline_alloc(FIX2INT(k), FIX2INT(n));
-	return Data_Wrap_Struct(klass, 0, gsl_bspline_free, w);
-}
-
-static VALUE rb_gsl_bspline_ncoeffs(VALUE obj)
-{
-	gsl_bspline_workspace *w;
-	Data_Get_Struct(obj, gsl_bspline_workspace, w);
-	return INT2FIX((int)gsl_bspline_ncoeffs(w));
-}
-static VALUE rb_gsl_bspline_order(VALUE obj)
-{
-	gsl_bspline_workspace *w;
-	Data_Get_Struct(obj, gsl_bspline_workspace, w);
-	return INT2FIX((int)gsl_bspline_order(w));
-}
-static VALUE rb_gsl_bspline_nbreak(VALUE obj)
-{
-	gsl_bspline_workspace *w;
-	Data_Get_Struct(obj, gsl_bspline_workspace, w);
-	return INT2FIX((int)gsl_bspline_nbreak(w));
-}
-static VALUE rb_gsl_bspline_breakpoint(VALUE obj, VALUE i)
-{
-	gsl_bspline_workspace *w;
-	Data_Get_Struct(obj, gsl_bspline_workspace, w);
-	return rb_float_new(gsl_bspline_breakpoint(FIX2INT(i), w));
-}
-static VALUE rb_gsl_bspline_knots(VALUE obj, VALUE b)
-{
-	gsl_bspline_workspace *w;
-	gsl_vector *bpts;
-	CHECK_VECTOR(b);
-	Data_Get_Struct(obj, gsl_bspline_workspace, w);
-	Data_Get_Struct(b, gsl_vector, bpts);
-	gsl_bspline_knots(bpts, w);
-	return Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, w->knots);
-}
-static VALUE rb_gsl_bspline_knots_uniform(int argc, VALUE *argv, VALUE obj)
-{
-	gsl_bspline_workspace *w;
-	int argc2;
-	switch (TYPE(obj)) {
-  case T_MODULE:
-  case T_CLASS:
-  case T_OBJECT:
-    if (!rb_obj_is_kind_of(argv[argc-1], cBSWS)) {
-      rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::BSpline expected)",
-        rb_class2name(CLASS_OF(argv[argc-1])));
-    }    
-    Data_Get_Struct(argv[argc-1], gsl_bspline_workspace, w);
-    argc2 = argc-1;
-    break;
-  default:
-    Data_Get_Struct(obj, gsl_bspline_workspace, w);  	
-    argc2 = argc;
-	}
-  if (argc2 != 2) rb_raise(rb_eArgError, "Wrong number of arguments.");
-	gsl_bspline_knots_uniform(NUM2DBL(argv[0]), NUM2DBL(argv[1]), w);
-	return Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, w->knots);	
-}
-static VALUE rb_gsl_bspline_eval(int argc, VALUE *argv, VALUE obj)
-{
-	gsl_bspline_workspace *w;
-	double x;
-	gsl_vector *B;
-	VALUE vB;
-
-	Data_Get_Struct(obj, gsl_bspline_workspace, w);
-
-	switch (argc) {
-	case 2:
-		CHECK_VECTOR(argv[1]);
-		Data_Get_Struct(argv[1], gsl_vector, B);
-		vB = argv[1];
-		x = NUM2DBL(argv[0]);	
-		break;
-	case 1:
-		x = NUM2DBL(argv[0]);
-		B = gsl_vector_alloc(w->nbreak+w->k-2);
-		vB = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, B);
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
-	}
-
-	gsl_bspline_eval(x, B, w);
-
-	return vB;
-}
-#ifdef GSL_1_13_LATER
-static VALUE rb_gsl_bspline_greville_abscissa(VALUE obj, VALUE i)
-{
-  gsl_bspline_workspace *w;
-  Data_Get_Struct(obj, gsl_bspline_workspace, w);
-  return rb_float_new(gsl_bspline_greville_abscissa(i, w));
-}
-#endif
-
-void Init_bspline(VALUE module)
-{
-  cBSWS = rb_define_class_under(module, "BSpline", cGSL_Object);
-  
-  rb_define_singleton_method(cBSWS, "alloc", rb_gsl_bspline_alloc, 2);
-  
-  rb_define_method(cBSWS, "ncoeffs", rb_gsl_bspline_ncoeffs, 0);
-  rb_define_method(cBSWS, "order", rb_gsl_bspline_order, 0);
-  rb_define_method(cBSWS, "nbreak", rb_gsl_bspline_nbreak, 0);
-  rb_define_method(cBSWS, "breakpoint", rb_gsl_bspline_breakpoint, 1);
-  rb_define_method(cBSWS, "knots", rb_gsl_bspline_knots, 1);
-  rb_define_method(cBSWS, "knots_uniform", rb_gsl_bspline_knots_uniform, -1);
-  rb_define_singleton_method(cBSWS, "knots_uniform", rb_gsl_bspline_knots_uniform, -1);	
-  rb_define_method(cBSWS, "eval", rb_gsl_bspline_eval, -1);	
-
-#ifdef GSL_1_13_LATER
-  rb_define_method(cBSWS, "greville_abscissa", rb_gsl_bspline_greville_abscissa, 1);
-#endif
-
-}
-#endif
diff --git a/ext/gsl/const.c b/ext/gsl/const.c
deleted file mode 100644
index 8e3cbbe..0000000
--- a/ext/gsl/const.c
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
-  const.c
-  Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
-    (C) Copyright 2001-2006 by Yoshiki Tsunesada
-
-  Ruby/GSL is free software: you can redistribute it and/or modify it
-  under the terms of the GNU General Public License.
-  This library is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY.
-*/
-
-#include "include/rb_gsl_const.h"
-
-static void rb_gsl_const_mks(VALUE module);
-static void rb_gsl_const_cgs(VALUE module);
-static void rb_gsl_const_num(VALUE module);
-void Init_gsl_const_additional(VALUE mmks, VALUE mcgs, VALUE mnum);
-
-#ifndef GSL_1_4_LATER
-static void rb_gsl_const_mks(VALUE module)
-{
-  rb_define_const(module, "SPEED_OF_LIGHT", 
-		  rb_float_new(GSL_CONST_MKS_SPEED_OF_LIGHT));
-  rb_define_const(module, "GRAVITATIONAL_CONSTANT", 
-		  rb_float_new(GSL_CONST_MKS_GRAVITATIONAL_CONSTANT));
-  rb_define_const(module, "PLANCKS_CONSTANT_H", 
-		  rb_float_new(GSL_CONST_MKS_PLANCKS_CONSTANT_H));
-  rb_define_const(module, "PLANCKS_CONSTANT_HBAR", 
-		  rb_float_new(GSL_CONST_MKS_PLANCKS_CONSTANT_HBAR));
-  rb_define_const(module, "VACUUM_PERMEABILITY", 
-		  rb_float_new(GSL_CONST_MKS_VACUUM_PERMEABILITY));
-  rb_define_const(module, "ASTRONOMICAL_UNIT", 
-		  rb_float_new(GSL_CONST_MKS_ASTRONOMICAL_UNIT));
-  rb_define_const(module, "LIGHT_YEAR", rb_float_new(GSL_CONST_MKS_LIGHT_YEAR));
-  rb_define_const(module, "PARSEC", rb_float_new(GSL_CONST_MKS_PARSEC));
-  rb_define_const(module, "GRAV_ACCEL", rb_float_new(GSL_CONST_MKS_GRAV_ACCEL));
-  rb_define_const(module, "ELECTRON_VOLT", 
-		  rb_float_new(GSL_CONST_MKS_ELECTRON_VOLT));
-  rb_define_const(module, "MASS_ELECTRON", 
-		  rb_float_new(GSL_CONST_MKS_MASS_ELECTRON));
-  rb_define_const(module, "MASS_MUON", rb_float_new(GSL_CONST_MKS_MASS_MUON));
-  rb_define_const(module, "MASS_PROTON", rb_float_new(GSL_CONST_MKS_MASS_PROTON));
-  rb_define_const(module, "MASS_NEUTRON", rb_float_new(GSL_CONST_MKS_MASS_NEUTRON));
-  rb_define_const(module, "RYDBERG", rb_float_new(GSL_CONST_MKS_RYDBERG));
-  rb_define_const(module, "BOLTZMANN", rb_float_new(GSL_CONST_MKS_BOLTZMANN));
-  rb_define_const(module, "MOLAR_GAS", rb_float_new(GSL_CONST_MKS_MOLAR_GAS));
-  rb_define_const(module, "BOHR_MAGNETON", 
-		  rb_float_new(GSL_CONST_MKS_BOHR_MAGNETON));
-  rb_define_const(module, "NUCLEAR_MAGNETON",
-		  rb_float_new(GSL_CONST_MKS_NUCLEAR_MAGNETON));
-  rb_define_const(module, "ELECTRON_MAGNETIC_MOMENT", 
-		  rb_float_new(GSL_CONST_MKS_ELECTRON_MAGNETIC_MOMENT));
-  rb_define_const(module, "PROTON_MAGNETIC_MOMENT", 
-		  rb_float_new(GSL_CONST_MKS_PROTON_MAGNETIC_MOMENT));
-  rb_define_const(module, "STANDARD_GAS_VOLUME", 
-		  rb_float_new(GSL_CONST_MKS_STANDARD_GAS_VOLUME));
-
-  rb_define_const(module, "MINUTE", rb_float_new(GSL_CONST_MKS_MINUTE));
-  rb_define_const(module, "HOUR", rb_float_new(GSL_CONST_MKS_HOUR));
-  rb_define_const(module, "DAY", rb_float_new(GSL_CONST_MKS_DAY));
-  rb_define_const(module, "WEEK", rb_float_new(GSL_CONST_MKS_WEEK));
-  rb_define_const(module, "INCH", rb_float_new(GSL_CONST_MKS_INCH));
-  rb_define_const(module, "FOOT", rb_float_new(GSL_CONST_MKS_FOOT));
-  rb_define_const(module, "YARD", rb_float_new(GSL_CONST_MKS_YARD));
-  rb_define_const(module, "MILE", rb_float_new(GSL_CONST_MKS_MILE));
-  rb_define_const(module, "NAUTICAL_MILE", rb_float_new(GSL_CONST_MKS_NAUTICAL_MILE));
-  rb_define_const(module, "FATHOM", rb_float_new(GSL_CONST_MKS_FATHOM));
-  rb_define_const(module, "MIL", rb_float_new(GSL_CONST_MKS_MIL));
-  rb_define_const(module, "POINT", rb_float_new(GSL_CONST_MKS_POINT));
-  rb_define_const(module, "TEXPOINT", rb_float_new(GSL_CONST_MKS_TEXPOINT));
-  rb_define_const(module, "MICRON", rb_float_new(GSL_CONST_MKS_MICRON));
-  rb_define_const(module, "ANGSTROM", rb_float_new(GSL_CONST_MKS_ANGSTROM));
-  rb_define_const(module, "HECTARE", rb_float_new(GSL_CONST_MKS_HECTARE));
-  rb_define_const(module, "ACRE", rb_float_new(GSL_CONST_MKS_ACRE));
-#ifdef GSL_0_9_4_LATER
-  rb_define_const(module, "BARN", rb_float_new(GSL_CONST_MKS_BARN));
-  rb_define_const(module, "BTU", rb_float_new(GSL_CONST_MKS_BTU));
-  rb_define_const(module, "SOLAR_MASS", rb_float_new(GSL_CONST_MKS_SOLAR_MASS));
-#else
-  rb_define_const(module, "BARN", rb_float_new(1.0e-28));
-  rb_define_const(module, "BTU", rb_float_new(1.05505585262e3));
-#endif
-  rb_define_const(module, "LITER", rb_float_new(GSL_CONST_MKS_LITER));
-  rb_define_const(module, "US_GALLON", rb_float_new(GSL_CONST_MKS_US_GALLON));
-  rb_define_const(module, "QUART", rb_float_new(GSL_CONST_MKS_QUART));
-  rb_define_const(module, "PINT", rb_float_new(GSL_CONST_MKS_PINT));
-  rb_define_const(module, "CUP", rb_float_new(GSL_CONST_MKS_CUP));
-  rb_define_const(module, "FLUID_OUNCE", rb_float_new(GSL_CONST_MKS_FLUID_OUNCE));
-  rb_define_const(module, "TABLESPOON", rb_float_new(GSL_CONST_MKS_TABLESPOON));
-  rb_define_const(module, "CANADIAN_GALLON", 
-		  rb_float_new(GSL_CONST_MKS_CANADIAN_GALLON));
-
-  rb_define_const(module, "UK_GALLON", rb_float_new(GSL_CONST_MKS_UK_GALLON));
-  rb_define_const(module, "KILOMETERS_PER_HOUR", 
-		  rb_float_new(GSL_CONST_MKS_MILES_PER_HOUR));  
-  rb_define_const(module, "MILES_PER_HOUR", 
-		  rb_float_new(GSL_CONST_MKS_KILOMETERS_PER_HOUR));
-  rb_define_const(module, "KNOT", rb_float_new(GSL_CONST_MKS_KNOT));
-  rb_define_const(module, "POUND_MASS", rb_float_new(GSL_CONST_MKS_POUND_MASS));
-  rb_define_const(module, "POUND_OUNCE", rb_float_new(GSL_CONST_MKS_OUNCE_MASS));
-  rb_define_const(module, "POUND_TON", rb_float_new(GSL_CONST_MKS_TON));
-  rb_define_const(module, "POUND_METRIC_TON", 
-		  rb_float_new(GSL_CONST_MKS_METRIC_TON));
-  rb_define_const(module, "POUND_UK_TON", rb_float_new(GSL_CONST_MKS_UK_TON));
-  rb_define_const(module, "POUND_TROY_OUNCE", 
-		  rb_float_new(GSL_CONST_MKS_TROY_OUNCE));
-  rb_define_const(module, "CARAT", rb_float_new(GSL_CONST_MKS_CARAT));
-  rb_define_const(module, "UNIFIED_ATOMIC_MASS", 
-		  rb_float_new(GSL_CONST_MKS_UNIFIED_ATOMIC_MASS));
-  rb_define_const(module, "GRAM_FORCE", rb_float_new(GSL_CONST_MKS_GRAM_FORCE));
-  rb_define_const(module, "POUND_FORCE", rb_float_new(GSL_CONST_MKS_POUND_FORCE));
-  rb_define_const(module, "KILOPOUND_FORCE", 
-		  rb_float_new(GSL_CONST_MKS_KILOPOUND_FORCE));
-  rb_define_const(module, "POUNDAL", rb_float_new(GSL_CONST_MKS_POUNDAL));
-  rb_define_const(module, "CALORIE", rb_float_new(GSL_CONST_MKS_CALORIE));
-  rb_define_const(module, "THERM", rb_float_new(GSL_CONST_MKS_THERM));
-  rb_define_const(module, "HORSEPOWER", rb_float_new(GSL_CONST_MKS_HORSEPOWER));
-  rb_define_const(module, "BAR", rb_float_new(GSL_CONST_MKS_BAR));
-  rb_define_const(module, "STD_ATMOSPHERE", 
-		  rb_float_new(GSL_CONST_MKS_STD_ATMOSPHERE));
-  rb_define_const(module, "TORR", rb_float_new(GSL_CONST_MKS_TORR));
-  rb_define_const(module, "METER_OF_MERCURY", 
-		  rb_float_new(GSL_CONST_MKS_METER_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_MERCURY", 
-		  rb_float_new(GSL_CONST_MKS_INCH_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_WATER", 
-		  rb_float_new(GSL_CONST_MKS_INCH_OF_WATER));
-  rb_define_const(module, "PSI", rb_float_new(GSL_CONST_MKS_PSI));
-  rb_define_const(module, "POISE", rb_float_new(GSL_CONST_MKS_POISE));
-  rb_define_const(module, "STOKES", rb_float_new(GSL_CONST_MKS_STOKES));
-  rb_define_const(module, "FARADAY", rb_float_new(GSL_CONST_MKS_FARADAY));
-  rb_define_const(module, "ELECTRON_CHARGE", 
-		  rb_float_new(GSL_CONST_MKS_ELECTRON_CHARGE));
-  rb_define_const(module, "GAUSS", rb_float_new(GSL_CONST_MKS_GAUSS));
-  rb_define_const(module, "STILB", rb_float_new(GSL_CONST_MKS_STILB));
-  rb_define_const(module, "LUMEN", rb_float_new(GSL_CONST_MKS_LUMEN));
-  rb_define_const(module, "LUX", rb_float_new(GSL_CONST_MKS_LUX));
-  rb_define_const(module, "PHOT", rb_float_new(GSL_CONST_MKS_PHOT));
-  rb_define_const(module, "FOOTCANDLE", rb_float_new(GSL_CONST_MKS_FOOTCANDLE));
-  rb_define_const(module, "LAMBERT", rb_float_new(GSL_CONST_MKS_LAMBERT));
-  rb_define_const(module, "CURIE", rb_float_new(GSL_CONST_MKS_CURIE));
-  rb_define_const(module, "ROENTGEN", rb_float_new(GSL_CONST_MKS_ROENTGEN));
-  rb_define_const(module, "RAD", rb_float_new(GSL_CONST_MKS_RAD));
-
-#ifdef GSL_1_1_LATER
-  rb_define_const(module, "VACUUM_PERMITTIVITY", 
-		  rb_float_new(GSL_CONST_MKS_VACUUM_PERMITTIVITY));
-  rb_define_const(module, "BOHR_RADIUS", rb_float_new(GSL_CONST_MKS_BOHR_RADIUS));
-#endif
-
-#ifdef GSL_1_2_LATER
-  rb_define_const(module, "NEWTON", rb_float_new(GSL_CONST_MKS_NEWTON));
-  rb_define_const(module, "DYNE", rb_float_new(GSL_CONST_MKS_DYNE));
-  rb_define_const(module, "JOULE", rb_float_new(GSL_CONST_MKS_JOULE));
-  rb_define_const(module, "ERG", rb_float_new(GSL_CONST_MKS_ERG));
-#endif
-
-#ifdef GSL_1_8_LATER
-  rb_define_const(module, "DEBYE", rb_float_new(GSL_CONST_MKS_DEBYE));
-#endif
-
-}
-
-static void rb_gsl_const_cgs(VALUE module)
-{
-  rb_define_const(module, "SPEED_OF_LIGHT", 
-		  rb_float_new(GSL_CONST_CGS_SPEED_OF_LIGHT));
-  rb_define_const(module, "GRAVITATIONAL_CONSTANT", 
-		  rb_float_new(GSL_CONST_CGS_GRAVITATIONAL_CONSTANT));
-  rb_define_const(module, "PLANCKS_CONSTANT_H", 
-		  rb_float_new(GSL_CONST_CGS_PLANCKS_CONSTANT_H));
-  rb_define_const(module, "PLANCKS_CONSTANT_HBAR", 
-		  rb_float_new(GSL_CONST_CGS_PLANCKS_CONSTANT_HBAR));
-  rb_define_const(module, "ASTRONOMICAL_UNIT", 
-		  rb_float_new(GSL_CONST_CGS_ASTRONOMICAL_UNIT));
-  rb_define_const(module, "LIGHT_YEAR", rb_float_new(GSL_CONST_CGS_LIGHT_YEAR));
-  rb_define_const(module, "PARSEC", rb_float_new(GSL_CONST_CGS_PARSEC));
-  rb_define_const(module, "GRAV_ACCEL", rb_float_new(GSL_CONST_CGS_GRAV_ACCEL));
-  rb_define_const(module, "ELECTRON_VOLT", 
-		  rb_float_new(GSL_CONST_CGS_ELECTRON_VOLT));
-  rb_define_const(module, "MASS_ELECTRON", 
-		  rb_float_new(GSL_CONST_CGS_MASS_ELECTRON));
-  rb_define_const(module, "MASS_MUON", rb_float_new(GSL_CONST_CGS_MASS_MUON));
-  rb_define_const(module, "MASS_PROTON", 
-		  rb_float_new(GSL_CONST_CGS_MASS_PROTON));
-  rb_define_const(module, "MASS_NEUTRON", rb_float_new(GSL_CONST_CGS_MASS_NEUTRON));
-  rb_define_const(module, "RYDBERG", rb_float_new(GSL_CONST_CGS_RYDBERG));
-  rb_define_const(module, "BOHR_MAGNETON", 
-		  rb_float_new(GSL_CONST_CGS_BOHR_MAGNETON));
-
-  rb_define_const(module, "NUCLEAR_MAGNETON", 
-		  rb_float_new(GSL_CONST_CGS_NUCLEAR_MAGNETON));
-  rb_define_const(module, "ELECTRON_MAGNETIC_MOMENT", 
-		  rb_float_new(GSL_CONST_CGS_ELECTRON_MAGNETIC_MOMENT));
-  rb_define_const(module, "PROTON_MAGNETIC_MOMENT", 
-		  rb_float_new(GSL_CONST_CGS_PROTON_MAGNETIC_MOMENT));
-  rb_define_const(module, "STANDARD_GAS_VOLUME", 
-		  rb_float_new(GSL_CONST_CGS_STANDARD_GAS_VOLUME));
-
-  rb_define_const(module, "MINUTE", rb_float_new(GSL_CONST_CGS_MINUTE));
-  rb_define_const(module, "HOUR", rb_float_new(GSL_CONST_CGS_HOUR));
-  rb_define_const(module, "DAY", rb_float_new(GSL_CONST_CGS_DAY));
-  rb_define_const(module, "WEEK", rb_float_new(GSL_CONST_CGS_WEEK));
-  rb_define_const(module, "INCH", rb_float_new(GSL_CONST_CGS_INCH));
-  rb_define_const(module, "FOOT", rb_float_new(GSL_CONST_CGS_FOOT));
-  rb_define_const(module, "YARD", rb_float_new(GSL_CONST_CGS_YARD));
-  rb_define_const(module, "MILE", rb_float_new(GSL_CONST_CGS_MILE));
-  rb_define_const(module, "NAUTICAL_MILE", 
-		  rb_float_new(GSL_CONST_CGS_NAUTICAL_MILE));
-  rb_define_const(module, "FATHOM", rb_float_new(GSL_CONST_CGS_FATHOM));
-  rb_define_const(module, "MIL", rb_float_new(GSL_CONST_CGS_MIL));
-  rb_define_const(module, "POINT", rb_float_new(GSL_CONST_CGS_POINT));
-  rb_define_const(module, "TEXPOINT", rb_float_new(GSL_CONST_CGS_TEXPOINT));
-  rb_define_const(module, "MICRON", rb_float_new(GSL_CONST_CGS_MICRON));
-  rb_define_const(module, "ANGSTROM", rb_float_new(GSL_CONST_CGS_ANGSTROM));
-  rb_define_const(module, "HECTARE", rb_float_new(GSL_CONST_CGS_HECTARE));
-  rb_define_const(module, "ACRE", rb_float_new(GSL_CONST_CGS_ACRE));
-#ifdef GSL_0_9_4_LATER
-  rb_define_const(module, "BARN", rb_float_new(GSL_CONST_CGS_BARN));
-  rb_define_const(module, "BTU", rb_float_new(GSL_CONST_CGS_BTU));
-  rb_define_const(module, "SOLAR_MASS", rb_float_new(GSL_CONST_CGS_SOLAR_MASS));
-#else
-  rb_define_const(module, "BARN", rb_float_new(1e-24));
-  rb_define_const(module, "BTU", rb_float_new(1.05505585262e10));
-#endif
-  rb_define_const(module, "LITER", rb_float_new(GSL_CONST_CGS_LITER));
-  rb_define_const(module, "US_GALLON", rb_float_new(GSL_CONST_CGS_US_GALLON));
-  rb_define_const(module, "QUART", rb_float_new(GSL_CONST_CGS_QUART));
-  rb_define_const(module, "PINT", rb_float_new(GSL_CONST_CGS_PINT));
-  rb_define_const(module, "CUP", rb_float_new(GSL_CONST_CGS_CUP));
-  rb_define_const(module, "FLUID_OUNCE", rb_float_new(GSL_CONST_CGS_FLUID_OUNCE));
-  rb_define_const(module, "TABLESPOON", rb_float_new(GSL_CONST_CGS_TABLESPOON));
-  rb_define_const(module, "CANADIAN_GALLON", 
-		  rb_float_new(GSL_CONST_CGS_CANADIAN_GALLON));
-
-  rb_define_const(module, "UK_GALLON", rb_float_new(GSL_CONST_CGS_UK_GALLON));
-  rb_define_const(module, "KILOMETERS_PER_HOUR", 
-		  rb_float_new(GSL_CONST_CGS_MILES_PER_HOUR)); 
-  rb_define_const(module, "MILES_PER_HOUR", 
-		  rb_float_new(GSL_CONST_CGS_KILOMETERS_PER_HOUR));
-  rb_define_const(module, "KNOT", rb_float_new(GSL_CONST_CGS_KNOT));
-  rb_define_const(module, "POUND_MASS", rb_float_new(GSL_CONST_CGS_POUND_MASS));
-  rb_define_const(module, "POUND_OUNCE", rb_float_new(GSL_CONST_CGS_OUNCE_MASS));
-  rb_define_const(module, "POUND_TON", rb_float_new(GSL_CONST_CGS_TON));
-  rb_define_const(module, "POUND_METRIC_TON", 
-		  rb_float_new(GSL_CONST_CGS_METRIC_TON));
-  rb_define_const(module, "POUND_UK_TON", rb_float_new(GSL_CONST_CGS_UK_TON));
-  rb_define_const(module, "POUND_TROY_OUNCE", 
-		  rb_float_new(GSL_CONST_CGS_TROY_OUNCE));
-  rb_define_const(module, "CARAT", rb_float_new(GSL_CONST_CGS_CARAT));
-  rb_define_const(module, "UNIFIED_ATOMIC_MASS", 
-		  rb_float_new(GSL_CONST_CGS_UNIFIED_ATOMIC_MASS));
-  rb_define_const(module, "GRAM_FORCE", rb_float_new(GSL_CONST_CGS_GRAM_FORCE));
-  rb_define_const(module, "POUND_FORCE", rb_float_new(GSL_CONST_CGS_POUND_FORCE));
-  rb_define_const(module, "KILOPOUND_FORCE", 
-		  rb_float_new(GSL_CONST_CGS_KILOPOUND_FORCE));
-  rb_define_const(module, "POUNDAL", rb_float_new(GSL_CONST_CGS_POUNDAL));
-  rb_define_const(module, "CALORIE", rb_float_new(GSL_CONST_CGS_CALORIE));
-  rb_define_const(module, "THERM", rb_float_new(GSL_CONST_CGS_THERM));
-  rb_define_const(module, "HORSEPOWER", rb_float_new(GSL_CONST_CGS_HORSEPOWER));
-  rb_define_const(module, "BAR", rb_float_new(GSL_CONST_CGS_BAR));
-  rb_define_const(module, "STD_ATMOSPHERE", 
-		  rb_float_new(GSL_CONST_CGS_STD_ATMOSPHERE));
-  rb_define_const(module, "TORR", rb_float_new(GSL_CONST_CGS_TORR));
-  rb_define_const(module, "METER_OF_MERCURY",
-		  rb_float_new(GSL_CONST_CGS_METER_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_MERCURY", 
-		  rb_float_new(GSL_CONST_CGS_INCH_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_WATER", 
-		  rb_float_new(GSL_CONST_CGS_INCH_OF_WATER));
-  rb_define_const(module, "PSI", rb_float_new(GSL_CONST_CGS_PSI));
-  rb_define_const(module, "POISE", rb_float_new(GSL_CONST_CGS_POISE));
-  rb_define_const(module, "STOKES", rb_float_new(GSL_CONST_CGS_STOKES));
-  rb_define_const(module, "FARADAY", rb_float_new(GSL_CONST_CGS_FARADAY));
-  rb_define_const(module, "ELECTRON_CHARGE", 
-		  rb_float_new(GSL_CONST_CGS_ELECTRON_CHARGE));
-  rb_define_const(module, "ELECTRON_CHARGE_ESU",
-		  rb_float_new(GSL_CONST_CGS_ELECTRON_CHARGE*GSL_CONST_CGS_SPEED_OF_LIGHT));
-  rb_define_const(module, "GAUSS", rb_float_new(GSL_CONST_CGS_GAUSS));
-  rb_define_const(module, "STILB", rb_float_new(GSL_CONST_CGS_STILB));
-  rb_define_const(module, "LUMEN", rb_float_new(GSL_CONST_CGS_LUMEN));
-  rb_define_const(module, "LUX", rb_float_new(GSL_CONST_CGS_LUX));
-  rb_define_const(module, "PHOT", rb_float_new(GSL_CONST_CGS_PHOT));
-  rb_define_const(module, "FOOTCANDLE", rb_float_new(GSL_CONST_CGS_FOOTCANDLE));
-  rb_define_const(module, "LAMBERT", rb_float_new(GSL_CONST_CGS_LAMBERT));
-  rb_define_const(module, "CURIE", rb_float_new(GSL_CONST_CGS_CURIE));
-  rb_define_const(module, "ROENTGEN", rb_float_new(GSL_CONST_CGS_ROENTGEN));
-  rb_define_const(module, "RAD", rb_float_new(GSL_CONST_CGS_RAD));
-
-  rb_define_const(module, "BOLTZMANN", rb_float_new(GSL_CONST_CGS_BOLTZMANN));
-  rb_define_const(module, "MOLAR_GAS", rb_float_new(GSL_CONST_CGS_MOLAR_GAS));
-
-#ifdef GSL_1_1_LATER
-  rb_define_const(module, "BOHR_RADIUS", rb_float_new(GSL_CONST_CGS_BOHR_RADIUS));
-#endif
-#ifdef GSL_1_2_LATER
-  rb_define_const(module, "NEWTON", rb_float_new(GSL_CONST_CGS_NEWTON));
-  rb_define_const(module, "DYNE", rb_float_new(GSL_CONST_CGS_DYNE));
-  rb_define_const(module, "JOULE", rb_float_new(GSL_CONST_CGS_JOULE));
-  rb_define_const(module, "ERG", rb_float_new(GSL_CONST_CGS_ERG));
-#endif
-
-}
-
-static void rb_gsl_const_num(VALUE module)
-{
-  rb_define_const(module, "AVOGADRO", rb_float_new(GSL_CONST_NUM_AVOGADRO));
-  rb_define_const(module, "FINE_STRUCTURE", 
-		  rb_float_new(GSL_CONST_NUM_FINE_STRUCTURE));
-#ifdef GSL_1_2_LATER
-  rb_define_const(module, "YOTTA", rb_float_new(GSL_CONST_NUM_YOTTA));
-  rb_define_const(module, "ZETTA", rb_float_new(GSL_CONST_NUM_ZETTA));
-  rb_define_const(module, "EXA", rb_float_new(GSL_CONST_NUM_EXA));
-  rb_define_const(module, "PETA", rb_float_new(GSL_CONST_NUM_PETA));
-  rb_define_const(module, "TERA", rb_float_new(GSL_CONST_NUM_TERA));
-  rb_define_const(module, "GIGA", rb_float_new(GSL_CONST_NUM_GIGA));
-  rb_define_const(module, "MEGA", rb_float_new(GSL_CONST_NUM_MEGA));
-  rb_define_const(module, "KILO", rb_float_new(GSL_CONST_NUM_KILO));
-  rb_define_const(module, "MILLI", rb_float_new(GSL_CONST_NUM_MILLI));
-  rb_define_const(module, "MICRO", rb_float_new(GSL_CONST_NUM_MICRO));
-  rb_define_const(module, "NANO", rb_float_new(GSL_CONST_NUM_NANO));
-  rb_define_const(module, "PICO", rb_float_new(GSL_CONST_NUM_PICO));
-  rb_define_const(module, "FEMTO", rb_float_new(GSL_CONST_NUM_FEMTO));
-  rb_define_const(module, "ATTO", rb_float_new(GSL_CONST_NUM_ATTO));
-  rb_define_const(module, "ZEPTO", rb_float_new(GSL_CONST_NUM_ZEPTO));
-  rb_define_const(module, "YOCTO", rb_float_new(GSL_CONST_NUM_YOCTO));
-#endif
-}
-
-void Init_gsl_const(VALUE module)
-{
-  VALUE mgsl_const;
-  VALUE mgsl_const_mks, mgsl_const_cgs, mgsl_const_num;
-
-  mgsl_const = rb_define_module_under(module, "CONST");
-  mgsl_const_mks = rb_define_module_under(mgsl_const, "MKSA");
-  rb_gsl_const_mks(mgsl_const_mks);
-  mgsl_const_cgs = rb_define_module_under(mgsl_const, "CGSM");
-  rb_gsl_const_cgs(mgsl_const_cgs);
-  mgsl_const_num = rb_define_module_under(mgsl_const, "NUM");
-  rb_gsl_const_num(mgsl_const_num);
-  Init_gsl_const_additional(mgsl_const_mks, mgsl_const_cgs, mgsl_const_num);
-}
-
-#else
-
-static void rb_gsl_const_mks(VALUE module)
-{
-  rb_define_const(module, "SPEED_OF_LIGHT", 
-		  rb_float_new(GSL_CONST_MKSA_SPEED_OF_LIGHT));
-  rb_define_const(module, "GRAVITATIONAL_CONSTANT", 
-		  rb_float_new(GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT));
-  rb_define_const(module, "PLANCKS_CONSTANT_H",
-		  rb_float_new(GSL_CONST_MKSA_PLANCKS_CONSTANT_H));
-  rb_define_const(module, "PLANCKS_CONSTANT_HBAR",
-		  rb_float_new(GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR));
-  rb_define_const(module, "VACUUM_PERMEABILITY", 
-		  rb_float_new(GSL_CONST_MKSA_VACUUM_PERMEABILITY));
-  rb_define_const(module, "VACUUM_PERMITTIVITY",
-		  rb_float_new(GSL_CONST_MKSA_VACUUM_PERMITTIVITY));
-  rb_define_const(module, "ASTRONOMICAL_UNIT", 
-		  rb_float_new(GSL_CONST_MKSA_ASTRONOMICAL_UNIT));
-  rb_define_const(module, "LIGHT_YEAR", rb_float_new(GSL_CONST_MKSA_LIGHT_YEAR));
-  rb_define_const(module, "PARSEC", rb_float_new(GSL_CONST_MKSA_PARSEC));
-  rb_define_const(module, "GRAV_ACCEL", rb_float_new(GSL_CONST_MKSA_GRAV_ACCEL));
-  rb_define_const(module, "ELECTRON_VOLT", 
-		  rb_float_new(GSL_CONST_MKSA_ELECTRON_VOLT));
-  rb_define_const(module, "MASS_ELECTRON", 
-		  rb_float_new(GSL_CONST_MKSA_MASS_ELECTRON));
-  rb_define_const(module, "MASS_MUON", rb_float_new(GSL_CONST_MKSA_MASS_MUON));
-  rb_define_const(module, "MASS_PROTON", rb_float_new(GSL_CONST_MKSA_MASS_PROTON));
-  rb_define_const(module, "MASS_NEUTRON", rb_float_new(GSL_CONST_MKSA_MASS_NEUTRON));
-  rb_define_const(module, "RYDBERG", rb_float_new(GSL_CONST_MKSA_RYDBERG));
-  rb_define_const(module, "BOHR_MAGNETON", 
-		  rb_float_new(GSL_CONST_MKSA_BOHR_MAGNETON));
-  rb_define_const(module, "NUCLEAR_MAGNETON",
-		  rb_float_new(GSL_CONST_MKSA_NUCLEAR_MAGNETON));
-  rb_define_const(module, "ELECTRON_MAGNETIC_MOMENT",
-		  rb_float_new(GSL_CONST_MKSA_ELECTRON_MAGNETIC_MOMENT));
-  rb_define_const(module, "PROTON_MAGNETIC_MOMENT", 
-		  rb_float_new(GSL_CONST_MKSA_PROTON_MAGNETIC_MOMENT));
-  rb_define_const(module, "STANDARD_GAS_VOLUME", 
-		  rb_float_new(GSL_CONST_MKSA_STANDARD_GAS_VOLUME));
-
-  rb_define_const(module, "MINUTE", rb_float_new(GSL_CONST_MKSA_MINUTE));
-  rb_define_const(module, "HOUR", rb_float_new(GSL_CONST_MKSA_HOUR));
-  rb_define_const(module, "DAY", rb_float_new(GSL_CONST_MKSA_DAY));
-  rb_define_const(module, "WEEK", rb_float_new(GSL_CONST_MKSA_WEEK));
-  rb_define_const(module, "INCH", rb_float_new(GSL_CONST_MKSA_INCH));
-  rb_define_const(module, "FOOT", rb_float_new(GSL_CONST_MKSA_FOOT));
-  rb_define_const(module, "YARD", rb_float_new(GSL_CONST_MKSA_YARD));
-  rb_define_const(module, "MILE", rb_float_new(GSL_CONST_MKSA_MILE));
-  rb_define_const(module, "NAUTICAL_MILE", 
-		  rb_float_new(GSL_CONST_MKSA_NAUTICAL_MILE));
-  rb_define_const(module, "FATHOM", rb_float_new(GSL_CONST_MKSA_FATHOM));
-  rb_define_const(module, "MIL", rb_float_new(GSL_CONST_MKSA_MIL));
-  rb_define_const(module, "POINT", rb_float_new(GSL_CONST_MKSA_POINT));
-  rb_define_const(module, "TEXPOINT", rb_float_new(GSL_CONST_MKSA_TEXPOINT));
-  rb_define_const(module, "MICRON", rb_float_new(GSL_CONST_MKSA_MICRON));
-  rb_define_const(module, "ANGSTROM", rb_float_new(GSL_CONST_MKSA_ANGSTROM));
-  rb_define_const(module, "HECTARE", rb_float_new(GSL_CONST_MKSA_HECTARE));
-  rb_define_const(module, "ACRE", rb_float_new(GSL_CONST_MKSA_ACRE));
-  rb_define_const(module, "BARN", rb_float_new(GSL_CONST_MKSA_BARN));
-  rb_define_const(module, "LITER", rb_float_new(GSL_CONST_MKSA_LITER));
-  rb_define_const(module, "US_GALLON", rb_float_new(GSL_CONST_MKSA_US_GALLON));
-  rb_define_const(module, "QUART", rb_float_new(GSL_CONST_MKSA_QUART));
-  rb_define_const(module, "PINT", rb_float_new(GSL_CONST_MKSA_PINT));
-  rb_define_const(module, "CUP", rb_float_new(GSL_CONST_MKSA_CUP));
-  rb_define_const(module, "FLUID_OUNCE", rb_float_new(GSL_CONST_MKSA_FLUID_OUNCE));
-  rb_define_const(module, "TABLESPOON", rb_float_new(GSL_CONST_MKSA_TABLESPOON));
-  rb_define_const(module, "CANADIAN_GALLON", 
-		  rb_float_new(GSL_CONST_MKSA_CANADIAN_GALLON));
-
-  rb_define_const(module, "UK_GALLON", rb_float_new(GSL_CONST_MKSA_UK_GALLON));
-  rb_define_const(module, "KILOMETERS_PER_HOUR", 
-		  rb_float_new(GSL_CONST_MKSA_MILES_PER_HOUR)); 
-  rb_define_const(module, "MILES_PER_HOUR", 
-		  rb_float_new(GSL_CONST_MKSA_KILOMETERS_PER_HOUR));
-  rb_define_const(module, "KNOT", rb_float_new(GSL_CONST_MKSA_KNOT));
-  rb_define_const(module, "POUND_MASS", rb_float_new(GSL_CONST_MKSA_POUND_MASS));
-  rb_define_const(module, "POUND_OUNCE", rb_float_new(GSL_CONST_MKSA_OUNCE_MASS));
-  rb_define_const(module, "POUND_TON", rb_float_new(GSL_CONST_MKSA_TON));
-  rb_define_const(module, "POUND_METRIC_TON", 
-		  rb_float_new(GSL_CONST_MKSA_METRIC_TON));
-  rb_define_const(module, "POUND_UK_TON", rb_float_new(GSL_CONST_MKSA_UK_TON));
-  rb_define_const(module, "POUND_TROY_OUNCE",
-		  rb_float_new(GSL_CONST_MKSA_TROY_OUNCE));
-  rb_define_const(module, "CARAT", rb_float_new(GSL_CONST_MKSA_CARAT));
-  rb_define_const(module, "UNIFIED_ATOMIC_MASS",
-		  rb_float_new(GSL_CONST_MKSA_UNIFIED_ATOMIC_MASS));
-  rb_define_const(module, "GRAM_FORCE", rb_float_new(GSL_CONST_MKSA_GRAM_FORCE));
-  rb_define_const(module, "POUND_FORCE", rb_float_new(GSL_CONST_MKSA_POUND_FORCE));
-  rb_define_const(module, "KILOPOUND_FORCE", 
-		  rb_float_new(GSL_CONST_MKSA_KILOPOUND_FORCE));
-  rb_define_const(module, "POUNDAL", rb_float_new(GSL_CONST_MKSA_POUNDAL));
-  rb_define_const(module, "CALORIE", rb_float_new(GSL_CONST_MKSA_CALORIE));
-  rb_define_const(module, "BTU", rb_float_new(GSL_CONST_MKSA_BTU));
-  rb_define_const(module, "THERM", rb_float_new(GSL_CONST_MKSA_THERM));
-  rb_define_const(module, "HORSEPOWER", rb_float_new(GSL_CONST_MKSA_HORSEPOWER));
-  rb_define_const(module, "BAR", rb_float_new(GSL_CONST_MKSA_BAR));
-  rb_define_const(module, "STD_ATMOSPHERE", 
-		  rb_float_new(GSL_CONST_MKSA_STD_ATMOSPHERE));
-  rb_define_const(module, "TORR", rb_float_new(GSL_CONST_MKSA_TORR));
-  rb_define_const(module, "METER_OF_MERCURY", 
-		  rb_float_new(GSL_CONST_MKSA_METER_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_MERCURY", 
-		  rb_float_new(GSL_CONST_MKSA_INCH_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_WATER", 
-		  rb_float_new(GSL_CONST_MKSA_INCH_OF_WATER));
-  rb_define_const(module, "PSI", rb_float_new(GSL_CONST_MKSA_PSI));
-  rb_define_const(module, "POISE", rb_float_new(GSL_CONST_MKSA_POISE));
-  rb_define_const(module, "STOKES", rb_float_new(GSL_CONST_MKSA_STOKES));
-  rb_define_const(module, "FARADAY", rb_float_new(GSL_CONST_MKSA_FARADAY));
-  rb_define_const(module, "ELECTRON_CHARGE",
-		  rb_float_new(GSL_CONST_MKSA_ELECTRON_CHARGE));
-  rb_define_const(module, "GAUSS", rb_float_new(GSL_CONST_MKSA_GAUSS));
-  rb_define_const(module, "STILB", rb_float_new(GSL_CONST_MKSA_STILB));
-  rb_define_const(module, "LUMEN", rb_float_new(GSL_CONST_MKSA_LUMEN));
-  rb_define_const(module, "LUX", rb_float_new(GSL_CONST_MKSA_LUX));
-  rb_define_const(module, "PHOT", rb_float_new(GSL_CONST_MKSA_PHOT));
-  rb_define_const(module, "FOOTCANDLE", rb_float_new(GSL_CONST_MKSA_FOOTCANDLE));
-  rb_define_const(module, "LAMBERT", rb_float_new(GSL_CONST_MKSA_LAMBERT));
-  rb_define_const(module, "CURIE", rb_float_new(GSL_CONST_MKSA_CURIE));
-  rb_define_const(module, "ROENTGEN", rb_float_new(GSL_CONST_MKSA_ROENTGEN));
-  rb_define_const(module, "RAD", rb_float_new(GSL_CONST_MKSA_RAD));
-  rb_define_const(module, "SOLAR_MASS", rb_float_new(GSL_CONST_MKSA_SOLAR_MASS));
-
-  rb_define_const(module, "BOLTZMANN", rb_float_new(GSL_CONST_MKSA_BOLTZMANN));
-  rb_define_const(module, "MOLAR_GAS", rb_float_new(GSL_CONST_MKSA_MOLAR_GAS));
-
-  rb_define_const(module, "BOHR_RADIUS", rb_float_new(GSL_CONST_MKSA_BOHR_RADIUS));
-  rb_define_const(module, "NEWTON", rb_float_new(GSL_CONST_MKSA_NEWTON));
-  rb_define_const(module, "DYNE", rb_float_new(GSL_CONST_MKSA_DYNE));
-  rb_define_const(module, "JOULE", rb_float_new(GSL_CONST_MKSA_JOULE));
-  rb_define_const(module, "ERG", rb_float_new(GSL_CONST_MKSA_ERG));
-
-#ifdef GSL_1_4_9_LATER
-  rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT", 
-		  rb_float_new(GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT));
-  rb_define_const(module, "THOMSON_CROSS_SECTION", 
-		  rb_float_new(GSL_CONST_MKSA_THOMSON_CROSS_SECTION));
-#endif
-
-
-#ifdef GSL_1_8_LATER
-  rb_define_const(module, "DEBYE", rb_float_new(GSL_CONST_MKSA_DEBYE));
-#endif
-
-}
-
-
-static void rb_gsl_const_cgs(VALUE module)
-{
-  rb_define_const(module, "SPEED_OF_LIGHT", 
-		  rb_float_new(GSL_CONST_CGSM_SPEED_OF_LIGHT));
-  rb_define_const(module, "GRAVITATIONAL_CONSTANT", 
-		  rb_float_new(GSL_CONST_CGSM_GRAVITATIONAL_CONSTANT));
-  rb_define_const(module, "PLANCKS_CONSTANT_H", 
-		  rb_float_new(GSL_CONST_CGSM_PLANCKS_CONSTANT_H));
-  rb_define_const(module, "PLANCKS_CONSTANT_HBAR", 
-		  rb_float_new(GSL_CONST_CGSM_PLANCKS_CONSTANT_HBAR));
-  rb_define_const(module, "ASTRONOMICAL_UNIT",
-		  rb_float_new(GSL_CONST_CGSM_ASTRONOMICAL_UNIT));
-  rb_define_const(module, "LIGHT_YEAR",
-		  rb_float_new(GSL_CONST_CGSM_LIGHT_YEAR));
-  rb_define_const(module, "PARSEC", 
-		  rb_float_new(GSL_CONST_CGSM_PARSEC));
-  rb_define_const(module, "GRAV_ACCEL",
-		  rb_float_new(GSL_CONST_CGSM_GRAV_ACCEL));
-  rb_define_const(module, "ELECTRON_VOLT",
-		  rb_float_new(GSL_CONST_CGSM_ELECTRON_VOLT));
-  rb_define_const(module, "MASS_ELECTRON", 
-		  rb_float_new(GSL_CONST_CGSM_MASS_ELECTRON));
-  rb_define_const(module, "MASS_MUON", rb_float_new(GSL_CONST_CGSM_MASS_MUON));
-  rb_define_const(module, "MASS_PROTON", rb_float_new(GSL_CONST_CGSM_MASS_PROTON));
-  rb_define_const(module, "MASS_NEUTRON", rb_float_new(GSL_CONST_CGSM_MASS_NEUTRON));
-  rb_define_const(module, "RYDBERG", rb_float_new(GSL_CONST_CGSM_RYDBERG));
-
-  rb_define_const(module, "BOHR_MAGNETON", 
-		  rb_float_new(GSL_CONST_CGSM_BOHR_MAGNETON));
-
-  rb_define_const(module, "NUCLEAR_MAGNETON",
-		  rb_float_new(GSL_CONST_CGSM_NUCLEAR_MAGNETON));
-  rb_define_const(module, "ELECTRON_MAGNETIC_MOMENT", 
-		  rb_float_new(GSL_CONST_CGSM_ELECTRON_MAGNETIC_MOMENT));
-  rb_define_const(module, "PROTON_MAGNETIC_MOMENT", 
-		  rb_float_new(GSL_CONST_CGSM_PROTON_MAGNETIC_MOMENT));
-  rb_define_const(module, "STANDARD_GAS_VOLUME",
-		  rb_float_new(GSL_CONST_CGSM_STANDARD_GAS_VOLUME));
-
-  rb_define_const(module, "MINUTE", rb_float_new(GSL_CONST_CGSM_MINUTE));
-  rb_define_const(module, "HOUR", rb_float_new(GSL_CONST_CGSM_HOUR));
-  rb_define_const(module, "DAY", rb_float_new(GSL_CONST_CGSM_DAY));
-  rb_define_const(module, "WEEK", rb_float_new(GSL_CONST_CGSM_WEEK));
-  rb_define_const(module, "INCH", rb_float_new(GSL_CONST_CGSM_INCH));
-  rb_define_const(module, "FOOT", rb_float_new(GSL_CONST_CGSM_FOOT));
-  rb_define_const(module, "YARD", rb_float_new(GSL_CONST_CGSM_YARD));
-  rb_define_const(module, "MILE", rb_float_new(GSL_CONST_CGSM_MILE));
-  rb_define_const(module, "NAUTICAL_MILE", 
-		  rb_float_new(GSL_CONST_CGSM_NAUTICAL_MILE));
-  rb_define_const(module, "FATHOM", rb_float_new(GSL_CONST_CGSM_FATHOM));
-  rb_define_const(module, "MIL", rb_float_new(GSL_CONST_CGSM_MIL));
-  rb_define_const(module, "POINT", rb_float_new(GSL_CONST_CGSM_POINT));
-  rb_define_const(module, "TEXPOINT", rb_float_new(GSL_CONST_CGSM_TEXPOINT));
-  rb_define_const(module, "MICRON", rb_float_new(GSL_CONST_CGSM_MICRON));
-  rb_define_const(module, "ANGSTROM", rb_float_new(GSL_CONST_CGSM_ANGSTROM));
-  rb_define_const(module, "HECTARE", rb_float_new(GSL_CONST_CGSM_HECTARE));
-  rb_define_const(module, "ACRE", rb_float_new(GSL_CONST_CGSM_ACRE));
-  rb_define_const(module, "BARN", rb_float_new(GSL_CONST_CGSM_BARN));
-  rb_define_const(module, "LITER", rb_float_new(GSL_CONST_CGSM_LITER));
-  rb_define_const(module, "US_GALLON", rb_float_new(GSL_CONST_CGSM_US_GALLON));
-  rb_define_const(module, "QUART", rb_float_new(GSL_CONST_CGSM_QUART));
-  rb_define_const(module, "PINT", rb_float_new(GSL_CONST_CGSM_PINT));
-  rb_define_const(module, "CUP", rb_float_new(GSL_CONST_CGSM_CUP));
-  rb_define_const(module, "FLUID_OUNCE", rb_float_new(GSL_CONST_CGSM_FLUID_OUNCE));
-  rb_define_const(module, "TABLESPOON", rb_float_new(GSL_CONST_CGSM_TABLESPOON));
-  rb_define_const(module, "CANADIAN_GALLON", 
-		  rb_float_new(GSL_CONST_CGSM_CANADIAN_GALLON));
-
-  rb_define_const(module, "UK_GALLON", rb_float_new(GSL_CONST_CGSM_UK_GALLON));
-  rb_define_const(module, "KILOMETERS_PER_HOUR", 
-		  rb_float_new(GSL_CONST_CGSM_MILES_PER_HOUR));  
-  rb_define_const(module, "MILES_PER_HOUR", 
-		  rb_float_new(GSL_CONST_CGSM_KILOMETERS_PER_HOUR));
-  rb_define_const(module, "KNOT", rb_float_new(GSL_CONST_CGSM_KNOT));
-  rb_define_const(module, "POUND_MASS", rb_float_new(GSL_CONST_CGSM_POUND_MASS));
-  rb_define_const(module, "POUND_OUNCE", rb_float_new(GSL_CONST_CGSM_OUNCE_MASS));
-  rb_define_const(module, "POUND_TON", rb_float_new(GSL_CONST_CGSM_TON));
-  rb_define_const(module, "POUND_METRIC_TON", 
-		  rb_float_new(GSL_CONST_CGSM_METRIC_TON));
-  rb_define_const(module, "POUND_UK_TON", rb_float_new(GSL_CONST_CGSM_UK_TON));
-  rb_define_const(module, "POUND_TROY_OUNCE", 
-		  rb_float_new(GSL_CONST_CGSM_TROY_OUNCE));
-  rb_define_const(module, "CARAT", rb_float_new(GSL_CONST_CGSM_CARAT));
-  rb_define_const(module, "UNIFIED_ATOMIC_MASS",
-		  rb_float_new(GSL_CONST_CGSM_UNIFIED_ATOMIC_MASS));
-  rb_define_const(module, "GRAM_FORCE", rb_float_new(GSL_CONST_CGSM_GRAM_FORCE));
-  rb_define_const(module, "POUND_FORCE", rb_float_new(GSL_CONST_CGSM_POUND_FORCE));
-  rb_define_const(module, "KILOPOUND_FORCE",
-		  rb_float_new(GSL_CONST_CGSM_KILOPOUND_FORCE));
-  rb_define_const(module, "POUNDAL", rb_float_new(GSL_CONST_CGSM_POUNDAL));
-  rb_define_const(module, "CALORIE", rb_float_new(GSL_CONST_CGSM_CALORIE));
-  rb_define_const(module, "BTU", rb_float_new(GSL_CONST_CGSM_BTU));
-  rb_define_const(module, "THERM", rb_float_new(GSL_CONST_CGSM_THERM));
-  rb_define_const(module, "HORSEPOWER", rb_float_new(GSL_CONST_CGSM_HORSEPOWER));
-  rb_define_const(module, "BAR", rb_float_new(GSL_CONST_CGSM_BAR));
-  rb_define_const(module, "STD_ATMOSPHERE", 
-		  rb_float_new(GSL_CONST_CGSM_STD_ATMOSPHERE));
-  rb_define_const(module, "TORR", rb_float_new(GSL_CONST_CGSM_TORR));
-  rb_define_const(module, "METER_OF_MERCURY", 
-		  rb_float_new(GSL_CONST_CGSM_METER_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_MERCURY",
-		  rb_float_new(GSL_CONST_CGSM_INCH_OF_MERCURY));
-  rb_define_const(module, "INCH_OF_WATER",
-		  rb_float_new(GSL_CONST_CGSM_INCH_OF_WATER));
-  rb_define_const(module, "PSI", rb_float_new(GSL_CONST_CGSM_PSI));
-  rb_define_const(module, "POISE", rb_float_new(GSL_CONST_CGSM_POISE));
-  rb_define_const(module, "STOKES", rb_float_new(GSL_CONST_CGSM_STOKES));
-  rb_define_const(module, "FARADAY", rb_float_new(GSL_CONST_CGSM_FARADAY));
-  rb_define_const(module, "ELECTRON_CHARGE", 
-		  rb_float_new(GSL_CONST_CGSM_ELECTRON_CHARGE));
-  rb_define_const(module, "ELECTRON_CHARGE_ESU",
-		  rb_float_new(GSL_CONST_CGSM_ELECTRON_CHARGE*GSL_CONST_CGSM_SPEED_OF_LIGHT));
-#ifndef GSL_1_13_LATER
-  rb_define_const(module, "GAUSS", rb_float_new(GSL_CONST_CGSM_GAUSS));
-#endif
-  rb_define_const(module, "STILB", rb_float_new(GSL_CONST_CGSM_STILB));
-  rb_define_const(module, "LUMEN", rb_float_new(GSL_CONST_CGSM_LUMEN));
-  rb_define_const(module, "LUX", rb_float_new(GSL_CONST_CGSM_LUX));
-  rb_define_const(module, "PHOT", rb_float_new(GSL_CONST_CGSM_PHOT));
-  rb_define_const(module, "FOOTCANDLE", rb_float_new(GSL_CONST_CGSM_FOOTCANDLE));
-  rb_define_const(module, "LAMBERT", rb_float_new(GSL_CONST_CGSM_LAMBERT));
-  rb_define_const(module, "CURIE", rb_float_new(GSL_CONST_CGSM_CURIE));
-  rb_define_const(module, "ROENTGEN", rb_float_new(GSL_CONST_CGSM_ROENTGEN));
-  rb_define_const(module, "RAD", rb_float_new(GSL_CONST_CGSM_RAD));
-  rb_define_const(module, "SOLAR_MASS", rb_float_new(GSL_CONST_CGSM_SOLAR_MASS));
-
-  rb_define_const(module, "BOLTZMANN", rb_float_new(GSL_CONST_CGSM_BOLTZMANN));
-  rb_define_const(module, "MOLAR_GAS", rb_float_new(GSL_CONST_CGSM_MOLAR_GAS));
-
-  rb_define_const(module, "BOHR_RADIUS", rb_float_new(GSL_CONST_CGSM_BOHR_RADIUS));
-  rb_define_const(module, "NEWTON", rb_float_new(GSL_CONST_CGSM_NEWTON));
-  rb_define_const(module, "DYNE", rb_float_new(GSL_CONST_CGSM_DYNE));
-  rb_define_const(module, "JOULE", rb_float_new(GSL_CONST_CGSM_JOULE));
-  rb_define_const(module, "ERG", rb_float_new(GSL_CONST_CGSM_ERG));
-
-#ifdef GSL_1_4_9_LATER
-  rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT", 
-		  rb_float_new(GSL_CONST_CGSM_STEFAN_BOLTZMANN_CONSTANT));
-  rb_define_const(module, "THOMSON_CROSS_SECTION", 
-		  rb_float_new(GSL_CONST_CGSM_THOMSON_CROSS_SECTION));
-#endif
-}
-
-static void rb_gsl_const_num(VALUE module)
-{
-  rb_define_const(module, "AVOGADRO", rb_float_new(GSL_CONST_NUM_AVOGADRO));
-  rb_define_const(module, "FINE_STRUCTURE", 
-		  rb_float_new(GSL_CONST_NUM_FINE_STRUCTURE));
-  rb_define_const(module, "YOTTA", rb_float_new(GSL_CONST_NUM_YOTTA));
-  rb_define_const(module, "ZETTA", rb_float_new(GSL_CONST_NUM_ZETTA));
-  rb_define_const(module, "EXA", rb_float_new(GSL_CONST_NUM_EXA));
-  rb_define_const(module, "PETA", rb_float_new(GSL_CONST_NUM_PETA));
-  rb_define_const(module, "TERA", rb_float_new(GSL_CONST_NUM_TERA));
-  rb_define_const(module, "GIGA", rb_float_new(GSL_CONST_NUM_GIGA));
-  rb_define_const(module, "MEGA", rb_float_new(GSL_CONST_NUM_MEGA));
-  rb_define_const(module, "KILO", rb_float_new(GSL_CONST_NUM_KILO));
-  rb_define_const(module, "MILLI", rb_float_new(GSL_CONST_NUM_MILLI));
-  rb_define_const(module, "MICRO", rb_float_new(GSL_CONST_NUM_MICRO));
-  rb_define_const(module, "NANO", rb_float_new(GSL_CONST_NUM_NANO));
-  rb_define_const(module, "PICO", rb_float_new(GSL_CONST_NUM_PICO));
-  rb_define_const(module, "FEMTO", rb_float_new(GSL_CONST_NUM_FEMTO));
-  rb_define_const(module, "ATTO", rb_float_new(GSL_CONST_NUM_ATTO));
-  rb_define_const(module, "ZEPTO", rb_float_new(GSL_CONST_NUM_ZEPTO));
-  rb_define_const(module, "YOCTO", rb_float_new(GSL_CONST_NUM_YOCTO));
-}
-
-void Init_gsl_const(VALUE module)
-{
-  VALUE mgsl_const;
-  VALUE mgsl_const_mks, mgsl_const_cgs, mgsl_const_num;
-  
-  mgsl_const = rb_define_module_under(module, "CONST");
-  mgsl_const_mks = rb_define_module_under(mgsl_const, "MKSA");
-  rb_gsl_const_mks(mgsl_const_mks);
-  mgsl_const_cgs = rb_define_module_under(mgsl_const, "CGSM");
-  rb_gsl_const_cgs(mgsl_const_cgs);
-  mgsl_const_num = rb_define_module_under(mgsl_const, "NUM");
-  rb_gsl_const_num(mgsl_const_num);
-  Init_gsl_const_additional(mgsl_const_mks, mgsl_const_cgs, mgsl_const_num);
-}
-#endif
diff --git a/ext/gsl/cqp.c b/ext/gsl/cqp.c
deleted file mode 100644
index 5cc0176..0000000
--- a/ext/gsl/cqp.c
+++ /dev/null
@@ -1,283 +0,0 @@
-#ifdef HAVE_GSL_GSL_CQP_H
-
-#include "include/rb_gsl.h"
-#include "gsl/gsl_cqp.h"
-
-static const gsl_cqpminimizer_type* type_by_string(VALUE t);
-static const gsl_cqpminimizer_type* get_type(VALUE t)
-{
-
-	switch (TYPE(t)) {
-	case T_STRING:
-		return type_by_string(t);
-		break;
-	default:
-		rb_raise(rb_eTypeError, "Wrong argument type %s.", rb_class2name(CLASS_OF(t)));
-	}
-}
-
-static const gsl_cqpminimizer_type* type_by_string(VALUE t)
-{
-	char *name;	
-	name = STR2CSTR(t);
-	if (strcmp(name, "mg_pdip") == 0) {
-		return gsl_cqpminimizer_mg_pdip;
-	} else {
-		rb_raise(rb_eRuntimeError, "Unknown minimizer type %s.", name);
-	}
-	return NULL; /* never reach here */
-}
-
-static VALUE rb_cqpminimizer_alloc(VALUE klass,  VALUE t, VALUE n, VALUE me, VALUE mi)
-{
-	gsl_cqpminimizer *m;
-	m = gsl_cqpminimizer_alloc(get_type(t), (size_t) FIX2INT(n), (size_t) FIX2INT(me), (size_t) FIX2INT(mi));
-	return Data_Wrap_Struct(klass, 0, gsl_cqpminimizer_free, m);
-}
-
-static VALUE rb_cqpminimizer_set(VALUE obj, VALUE data)
-{
-	gsl_cqpminimizer *m;
-	gsl_cqp_data *d;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	Data_Get_Struct(data, gsl_cqp_data, d);
-	gsl_cqpminimizer_set(m, d);
-	return Qtrue;
-}
-
-static VALUE rb_cqpminimizer_name(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return rb_str_new2(gsl_cqpminimizer_name(m));
-}
-
-static VALUE rb_cqpminimizer_iterate(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return INT2FIX(gsl_cqpminimizer_iterate(m));
-}
-
-static VALUE rb_cqpminimizer_x(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_x(m));
-}
-
-static VALUE rb_cqpminimizer_lm_eq(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_lm_eq(m));
-}
-static VALUE rb_cqpminimizer_lm_ineq(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_lm_ineq(m));
-}
-static VALUE rb_cqpminimizer_f(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return rb_float_new(gsl_cqpminimizer_f(m));
-}
-static VALUE rb_cqpminimizer_gap(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return rb_float_new(gsl_cqpminimizer_gap(m));
-}
-static VALUE rb_cqpminimizer_residuals_norm(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return rb_float_new(gsl_cqpminimizer_residuals_norm(m));
-}
-/*
-static VALUE rb_cqpminimizer_minimum(VALUE obj)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return rb_float_new(gsl_cqpminimizer_minimum(m));
-}
-*/
-static VALUE rb_cqpminimizer_test_convergence(VALUE obj, VALUE g, VALUE r)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return INT2FIX(gsl_cqpminimizer_test_convergence(m, NUM2DBL(g), NUM2DBL(r)));
-}
-static VALUE rb_cqpminimizer_test_infeasibility(VALUE obj, VALUE e)
-{
-	gsl_cqpminimizer *m;
-	Data_Get_Struct(obj, gsl_cqpminimizer, m);
-	return INT2FIX(gsl_cqp_minimizer_test_infeasibility(m, NUM2DBL(e)));
-}
-
-static VALUE rb_cqp_data_alloc(VALUE klass)
-{
-	gsl_cqp_data *d;
-	d = (gsl_cqp_data*) malloc(sizeof(gsl_cqp_data));
-	return Data_Wrap_Struct(klass, 0, free, d);
-}
-
-static VALUE rb_cqp_data_Q(VALUE obj)
-{
-	gsl_cqp_data *d;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, 	d->Q);
-}
-
-static VALUE rb_cqp_data_q(VALUE obj)
-{
-	gsl_cqp_data *d;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, 	d->q);
-}
-
-static VALUE rb_cqp_data_A(VALUE obj)
-{
-	gsl_cqp_data *d;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, 	d->A);
-}
-
-static VALUE rb_cqp_data_b(VALUE obj)
-{
-	gsl_cqp_data *d;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, 	d->b);
-}
-
-static VALUE rb_cqp_data_C(VALUE obj)
-{
-	gsl_cqp_data *d;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, 	d->C);
-}
-
-static VALUE rb_cqp_data_d(VALUE obj)
-{
-	gsl_cqp_data *d;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, 	d->d);
-}
-
-static VALUE rb_cqp_data_set_Q(VALUE obj, VALUE mm)
-{
-	gsl_cqp_data *d;
-	gsl_matrix *m;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	CHECK_MATRIX(mm);
-	Data_Get_Struct(mm, gsl_matrix, m);	
-	d->Q = m;
-	return Qtrue;
-}
-
-static VALUE rb_cqp_data_set_q(VALUE obj, VALUE vv)
-{
-	gsl_cqp_data *d;
-	gsl_vector *v;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	CHECK_VECTOR(vv);
-	Data_Get_Struct(vv, gsl_vector, v);
-	d->q = v;
-	return Qtrue;
-}
-
-static VALUE rb_cqp_data_set_A(VALUE obj, VALUE mm)
-{
-	gsl_cqp_data *d;
-	gsl_matrix *m;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	CHECK_MATRIX(mm);
-	Data_Get_Struct(mm, gsl_matrix, m);
-	d->A = m;
-	return Qtrue;
-}
-
-static VALUE rb_cqp_data_set_b(VALUE obj, VALUE vv)
-{
-	gsl_cqp_data *d;
-	gsl_vector *v;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	CHECK_VECTOR(vv);
-	Data_Get_Struct(vv, gsl_vector, v);
-	d->b = v;
-	return Qtrue;
-}
-
-static VALUE rb_cqp_data_set_C(VALUE obj, VALUE mm)
-{
-	gsl_cqp_data *d;
-	gsl_matrix *m;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	CHECK_MATRIX(mm);
-	Data_Get_Struct(mm, gsl_matrix, m);
-	d->C = m;
-	return Qtrue;
-}
-
-static VALUE rb_cqp_data_set_d(VALUE obj, VALUE vv)
-{
-	gsl_cqp_data *d;
-	gsl_vector *v;
-	Data_Get_Struct(obj, gsl_cqp_data, d);
-	CHECK_VECTOR(vv);
-	Data_Get_Struct(vv, gsl_vector, v);
-	d->d = v;
-	return Qtrue;
-}
-
-void Init_cqp(VALUE module)
-{
-	VALUE mCQP, cMinimizer, cData;
-	
-	mCQP = rb_define_module_under(module, "CQP");
-	cMinimizer = rb_define_class_under(mCQP, "Minimizer", cGSL_Object);
-	cData = rb_define_class_under(mCQP, "Data", cGSL_Object);	
-
-	rb_define_singleton_method(cMinimizer, "alloc", rb_cqpminimizer_alloc, 4);
-	
-	rb_define_method(cMinimizer, "set", rb_cqpminimizer_set, 1);
-	rb_define_method(cMinimizer, "name", rb_cqpminimizer_name, 0);
-	rb_define_method(cMinimizer, "iterate", rb_cqpminimizer_iterate, 0);	
-	rb_define_method(cMinimizer, "x", rb_cqpminimizer_x, 0);
-	rb_define_method(cMinimizer, "lm_eq", rb_cqpminimizer_lm_eq, 0);
-	rb_define_method(cMinimizer, "lm_ineq", rb_cqpminimizer_lm_ineq, 0);
-	rb_define_method(cMinimizer, "f", rb_cqpminimizer_f, 0);
-	rb_define_method(cMinimizer, "gap", rb_cqpminimizer_gap, 0);
-	rb_define_method(cMinimizer, "residuals_norm", rb_cqpminimizer_residuals_norm, 0);	
-/*	rb_define_method(cMinimizer, "minimum", rb_cqpminimizer_minimum, 0);	*/
-	rb_define_method(cMinimizer, "test_convergence", rb_cqpminimizer_test_convergence, 2);
-	rb_define_method(cMinimizer, "test_infeasibility", rb_cqpminimizer_test_infeasibility, 1);	
-
-	/*****/	
-	rb_define_singleton_method(cData, "alloc", rb_cqp_data_alloc, 0);	
-	
-	rb_define_method(cData, "Q", rb_cqp_data_Q, 0);
-	rb_define_method(cData, "q", rb_cqp_data_q, 0);
-	rb_define_method(cData, "A", rb_cqp_data_A, 0);
-	rb_define_method(cData, "b", rb_cqp_data_b, 0);
-	rb_define_method(cData, "C", rb_cqp_data_C, 0);
-	rb_define_method(cData, "d", rb_cqp_data_d, 0);
-	
-	rb_define_method(cData, "set_Q", rb_cqp_data_set_Q, 1);
-	rb_define_method(cData, "set_q", rb_cqp_data_set_q, 1);
-	rb_define_method(cData, "set_A", rb_cqp_data_set_A, 1);
-	rb_define_method(cData, "set_b", rb_cqp_data_set_b, 1);
-	rb_define_method(cData, "set_C", rb_cqp_data_set_C, 1);
-	rb_define_method(cData, "set_d", rb_cqp_data_set_d, 1);
-	rb_define_alias(cData, "Q=", "set_Q");
-	rb_define_alias(cData, "q=", "set_q");
-	rb_define_alias(cData, "A=", "set_A");
-	rb_define_alias(cData, "b=", "set_b");
-	rb_define_alias(cData, "C=", "set_C");
-	rb_define_alias(cData, "d=", "set_d");	
-}
-
-#endif
-
diff --git a/ext/gsl/fcmp.c b/ext/gsl/fcmp.c
deleted file mode 100644
index f061147..0000000
--- a/ext/gsl/fcmp.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* sys/gsl_compare.c
- * 
- * Copyright (C) 2002 Gert Van den Eynde
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- * 
- * Based on fcmp 1.2.2 Copyright (c) 1998-2000 Theodore C. Belding
- * University of Michigan Center for the Study of Complex Systems
- * Ted.Belding at umich.edu
- *
- */
-
-#ifndef GSL_1_3_LATER
-
-#include <config.h>
-#include <gsl/gsl_sys.h>
-#include <math.h>
-
-int gsl_fcmp(const double x1, const double x2, const double epsilon)
-{
-  int exponent;
-  double delta, difference;
-
-  /* Find exponent of largest absolute value */
-
-  {
-    double max = (fabs (x1) > fabs (x2)) ? x1 : x2;
-
-    frexp (max, &exponent);
-  }
-
-  /* Form a neighborhood of size  2 * delta */
-
-  delta = ldexp (epsilon, exponent);
-
-  difference = x1 - x2;
-
-  if (difference > delta)       /* x1 > x2 */
-    {
-      return 1;
-    }
-  else if (difference < -delta) /* x1 < x2 */
-    {
-      return -1;
-    }
-  else                          /* -delta <= difference <= delta */
-    {
-      return 0;                 /* x1 ~=~ x2 */
-    }
-}
-
-#endif
diff --git a/ext/gsl/fresnel.c b/ext/gsl/fresnel.c
deleted file mode 100644
index 352c538..0000000
--- a/ext/gsl/fresnel.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/****************************************************************************
- *              fresnel.c -
- *  Calculation of Fresnel integrals by expansion to Chebyshev series
- *  Expansions are taken from the book
- *  Y.L. Luke. Mathematical functions and their approximations.
- *  Moscow, "Mir", 1980. PP. 145-149 (Russian edition)
- ****************************************************************************
- */
-/*
-	Modified for Ruby bindings
-					2006/Dec/24 Y. TSUNESADA
-*/
-#include <math.h>
-#include "include/rb_gsl.h"
-#include "include/rb_gsl_sf.h"
-
-static const double sqrt_pi_2   = 1.2533141373155002512078826424; /* sqrt(pi/2) */
-static const double sqrt_2_pi   = 0.7978845608028653558798921199; /* sqrt(2/pi) */
-static const double _1_sqrt_2pi = 0.3989422804014326779399460599; /* 1/sqrt(2*pi) */
-static const double pi_2        = 1.5707963267948966192313216916; /* pi/2 */
-
-static double f_data_a[18] =
-		{
-		  0.76435138664186000189,
-		 -0.43135547547660179313,
-		  0.43288199979726653054,
-                 -0.26973310338387111029,
-                  0.08416045320876935378,
-                 -0.01546524484461381958,
-                  0.00187855423439822018,
-                 -0.00016264977618887547,
-                  0.00001057397656383260,
-                 -0.00000053609339889243,
-                  0.00000002181658454933,
-                 -0.00000000072901621186,
-                  0.00000000002037332546,
-                 -0.00000000000048344033,
-                  0.00000000000000986533,
-                 -0.00000000000000017502,
-                  0.00000000000000000272,
-                 -0.00000000000000000004
-                };
-
-static double f_data_b[17] =
-		{
-		  0.63041404314570539241,
-		 -0.42344511405705333544,
-		  0.37617172643343656625,
-		 -0.16249489154509567415,
-		  0.03822255778633008694,
-		 -0.00564563477132190899,
-		  0.00057454951976897367,
-		 -0.00004287071532102004,
-		  0.00000245120749923299,
-		 -0.00000011098841840868,
-		  0.00000000408249731696,
-		 -0.00000000012449830219,
-		  0.00000000000320048425,
-		 -0.00000000000007032416,
-		  0.00000000000000133638,
-		 -0.00000000000000002219,
-		  0.00000000000000000032
-		};
-
-static double fresnel_cos_0_8(double x)
-{
- double x_8 = x/8.0;
- double xx = 2.0*x_8*x_8 - 1.0;
-
- double t0 = 1.0;
- double t1 = xx;
- double sumC = f_data_a[0] + f_data_a[1]*t1;
- double t2;
- int n;
- for (n=2; n < 18; n++)
- {
-  t2 = 2.0*xx*t1 - t0;
-  sumC += f_data_a[n]*t2;
-  t0 = t1; t1 = t2;
- }
- return _1_sqrt_2pi*sqrt(x)*sumC;
-}
-
-static double fresnel_sin_0_8(double x)
-{
- double x_8 = x/8.0;
- double xx = 2.0*x_8*x_8 - 1.0;
- double t0 = 1.;
- double t1 = xx;
- double ot1 = x_8;
- double ot2 = 2.0*x_8*t1 - ot1;
- double sumS = f_data_b[0]*ot1 + f_data_b[1]*ot2;
- int n;
- double t2;
- for (n=2; n < 17; n++)
- {
-  t2 = 2.0*xx*t1 - t0;
-  ot1 = ot2;
-  ot2 = 2.0*x_8*t2 - ot1;
-  sumS += f_data_b[n]*ot2;
-  t0 = t1; t1 = t2;
- }
- return _1_sqrt_2pi*sqrt(x)*sumS;
-}
-
-static double f_data_e[41] =
-		{
-		    0.97462779093296822410,
-		   -0.02424701873969321371,
-		    0.00103400906842977317,
-		   -0.00008052450246908016,
-		    0.00000905962481966582,
-		   -0.00000131016996757743,
-		    0.00000022770820391497,
-		   -0.00000004558623552026,
-		    0.00000001021567537083,
-		   -0.00000000251114508133,
-		    0.00000000066704761275,
-		   -0.00000000018931512852,
-		    0.00000000005689898935,
-		   -0.00000000001798219359,
-		    0.00000000000594162963,
-		   -0.00000000000204285065,
-		    0.00000000000072797580,
-		   -0.00000000000026797428,
-		    0.00000000000010160694,
-		   -0.00000000000003958559,
-		    0.00000000000001581262,
-		   -0.00000000000000646411,
-		    0.00000000000000269981,
-		   -0.00000000000000115038,
-		    0.00000000000000049942,
-		   -0.00000000000000022064,
-		    0.00000000000000009910,
-		   -0.00000000000000004520,
-		    0.00000000000000002092,
-		   -0.00000000000000000982,
-		    0.00000000000000000467,
-		   -0.00000000000000000225,
-		    0.00000000000000000110,
-		   -0.00000000000000000054,
-		    0.00000000000000000027,
-		   -0.00000000000000000014,
-		    0.00000000000000000007,
-		   -0.00000000000000000004,
-		    0.00000000000000000002,
-		   -0.00000000000000000001,
-		    0.00000000000000000001
-        };
-
-static double f_data_f[35] =
-		{
-		    0.99461545179407928910,
-		   -0.00524276766084297210,
-		    0.00013325864229883909,
-		   -0.00000770856452642713,
-		    0.00000070848077032045,
-		   -0.00000008812517411602,
-		    0.00000001359784717148,
-		   -0.00000000246858295747,
-		    0.00000000050925789921,
-		   -0.00000000011653400634,
-		    0.00000000002906578309,
-		   -0.00000000000779847361,
-		    0.00000000000222802542,
-		   -0.00000000000067239338,
-		    0.00000000000021296411,
-		   -0.00000000000007041482,
-		    0.00000000000002419805,
-		   -0.00000000000000861080,
-		    0.00000000000000316287,
-		   -0.00000000000000119596,
-		    0.00000000000000046444,
-		   -0.00000000000000018485,
-		    0.00000000000000007527,
-		   -0.00000000000000003131,
-		    0.00000000000000001328,
-		   -0.00000000000000000574,
-		    0.00000000000000000252,
-		   -0.00000000000000000113,
-		    0.00000000000000000051,
-		   -0.00000000000000000024,
-		    0.00000000000000000011,
-		   -0.00000000000000000005,
-		    0.00000000000000000002,
-		   -0.00000000000000000001,
-		    0.00000000000000000001
-		};
-
-static double fresnel_cos_8_inf(double x)
-{
- double xx = 128.0/(x*x) - 1.0;   /* 2.0*(8/x)^2 - 1 */
- double t0 = 1.0;
- double t1 = xx;
- double sumP = f_data_e[0] + f_data_e[1]*t1;
- double sumQ = f_data_f[0] + f_data_f[1]*t1;
- double t2;
- int n;
- for(n = 2; n < 35; n++)
- {
-   t2 = 2.0*xx*t1 - t0;
-   sumP += f_data_e[n]*t2; /*  sumP += f_data_e[n]*ChebyshevT(n,xx) */
-   sumQ += f_data_f[n]*t2; /*  sumQ += f_data_f[n]*ChebyshevT(n,xx) */
-   t0 = t1; t1 = t2;
- }
- for(n = 35; n < 41; n++)
- {
-   t2 = 2.0*xx*t1 - t0;
-   sumP += f_data_e[n]*t2; /*  sumP += f_data_e[n]*ChebyshevT(n,xx) */
-   t0 = t1; t1 = t2;
- }
- return 0.5 - _1_sqrt_2pi*(0.5*sumP*cos(x)/x - sumQ*sin(x))/sqrt(x);
-}
-
-static double fresnel_sin_8_inf(double x)
-{
- double xx = 128.0/(x*x) - 1.0;   /* 2.0*(8/x)^2 - 1 */
- double t0 = 1.0;
- double t1 = xx;
- double sumP = f_data_e[0] + f_data_e[1]*t1;
- double sumQ = f_data_f[0] + f_data_f[1]*t1;
- double t2;
- int n;
- for(n = 2; n < 35; n++)
- {
-   t2 = 2.0*xx*t1 - t0;
-   sumP += f_data_e[n]*t2; /*  sumP += f_data_e[n]*ChebyshevT(n,xx) */
-   sumQ += f_data_f[n]*t2; /*  sumQ += f_data_f[n]*ChebyshevT(n,xx) */
-   t0 = t1; t1 = t2;
- }
- for(n = 35; n < 41; n++)
- {
-   t2 = 2.0*xx*t1 - t0;
-   sumP += f_data_e[n]*t2; /*  sumQ += f_data_f[n]*ChebyshevT(n,xx) */
-   t0 = t1; t1 = t2;
- }
- return 0.5 - _1_sqrt_2pi*(0.5*sumP*sin(x)/x + sumQ*cos(x))/sqrt(x);
-}
-
-
-double fresnel_c(double x)
-{
-  double xx = x*x*pi_2;
-  double ret_val;
-  if(xx<=8.0)
-   ret_val = fresnel_cos_0_8(xx);
-  else
-   ret_val = fresnel_cos_8_inf(xx);
-  return (x<0.0) ? -ret_val : ret_val;
-}
-
-double fresnel_s(double x)
-{
-  double xx = x*x*pi_2;
-  double ret_val;
-  if(xx<=8.0)
-   ret_val = fresnel_sin_0_8(xx);
-  else
-   ret_val = fresnel_sin_8_inf(xx);
-  return (x<0.0) ? -ret_val : ret_val;
-}
-
-double fresnel_c1(double x)
-{
-  return fresnel_c(x*sqrt_2_pi);
-}
-
-double fresnel_s1(double x)
-{
-  return fresnel_s(x*sqrt_2_pi);
-}
-
-static VALUE rb_fresnel_c(VALUE obj, VALUE x)
-{
-	return rb_gsl_sf_eval1(fresnel_c, x);
-}
-static VALUE rb_fresnel_s(VALUE obj, VALUE x)
-{
-	return rb_gsl_sf_eval1(fresnel_s, x);
-}
-static VALUE rb_fresnel_c1(VALUE obj, VALUE x)
-{
-	return rb_gsl_sf_eval1(fresnel_c1, x);
-}
-static VALUE rb_fresnel_s1(VALUE obj, VALUE x)
-{
-	return rb_gsl_sf_eval1(fresnel_s1, x);
-}
-void Init_fresnel(VALUE module)
-{
-	VALUE mfresnel;
-	mfresnel = rb_define_module_under(module, "Fresnel");
-	rb_define_module_function(module, "fresnel_c", rb_fresnel_c, 1);
-	rb_define_module_function(module, "fresnel_s", rb_fresnel_s, 1);	
-	rb_define_module_function(module, "fresnel_c1", rb_fresnel_c1, 1);	
-	rb_define_module_function(module, "fresnel_s1", rb_fresnel_s1, 1);		
-	rb_define_module_function(mfresnel, "c", rb_fresnel_c, 1);
-	rb_define_module_function(mfresnel, "s", rb_fresnel_s, 1);	
-	rb_define_module_function(mfresnel, "c1", rb_fresnel_c1, 1);	
-	rb_define_module_function(mfresnel, "s1", rb_fresnel_s1, 1);	
-}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ext/gsl/jacobi.c b/ext/gsl/jacobi.c
deleted file mode 100644
index f4237be..0000000
--- a/ext/gsl/jacobi.c
+++ /dev/null
@@ -1,739 +0,0 @@
-#ifdef HAVE_JACOBI_H
-#include "include/rb_gsl.h"
-#include "jacobi.h"
-
-static VALUE jac_eval3_e(VALUE x, VALUE a, VALUE b,
-										int (*f)(double, double, double, gsl_sf_result*))
-{
-	gsl_sf_result *result;
-	VALUE obj;
-	obj = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, result);
-	(*f)(NUM2DBL(x), NUM2DBL(a), NUM2DBL(b), result);
-  return obj;
-}
-
-static VALUE jac_eval3(VALUE xx, VALUE aa, VALUE bb, double (*f)(double, double, double))
-{
-	gsl_vector *x, *y;
-	double a, b;
-	size_t i, len;
-	VALUE ary;
-#ifdef HAVE_NARRAY_H
-	double *ptr1, *ptr2;
-	struct NARRAY *na;
-#endif	
-	a = NUM2DBL(aa);
-	b = NUM2DBL(bb);
-	if (VECTOR_P(xx)) {
-		Data_Get_Struct(xx, gsl_vector, x);
-		y = gsl_vector_alloc(x->size);
-		for (i = 0; i < x->size; i++) {
-			gsl_vector_set(y, i, (*f)(gsl_vector_get(x, i), a, b));
-		}
-		return Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(xx)), 0, gsl_vector_free, y);
-	} else if (TYPE(xx) == T_ARRAY) {
-	  //		len = RARRAY(xx)->len;
-		len = RARRAY_LEN(xx);
-		ary = rb_ary_new2(len);
-		for (i = 0; i < len; i++) {
-			rb_ary_store(ary, i, rb_float_new((*f)(NUM2DBL(rb_ary_entry(xx, i)), a, b)));
-		}
-		return ary;
-#ifdef HAVE_NARRAY_H
-	} else if (NA_IsNArray(xx)) {
-		GetNArray(xx, na);
-		len = na->total;
-		ptr1 = (double*) na->ptr;
-		ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
-		ptr2 = NA_PTR_TYPE(ary, double*);
-		for (i = 0; i < len; i++) {
-			ptr2[i] = (*f)(ptr1[i], a, b);
-		}		
-		return ary;
-#endif		
-	} else {
-		return rb_float_new((*f)(NUM2DBL(xx), a, b));
-	}	
-}
-
-static VALUE rb_jac_jacobi_eval(int argc, VALUE *argv, 
-					double (*f)(double, int, double, double),
-					int (*f2)(int, const double*, int, double*, double, double, double*))
-{
-	gsl_vector *x, *ws, *y;
-	double a, b;
-	VALUE ary;
-	size_t len, i;
-	int n, flag = 0;
-#ifdef HAVE_NARRAY_H
-	double *ptr1, *ptr2;
-	struct NARRAY *na;
-#endif
-	if (argc < 4) rb_raise(rb_eArgError, "Too few arguments (%d for >= 4)", argc);
-	if (VECTOR_P(argv[0])) {
-		Data_Get_Struct(argv[0], gsl_vector, x);
-		y = gsl_vector_alloc(x->size);
-		ary = Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(x)), 0, gsl_vector_free, y);
-		switch (argc) {
-		case 4:
-			ws = gsl_vector_alloc(2*x->size);
-			flag = 1;
-			break;
-		case 5:
-			CHECK_VECTOR(argv[4]);
-			Data_Get_Struct(argv[4], gsl_vector, ws);
-			break;
-		default:	
-			rb_raise(rb_eArgError, "Too many arguments (%d for 4 or 5)", argc);
-		}
-		(*f2)(x->size, x->data, FIX2INT(argv[1]), y->data, NUM2DBL(argv[2]), NUM2DBL(argv[3]), 
-										ws->data);
-		if (flag == 1) gsl_vector_free(ws);
-		return ary;
-	} else if (TYPE(argv[0]) == T_ARRAY) {
-		n = FIX2INT(argv[1]);
-		a = NUM2DBL(argv[2]);
-		b = NUM2DBL(argv[3]);
-		//		len = RARRAY(argv[0])->len;
-		len = RARRAY_LEN(argv[0]);
-		ary = rb_ary_new2(len);
-		for (i = 0; i < len; i++) {
-			rb_ary_store(ary, i, rb_float_new((*f)(NUM2DBL(rb_ary_entry(argv[0], i)), n, a, b)));
-		}
-		return ary;
-#ifdef HAVE_NARRAY_H
-	} else if (NA_IsNArray(argv[0])) {
-		GetNArray(argv[0], na);
-		len = na->total;
-		ptr1 = (double*) na->ptr;
-		ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(argv[0]));
-		ptr2 = NA_PTR_TYPE(ary, double*);
-		n = FIX2INT(argv[1]);
-		a = NUM2DBL(argv[2]);
-		b = NUM2DBL(argv[3]);		
-		ws = gsl_vector_alloc(len);
-		(*f2)(len, ptr1, n, ptr2, a, b, ws->data);
-		gsl_vector_free(ws);
-		return ary;
-#endif
-	} else {
-		return rb_float_new((*f)(NUM2DBL(argv[0]), FIX2INT(argv[1]), NUM2DBL(argv[2]), NUM2DBL(argv[3])));		
-	}	
-
-}
-static VALUE rb_jac_jacobi_P0_e(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3_e(x, a, b, jac_jacobi_P0_e);
-}
-
-static VALUE rb_jac_jacobi_P0(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3(x, a, b, jac_jacobi_P0);
-}
-
-static VALUE rb_jac_jacobi_P1_e(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3_e(x, a, b, jac_jacobi_P1_e);
-}
-
-static VALUE rb_jac_jacobi_P1(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3(x, a, b, jac_jacobi_P1);
-}
-
-
-static VALUE rb_jac_jacobi(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_jacobi_eval(argc, argv, jac_jacobi, jac_jacobi_array);
-}
-
-static VALUE rb_jac_djacobi_P0_e(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3_e(x, a, b, jac_djacobi_P0_e);
-}
-
-static VALUE rb_jac_djacobi_P0(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3(x, a, b, jac_djacobi_P0);
-}
-
-static VALUE rb_jac_djacobi_P1_e(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3_e(x, a, b, jac_djacobi_P1_e);
-}
-
-static VALUE rb_jac_djacobi_P1(VALUE module, VALUE x, VALUE a, VALUE b)
-{	
-	return jac_eval3(x, a, b, jac_djacobi_P1);
-}
-
-static VALUE rb_jac_djacobi(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_jacobi_eval(argc, argv, jac_djacobi, jac_djacobi_array);	
-}
-
-static VALUE rb_jac_zeros_eval(int argc, VALUE *argv, VALUE module,
-		int (*f)(double*, int, double, double))
-{
-	gsl_vector *x;
-	int m, status;
-	double a, b;
-	VALUE xx;
-	switch (argc) {
-	case 3:
-		if (FIXNUM_P(argv[0])) {
-			m = FIX2INT(argv[0]);
-			a = NUM2DBL(argv[1]);
-			b = NUM2DBL(argv[2]);
-			x = gsl_vector_alloc(m);
-			xx = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, x);
-		} else if (VECTOR_P(argv[0])) {
-			Data_Get_Struct(argv[0], gsl_vector, x);
-			m = x->size;
-			a = NUM2DBL(argv[1]);
-			b = NUM2DBL(argv[2]);
-			xx = argv[0];			
-		} else {
-			rb_raise(rb_eTypeError, "Wrong argument type %s (Fixnum or GSL::Vector expected)",
-							rb_class2name(CLASS_OF(argv[0])));
-		}
-		break;
-	case 4:
-		CHECK_VECTOR(argv[0]);
-		Data_Get_Struct(argv[0], gsl_vector, x);		
-		m = FIX2INT(argv[1]);		
-		a = NUM2DBL(argv[2]);
-		b = NUM2DBL(argv[3]);	
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
-	}
-	status = (*f)(x->data, m, a, b);
-	if (status != GSL_SUCCESS)
-		rb_raise(rb_eRuntimeError, "Something wrong. (error code %d)", status);
-	return xx;
-}
-
-static VALUE rb_jac_jacobi_zeros(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_zeros_eval(argc, argv, module, jac_jacobi_zeros);
-}
-
-static void jac_define_const(VALUE module)
-{
-	rb_define_const(module, "GJ", INT2FIX(JAC_GJ));
-	rb_define_const(module, "GLJ", INT2FIX(JAC_GLJ));	
-	rb_define_const(module, "GRJM", INT2FIX(JAC_GRJM));
-	rb_define_const(module, "GRJP", INT2FIX(JAC_GRJP));
-}
-
-static VALUE rb_jac_quadrature_alloc(VALUE klass, VALUE vQ)
-{
-	jac_quadrature *q;
-	
-	q = jac_quadrature_alloc(FIX2INT(vQ));
-	
-	return Data_Wrap_Struct(klass, 0, jac_quadrature_free, q);
-}
-
-static VALUE rb_jac_quadrature_Q(VALUE obj)
-{
-	jac_quadrature *q;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	return INT2FIX(q->Q);
-}
-
-static VALUE rb_jac_quadrature_type(VALUE obj)
-{
-	jac_quadrature *q;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	return INT2FIX((int) q->type);
-}
-
-static VALUE rb_jac_quadrature_alpha(VALUE obj)
-{
-	jac_quadrature *q;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	return NUM2DBL(q->alpha);
-}
-
-static VALUE rb_jac_quadrature_beta(VALUE obj)
-{
-	jac_quadrature *q;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	return NUM2DBL(q->beta);
-}
-
-static VALUE rb_jac_quadrature_x(VALUE obj)
-{
-	jac_quadrature *q;
-	gsl_vector_view *v;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	v = gsl_vector_view_alloc();
-	v->vector.data = q->x;
-	v->vector.size = q->Q;
-	v->vector.stride = 1;
-	return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
-}
-
-static VALUE rb_jac_quadrature_w(VALUE obj)
-{
-	jac_quadrature *q;
-	gsl_vector_view *v;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	v = gsl_vector_view_alloc();
-	v->vector.data = q->w;
-	v->vector.size = q->Q;
-	v->vector.stride = 1;
-	return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
-}
-
-static VALUE rb_jac_quadrature_D(VALUE obj)
-{
-	jac_quadrature *q;
-	gsl_vector_view *v;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	v = gsl_vector_view_alloc();
-	v->vector.data = q->D;
-	v->vector.size = q->Q;
-	v->vector.stride = 1;
-	return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
-}
-
-static VALUE rb_jac_quadrature_xp(VALUE obj)
-{
-	jac_quadrature *q;
-	gsl_vector_view *v;
-	Data_Get_Struct(obj, jac_quadrature, q);
-	v = gsl_vector_view_alloc();
-	v->vector.data = q->w;
-	v->vector.size = q->np;
-	v->vector.stride = 1;
-	return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
-}
-
-static VALUE rb_jac_interpmat_alloc(int argc, VALUE *argv, VALUE obj)
-{
-	int err;
-	jac_quadrature *q;
-	gsl_vector *xp;
-	int np;
-	Data_Get_Struct(obj, jac_quadrature, q);	
-	switch (argc) {
-	case 1:
-		CHECK_VECTOR(argv[0]);
-		Data_Get_Struct(argv[0], gsl_vector, xp);	
-		np = xp->size;
-		break;
-	case 2:
-		CHECK_VECTOR(argv[1]);
-		Data_Get_Struct(argv[1], gsl_vector, xp);	
-		np = FIX2INT(argv[0]);	
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
-	}
-	err = jac_interpmat_alloc(q, np, xp->data);
-	return FIX2INT(err);
-}
-
-static VALUE rb_jac_interpmat_free(VALUE obj)
-{
-	jac_quadrature *q;	
-	Data_Get_Struct(obj, jac_quadrature, q);		
-	jac_interpmat_free(q);
-	return Qtrue;
-}
-
-static VALUE rb_jac_quadrature_zwd(int argc, VALUE *argv, VALUE obj)
-{
-	jac_quadrature *q;
-	gsl_vector *ws;
-	int flag = 0, type, status;
-	double a, b;
-	Data_Get_Struct(obj, jac_quadrature, q);			
-	switch (argc) {
-	case 3:
-		type = FIX2INT(argv[0]);
-		a = NUM2DBL(argv[1]);
-		b = NUM2DBL(argv[2]);
-		ws = gsl_vector_alloc(q->Q);	
-		flag = 1;
-		break;
-	case 4:
-		type = FIX2INT(argv[0]);
-		a = NUM2DBL(argv[1]);
-		b = NUM2DBL(argv[2]);
-		Data_Get_Struct(argv[3], gsl_vector, ws);
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
-	}
-	status = jac_quadrature_zwd(q, type, a, b, ws->data);
-	if (flag == 1) gsl_vector_free(ws);
-	return INT2FIX(status);
-}
-
-static VALUE rb_jac_integrate(VALUE obj, VALUE ff)
-{
-	jac_quadrature *q;
-	gsl_vector *f;
-	CHECK_VECTOR(ff);
-	Data_Get_Struct(obj, jac_quadrature, q);
-	Data_Get_Struct(ff, gsl_vector, f);
-	return rb_float_new(jac_integrate(q, f->data));
-}
-
-static VALUE rb_jac_interpolate(int argc, VALUE *argv, VALUE obj)
-{
-	jac_quadrature *q;
-	gsl_vector *f, *fout;
-	VALUE vfout;
-	switch (argc) {
-	case 1:
-		CHECK_VECTOR(argv[0]);
-		Data_Get_Struct(argv[0], gsl_vector, f);
-		fout = gsl_vector_alloc(f->size);
-		vfout = Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(argv[0])), 0, gsl_vector_free, fout);
-		break;
-	case 2:
-		CHECK_VECTOR(argv[0]);
-		Data_Get_Struct(argv[0], gsl_vector, f);
-		CHECK_VECTOR(argv[1]);
-		Data_Get_Struct(argv[1], gsl_vector, fout);
-		vfout = argv[1];
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
-	}
-	Data_Get_Struct(obj, jac_quadrature, q);
-	jac_interpolate(q, f->data, fout->data);
-	return vfout;
-}
-
-static VALUE rb_jac_differentiate(int argc, VALUE *argv, VALUE obj)
-{
-	jac_quadrature *q;
-	gsl_vector *f, *fout;
-	VALUE vfout;
-	switch (argc) {
-	case 1:
-		CHECK_VECTOR(argv[0]);
-		Data_Get_Struct(argv[0], gsl_vector, f);
-		fout = gsl_vector_alloc(f->size);
-		vfout = Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(argv[0])), 0, gsl_vector_free, fout);
-		break;
-	case 2:
-		CHECK_VECTOR(argv[0]);
-		Data_Get_Struct(argv[0], gsl_vector, f);
-		CHECK_VECTOR(argv[1]);
-		Data_Get_Struct(argv[1], gsl_vector, fout);
-		vfout = argv[1];
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
-	}
-	Data_Get_Struct(obj, jac_quadrature, q);
-	jac_differentiate(q, f->data, fout->data);
-	return vfout;
-}
-
-/*****/
-static VALUE rb_jac_qeval(int argc, VALUE *argv, 
-		int (*f)(double*, double*, const int, double, double, double*))
-{
-	gsl_vector *z, *D, *ws;
-	int Q;
-	int flag = 0, status;
-	double alpha, beta;
-	VALUE vD;
-	if (argc < 3) rb_raise(rb_eArgError, "Too few arguments (%d for >= 3)", argc);
-	CHECK_VECTOR(argv[0]);
-	Data_Get_Struct(argv[0], gsl_vector, z);
-	argc -= 1;
-	argv += 1;
-	if (VECTOR_P(argv[argc-1])) {
-		Data_Get_Struct(argv[argc-1], gsl_vector, ws);
-		argc -= 1;
-	} else {
-		ws = gsl_vector_alloc(z->size);
-		flag = 1;
-	}	
-	switch (argc) {
-	case 2:
-		Q = z->size;
-		D = gsl_vector_alloc(Q*Q);
-		alpha = NUM2DBL(argv[0]);
-		beta = NUM2DBL(argv[1]);
-		vD = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
-		break;
-	case 4:
-		Data_Get_Struct(argv[0], gsl_vector, D);
-		vD = argv[0];
-		Q = FIX2INT(argv[1]);
-		alpha = NUM2DBL(argv[2]);
-		beta = NUM2DBL(argv[3]);
-		break;
-	case 3:
-		if (VECTOR_P(argv[0])) {
-			Q = z->size;
-			Data_Get_Struct(argv[0], gsl_vector, D);
-			vD = argv[0];
-		} else {
-			Q = FIX2INT(argv[0]);			
-			D = gsl_vector_alloc(Q*Q);
-			vD = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
-		}
-		alpha = NUM2DBL(argv[1]);
- 		beta = NUM2DBL(argv[2]);
- 		break;
- 	default:
- 		rb_raise(rb_eArgError, "Wrong number of arguments.");
-	}
-	status = (*f)(z->data, D->data, Q, alpha, beta, ws->data);
-	if (flag == 1) gsl_vector_free(ws);
-	if (status != GSL_SUCCESS) rb_raise(rb_eRuntimeError, "Something wrong.");
-	return vD;
-}
-
-static VALUE rb_jac_diffmat_gj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_diffmat_gj);
-}
-
-static VALUE rb_jac_diffmat_glj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_diffmat_glj);
-}
-
-static VALUE rb_jac_diffmat_grjm(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_diffmat_grjm);
-}
-
-static VALUE rb_jac_diffmat_grjp(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_diffmat_grjp);
-}
-
-static VALUE rb_jac_weights_gj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_weights_gj);
-}
-
-static VALUE rb_jac_weights_glj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_weights_glj);
-}
-
-static VALUE rb_jac_weights_grjm(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_weights_grjm);
-}
-
-static VALUE rb_jac_weights_grjp(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_qeval(argc, argv, jac_weights_grjp);
-}
-
-static VALUE rb_jac_zeros_gj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_zeros_eval(argc, argv, module, jac_zeros_gj);
-}
-static VALUE rb_jac_zeros_glj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_zeros_eval(argc, argv, module, jac_zeros_glj);
-}
-static VALUE rb_jac_zeros_grjm(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_zeros_eval(argc, argv, module, jac_zeros_grjm);
-}
-static VALUE rb_jac_zeros_grjp(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_zeros_eval(argc, argv, module, jac_zeros_grjp);
-}
-
-static VALUE rb_jac_lagrange_eval(int argc, VALUE *argv,
-		double (*f)(int, double, int, double*, double, double))
-{
-	gsl_vector *z;
-	int i, Q;
-	double alpha, beta, zz;
-
-	switch (argc) {
-	case 5:
-		i = FIX2INT(argv[0]);
-		zz = NUM2DBL(argv[1]);
-		CHECK_VECTOR(argv[2]);
-		Data_Get_Struct(argv[2], gsl_vector, z);
-		Q = z->size;
-		alpha = NUM2DBL(argv[3]);
-		beta = NUM2DBL(argv[4]);
-	break;
-	case 6:
-		i = FIX2INT(argv[0]);
-		zz = NUM2DBL(argv[1]);
-		Q = FIX2INT(argv[2]);
-		CHECK_VECTOR(argv[3]);
-		Data_Get_Struct(argv[3], gsl_vector, z);
-		alpha = NUM2DBL(argv[4]);
-		beta = NUM2DBL(argv[5]);
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 5 or 6)", argc);
-	}
-	return rb_float_new((*f)(i, zz, Q, z->data, alpha, beta));
-}
-
-static VALUE rb_jac_lagrange_gj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_lagrange_eval(argc, argv, jac_lagrange_gj);
-}
-static VALUE rb_jac_lagrange_glj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_lagrange_eval(argc, argv, jac_lagrange_glj);
-}
-static VALUE rb_jac_lagrange_grjm(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_lagrange_eval(argc, argv, jac_lagrange_grjm);
-}
-
-static VALUE rb_jac_lagrange_grjp(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_lagrange_eval(argc, argv, jac_lagrange_grjp);
-}
-
-static VALUE rb_jac_interpmat_eval(int argc, VALUE *argv,
-	int (*f) (double*, double*, int, double*, int, double, double))
-{
-	gsl_vector *imat, *zp, *z;
-	double alpha, beta;
-	int np, Q, status;
-	VALUE vimat;
-	
-	if (argc < 3) rb_raise(rb_eArgError, "Too few arguments (%d for >= 3)", argc);
-	
-	CHECK_VECTOR(argv[0]);
-	if (VECTOR_P(argv[1])) {
-		Data_Get_Struct(argv[0], gsl_vector, imat);
-		Data_Get_Struct(argv[1], gsl_vector, zp);		
-		vimat = argv[0];
-		if (FIXNUM_P(argv[2])) np = FIX2INT(argv[2]);
-		argc -= 3;
-		argv += 3;
-	} else {
-		Data_Get_Struct(argv[0], gsl_vector, zp);
-		if (FIXNUM_P(argv[1])) np = FIX2INT(argv[1]);		
-		else np = zp->size;
-		imat = gsl_vector_alloc(np);
-		vimat = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, imat);
-		argc -= 2;
-		argv += 2;		
-	}
-	CHECK_VECTOR(argv[0]);
-	Data_Get_Struct(argv[0], gsl_vector, z);
-	argc -= 1;
-	argv += 1;
-	switch (argc) {
-	case 3:
-		Q = FIX2INT(argv[0]);
-		alpha = NUM2DBL(argv[1]);
-		beta = NUM2DBL(argv[2]);
-		break;
-	case 2:
-		Q = z->size;
-		alpha = NUM2DBL(argv[0]);
-		beta = NUM2DBL(argv[1]);
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments.");
-	}
-	(*f)(imat->data, zp->data, np, z->data, Q, alpha, beta);
-	if (status != GSL_SUCCESS) rb_raise(rb_eRuntimeError, "Some error.");
-	return vimat;
-}
-
-static VALUE rb_jac_interpmat_gj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_interpmat_eval(argc, argv, jac_interpmat_gj);
-}
-
-static VALUE rb_jac_interpmat_glj(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_interpmat_eval(argc, argv, jac_interpmat_glj);
-}
-static VALUE rb_jac_interpmat_grjm(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_interpmat_eval(argc, argv, jac_interpmat_grjm);
-}
-static VALUE rb_jac_interpmat_grjp(int argc, VALUE *argv, VALUE module)
-{
-	return rb_jac_interpmat_eval(argc, argv, jac_interpmat_grjp);
-}
-void Init_jacobi(VALUE module)
-{
-	VALUE mjac, cjacq;
-	
-	mjac = rb_define_module("Jac");
-	jac_define_const(mjac);
-	cjacq = rb_define_class_under(mjac, "Quadrature", cGSL_Object);
-	
-	rb_define_module_function(mjac, "jacobi_P0_e", rb_jac_jacobi_P0_e, 3);
-	rb_define_module_function(mjac, "jacobi_P0", rb_jac_jacobi_P0, 3);	
-	rb_define_module_function(mjac, "jacobi_P1_e", rb_jac_jacobi_P1_e, 3);
-	rb_define_module_function(mjac, "jacobi_P1", rb_jac_jacobi_P1, 3);		
-	rb_define_module_function(mjac, "jacobi", rb_jac_jacobi, -1);			
-	rb_define_module_function(mjac, "djacobi_P0_e", rb_jac_djacobi_P0_e, 3);
-	rb_define_module_function(mjac, "djacobi_P0", rb_jac_djacobi_P0, 3);	
-	rb_define_module_function(mjac, "djacobi_P1_e", rb_jac_djacobi_P1_e, 3);
-	rb_define_module_function(mjac, "djacobi_P1", rb_jac_djacobi_P1, 3);			
-	rb_define_module_function(mjac, "djacobi", rb_jac_djacobi, 4);				
-	
-	rb_define_module_function(mjac, "jacobi_zeros", rb_jac_jacobi_zeros, -1);					
-
-	/*****/
-	rb_define_singleton_method(cjacq, "alloc", rb_jac_quadrature_alloc, 1);
-	rb_define_method(cjacq, "Q", rb_jac_quadrature_Q, 0);
-	rb_define_method(cjacq, "type", rb_jac_quadrature_type, 0);	
-	rb_define_method(cjacq, "alpha", rb_jac_quadrature_alpha, 0);	
-	rb_define_method(cjacq, "beta", rb_jac_quadrature_beta, 0);			
-	rb_define_method(cjacq, "x", rb_jac_quadrature_x, 0);
-	rb_define_method(cjacq, "w", rb_jac_quadrature_w, 0);
-	rb_define_method(cjacq, "D", rb_jac_quadrature_D, 0);
-	rb_define_method(cjacq, "xp", rb_jac_quadrature_xp, 0);		
-	rb_define_method(cjacq, "interpmat_alloc", rb_jac_interpmat_alloc, -1);				
-	rb_define_method(cjacq, "interpmat_free", rb_jac_interpmat_free, 0);
-	rb_define_method(cjacq, "zwd", rb_jac_quadrature_zwd, -1);
-	rb_define_method(cjacq, "integrate", rb_jac_integrate, 1);
-	rb_define_method(cjacq, "interpolate", rb_jac_interpolate, -1);
-	rb_define_method(cjacq, "differentiate", rb_jac_differentiate, -1);	
-	/*****/
-	rb_define_module_function(mjac, "diffmat_gj", rb_jac_diffmat_gj, -1);
-	rb_define_module_function(mjac, "diffmat_glj", rb_jac_diffmat_glj, -1);	
-	rb_define_module_function(mjac, "diffmat_grjm", rb_jac_diffmat_grjm, -1);	
-	rb_define_module_function(mjac, "diffmat_grjp", rb_jac_diffmat_grjp, -1);
-	
-	rb_define_module_function(mjac, "weights_gj", rb_jac_weights_gj, -1);	
-	rb_define_module_function(mjac, "weights_glj", rb_jac_weights_glj, -1);	
-	rb_define_module_function(mjac, "weights_grjm", rb_jac_weights_grjm, -1);	
-	rb_define_module_function(mjac, "weights_grjp", rb_jac_weights_grjp, -1);	
-
-	rb_define_module_function(mjac, "zeros_gj", rb_jac_zeros_gj, -1);	
-	rb_define_module_function(mjac, "zeros_glj", rb_jac_zeros_glj, -1);	
-	rb_define_module_function(mjac, "zeros_grjm", rb_jac_zeros_grjm, -1);	
-	rb_define_module_function(mjac, "zeros_grjp", rb_jac_zeros_grjp, -1);	
-	
-	rb_define_module_function(mjac, "lagrange_gj", rb_jac_lagrange_gj, -1);		
-	rb_define_module_function(mjac, "lagrange_glj", rb_jac_lagrange_glj, -1);	
-	rb_define_module_function(mjac, "lagrange_grjm", rb_jac_lagrange_grjm, -1);	
-	rb_define_module_function(mjac, "lagrange_grjp", rb_jac_lagrange_grjp, -1);	
-
-	rb_define_module_function(mjac, "interpmat_gj", rb_jac_interpmat_gj, -1);	
-	rb_define_module_function(mjac, "interpmat_glj", rb_jac_interpmat_glj, -1);	
-	rb_define_module_function(mjac, "interpmat_grjm", rb_jac_interpmat_grjm, -1);	
-	rb_define_module_function(mjac, "interpmat_grjp", rb_jac_interpmat_grjp, -1);	
-	
-}
-
-#endif
-
diff --git a/ext/gsl/ool.c b/ext/gsl/ool.c
deleted file mode 100644
index 6a93c3f..0000000
--- a/ext/gsl/ool.c
+++ /dev/null
@@ -1,879 +0,0 @@
-#ifdef HAVE_OOL_OOL_VERSION_H
-#include "include/rb_gsl.h"
-#include "include/rb_gsl_array.h"
-#include <ool/ool_conmin.h>
-
-static VALUE cool_conmin_function;
-static VALUE cool_conmin_constraint;
-static VALUE cool_conmin_pgrad;
-static VALUE cool_conmin_spg;
-static VALUE cool_conmin_gencan;
-static VALUE cool_conmin_pgrad_parameters;
-static VALUE cool_conmin_spg_parameters;
-static VALUE cool_conmin_gencan_parameters;
-
-#ifndef CHECK_OOL_CONMIN_FUNCTION
-#define CHECK_OOL_CONMIN_FUNCTION(x) if(CLASS_OF(x)!=cool_conmin_function)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (OOL::Conmin::Function expected)",\
-      rb_class2name(CLASS_OF(x)));
-#endif
-
-enum enum_ool_conmin_minimizer_type {
-	OOL_CONMIN_PGRAD,
-	OOL_CONMIN_SPG,
-  OOL_CONMIN_GENCAN,
-};
-
-static const ool_conmin_minimizer_type* get_minimizer_type(VALUE t)
-{
-	char name[64];
-	
-  switch (TYPE(t)) {
-  case T_STRING:
-    strcpy(name, STR2CSTR(t));
-    if (str_tail_grep(name, "pgrad") == 0) {
-			return ool_conmin_minimizer_pgrad;
-    } else if (str_tail_grep(name, "spg") == 0) {
-			return ool_conmin_minimizer_spg;
-    } else if (str_tail_grep(name, "gencan") == 0) {
-			return ool_conmin_minimizer_gencan;
-    } else {
-      rb_raise(rb_eTypeError, "%s: unknown minimizer type", name);
-		}
-		break;
-	case T_FIXNUM:
-		switch (FIX2INT(t)) {	
-			case OOL_CONMIN_PGRAD:
-				return ool_conmin_minimizer_pgrad;
-				break;
-			case OOL_CONMIN_SPG:
-				return ool_conmin_minimizer_spg;
-				break;
-			case OOL_CONMIN_GENCAN:
-				return ool_conmin_minimizer_gencan;
-				break;
-			default:	
-  	     rb_raise(rb_eTypeError, "%d: unknown minimizer type", FIX2INT(t));
-				break;								
-		}
-		break;
-	default:
-		if (t == cool_conmin_pgrad) return ool_conmin_minimizer_pgrad;
-		else if (t == cool_conmin_spg) return ool_conmin_minimizer_spg;
-		else if (t == cool_conmin_gencan) return ool_conmin_minimizer_gencan;
-		else rb_raise(rb_eTypeError, "type is given by a String or a Fixnum");
-		break;
-	}
-}
-
-static void def_const(VALUE module)
-{
-	rb_define_const(module, "CONTINUE", INT2FIX(OOL_CONTINUE));
-	rb_define_const(module, "SUCCESS", INT2FIX(OOL_SUCCESS));
-}
-
-
-static VALUE rb_ool_conmin_minimizer_set(int argc, VALUE *argv, VALUE obj);
-static VALUE rb_ool_conmin_minimizer_alloc(int argc, VALUE *argv, VALUE klass)
-{
-	ool_conmin_minimizer *m;
-	VALUE obj;
-	if (argc < 2) rb_raise(rb_eArgError, "Too few arguments (%d for >= 2)", argc);
-	m = ool_conmin_minimizer_alloc(get_minimizer_type(argv[0]), FIX2INT(argv[1]));
-	obj = Data_Wrap_Struct(klass, 0, ool_conmin_minimizer_free, m);
-	if (argc > 2) rb_ool_conmin_minimizer_set(argc-2, argv+2, obj);
-	return obj;
-}
-
-static void* get_parameter(const ool_conmin_minimizer_type *T, ool_conmin_pgrad_parameters *Pp,
-	ool_conmin_spg_parameters *Ps, ool_conmin_gencan_parameters *Pg, VALUE ary);
-static VALUE rb_ool_conmin_minimizer_set(int argc, VALUE *argv, VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	ool_conmin_function *F;
-	ool_conmin_constraint *C;
-	gsl_vector *v;
-	ool_conmin_pgrad_parameters Pp;
-	ool_conmin_spg_parameters Ps;
-  ool_conmin_gencan_parameters Pg;
-  void *P;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	switch (argc) {
-	case 3:
-		if (CLASS_OF(argv[0]) != cool_conmin_function) 
-			rb_raise(rb_eTypeError, "Wrong argument type 0 (OOL::Conmin::Function expected)");
-		if (CLASS_OF(argv[1]) != cool_conmin_constraint) 
-			rb_raise(rb_eTypeError, "Wrong argument type 1 (OOL::Conmin::Constraint expected)");
-		if (!VECTOR_P(argv[2]))
-			rb_raise(rb_eTypeError, "Wrong argument type 2 (GSL::Vector expected)");	
-		Data_Get_Struct(argv[0], ool_conmin_function, F);
-		Data_Get_Struct(argv[1], ool_conmin_constraint, C);
-		Data_Get_Struct(argv[2], gsl_vector, v);
-		P = get_parameter(m->type, &Pp, &Ps, &Pg, Qnil);			
-		ool_conmin_minimizer_set(m, F, C, v, P);						
-		break;
-	case 4:
-		if (CLASS_OF(argv[0]) != cool_conmin_function) 
-			rb_raise(rb_eTypeError, "Wrong argument type 0 (OOL::Conmin::Function expected)");
-		if (CLASS_OF(argv[1]) != cool_conmin_constraint) 
-			rb_raise(rb_eTypeError, "Wrong argument type 1 (OOL::Conmin::Constraint expected)");
-		if (!VECTOR_P(argv[2]))
-			rb_raise(rb_eTypeError, "Wrong argument type 2 (GSL::Vector expected)");	
-		if (!rb_obj_is_kind_of(argv[3], rb_cArray) && argv[3] != Qnil)
-			rb_raise(rb_eTypeError, "Wrong argument type 3 (Array expected)");	
-		Data_Get_Struct(argv[0], ool_conmin_function, F);
-		Data_Get_Struct(argv[1], ool_conmin_constraint, C);
-		Data_Get_Struct(argv[2], gsl_vector, v);
-		P = get_parameter(m->type, &Pp, &Ps, &Pg, argv[3]);			
-		ool_conmin_minimizer_set(m, F, C, v, P);					
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
-	}
-	return obj;	
-}
-
-static void* get_parameter(const ool_conmin_minimizer_type *T, ool_conmin_pgrad_parameters *Pp,
-	ool_conmin_spg_parameters *Ps, ool_conmin_gencan_parameters *Pg, VALUE ary)
-{
-	if (T == ool_conmin_minimizer_pgrad) {
-		if (ary == Qnil) {
-			ool_conmin_parameters_default(T, (void*) Pp);
-		} else {
-			Pp->fmin = NUM2DBL(rb_ary_entry(ary, 0));
-			Pp->tol = NUM2DBL(rb_ary_entry(ary, 1));		
-			Pp->alpha = NUM2DBL(rb_ary_entry(ary, 2));
-			Pp->sigma1 = NUM2DBL(rb_ary_entry(ary, 3));
-			Pp->sigma2 = NUM2DBL(rb_ary_entry(ary, 4));						
-		}
-		return (void*) Pp;
-	} else if (T == ool_conmin_minimizer_spg) {
-		if (ary == Qnil) {
-			ool_conmin_parameters_default(T, (void*) Ps);
-		} else {
-			Ps->fmin = NUM2DBL(rb_ary_entry(ary, 0));
-			Ps->tol = NUM2DBL(rb_ary_entry(ary, 1));		
-			Ps->M = NUM2DBL(rb_ary_entry(ary, 2));
-			Ps->alphamin = NUM2DBL(rb_ary_entry(ary, 3));
-			Ps->alphamax = NUM2DBL(rb_ary_entry(ary, 4));								
-			Ps->gamma = NUM2DBL(rb_ary_entry(ary, 5));								
-			Ps->sigma2 = NUM2DBL(rb_ary_entry(ary, 6));										
-			Ps->sigma2 = NUM2DBL(rb_ary_entry(ary, 7));												
-		}
-		return (void*) Ps;
-	} else {
-		if (ary == Qnil) {
-			ool_conmin_parameters_default(T, (void*) Pg);
-		} else {
-			Pg->epsgpen = NUM2DBL(rb_ary_entry(ary, 0));
-			Pg->epsgpsn = NUM2DBL(rb_ary_entry(ary, 1));		
-			Pg->fmin = NUM2DBL(rb_ary_entry(ary, 2));
-			Pg->udelta0 = NUM2DBL(rb_ary_entry(ary, 3));
-			Pg->ucgmia = NUM2DBL(rb_ary_entry(ary, 4));								
-			Pg->ucgmib = NUM2DBL(rb_ary_entry(ary, 5));								
-			Pg->cg_scre = FIX2INT(rb_ary_entry(ary, 6));										
-			Pg->cg_gpnf = NUM2DBL(rb_ary_entry(ary, 7));				
-			Pg->cg_epsi = NUM2DBL(rb_ary_entry(ary, 8));				
-			Pg->cg_epsf = NUM2DBL(rb_ary_entry(ary, 9));													
-			Pg->cg_epsnqmp = NUM2DBL(rb_ary_entry(ary, 10));
-			Pg->cg_maxitnqmp = (size_t) FIX2INT(rb_ary_entry(ary, 11));
-			Pg->nearlyq = FIX2INT(rb_ary_entry(ary, 12));			
-			Pg->nint = NUM2DBL(rb_ary_entry(ary, 13));						
-			Pg->next = NUM2DBL(rb_ary_entry(ary, 14));						
-			Pg->mininterp = (size_t) FIX2INT(rb_ary_entry(ary, 15));
-			Pg->maxextrap = (size_t) FIX2INT(rb_ary_entry(ary, 16));						
-			Pg->trtype = FIX2INT(rb_ary_entry(ary, 17));						
-			Pg->eta = NUM2DBL(rb_ary_entry(ary, 18));																
-			Pg->delmin = NUM2DBL(rb_ary_entry(ary, 19));			
-			Pg->lspgmi = NUM2DBL(rb_ary_entry(ary, 20));			
-			Pg->lspgma = NUM2DBL(rb_ary_entry(ary, 21));			
-			Pg->theta = NUM2DBL(rb_ary_entry(ary, 22));			
-			Pg->gamma = NUM2DBL(rb_ary_entry(ary, 23));
-			Pg->beta = NUM2DBL(rb_ary_entry(ary, 24));			
-			Pg->sigma1 = NUM2DBL(rb_ary_entry(ary, 25));			
-			Pg->sigma2 = NUM2DBL(rb_ary_entry(ary, 26));			
-			Pg->epsrel = NUM2DBL(rb_ary_entry(ary, 27));			
-			Pg->epsabs = NUM2DBL(rb_ary_entry(ary, 28));			
-			Pg->infrel = NUM2DBL(rb_ary_entry(ary, 29));			
-			Pg->infabs = NUM2DBL(rb_ary_entry(ary, 30));															
-		}		
-		return (void*) Pg;		
-	}
-}
-
-static VALUE create_parameters_ary_pgrad(ool_conmin_pgrad_parameters *Pp)
-{
-	VALUE ary;
-	ary = rb_ary_new2(5);
-	rb_ary_store(ary, 0, rb_float_new(Pp->fmin));
-	rb_ary_store(ary, 1, rb_float_new(Pp->tol));
-	rb_ary_store(ary, 2, rb_float_new(Pp->alpha));
-	rb_ary_store(ary, 3, rb_float_new(Pp->sigma1));
-	rb_ary_store(ary, 4, rb_float_new(Pp->sigma2));			
-	return ary;
-}
-
-static VALUE create_parameters_ary_spg(ool_conmin_spg_parameters *Ps)
-{
-	VALUE ary;
-		ary = rb_ary_new2(8);
-		rb_ary_store(ary, 0, rb_float_new(Ps->fmin));
-		rb_ary_store(ary, 1, rb_float_new(Ps->tol));
-		rb_ary_store(ary, 2, rb_float_new(Ps->M));
-		rb_ary_store(ary, 3, rb_float_new(Ps->alphamin));
-		rb_ary_store(ary, 4, rb_float_new(Ps->alphamax));					
-		rb_ary_store(ary, 5, rb_float_new(Ps->gamma));					
-		rb_ary_store(ary, 6, rb_float_new(Ps->sigma2));					
-		rb_ary_store(ary, 7, rb_float_new(Ps->sigma2));					
-		return ary;	
-}
-
-static VALUE create_parameters_ary_gencan(ool_conmin_gencan_parameters *Pg)
-{
-	VALUE ary;
-		ary = rb_ary_new2(31);
-		rb_ary_store(ary, 0, rb_float_new(Pg->epsgpen));
-		rb_ary_store(ary, 1, rb_float_new(Pg->epsgpsn));
-		rb_ary_store(ary, 2, rb_float_new(Pg->fmin));
-		rb_ary_store(ary, 3, rb_float_new(Pg->udelta0));
-		rb_ary_store(ary, 4, rb_float_new(Pg->ucgmia));
-		rb_ary_store(ary, 5, rb_float_new(Pg->ucgmib));
-		rb_ary_store(ary, 6, INT2FIX(Pg->cg_scre));
-		rb_ary_store(ary, 7, rb_float_new(Pg->cg_gpnf));
-		rb_ary_store(ary, 8, rb_float_new(Pg->cg_epsi));
-		rb_ary_store(ary, 9, rb_float_new(Pg->cg_epsf));
-		rb_ary_store(ary, 10, rb_float_new(Pg->cg_epsnqmp));
-		rb_ary_store(ary, 11, INT2FIX((int) Pg->cg_maxitnqmp));
-		rb_ary_store(ary, 12, INT2FIX(Pg->nearlyq));
-		rb_ary_store(ary, 13, rb_float_new(Pg->nint));
-		rb_ary_store(ary, 14, rb_float_new(Pg->next));
-		rb_ary_store(ary, 15, INT2FIX((int)Pg->mininterp));
-		rb_ary_store(ary, 16, INT2FIX((int)Pg->maxextrap));
-		rb_ary_store(ary, 17, INT2FIX(Pg->trtype));
-		rb_ary_store(ary, 18, rb_float_new(Pg->eta));
-		rb_ary_store(ary, 19, rb_float_new(Pg->delmin));
-		rb_ary_store(ary, 20, rb_float_new(Pg->lspgmi));
-		rb_ary_store(ary, 21, rb_float_new(Pg->lspgma));
-		rb_ary_store(ary, 22, rb_float_new(Pg->theta));
-		rb_ary_store(ary, 23, rb_float_new(Pg->gamma));
-		rb_ary_store(ary, 24, rb_float_new(Pg->beta));
-		rb_ary_store(ary, 25, rb_float_new(Pg->sigma1));
-		rb_ary_store(ary, 26, rb_float_new(Pg->sigma2));
-		rb_ary_store(ary, 27, rb_float_new(Pg->epsrel));
-		rb_ary_store(ary, 28, rb_float_new(Pg->epsabs));
-		rb_ary_store(ary, 29, rb_float_new(Pg->infrel));
-		rb_ary_store(ary, 30, rb_float_new(Pg->infabs));			
-	return ary;
-}
-static VALUE rb_ool_conmin_minimizer_parameters_get(VALUE obj)
-{
-	ool_conmin_minimizer *m;	
-	ool_conmin_pgrad_parameters *Pp;
-	ool_conmin_spg_parameters *Ps;
-	ool_conmin_gencan_parameters *Pg;	
-	void *P;
-	VALUE ary;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-  ool_conmin_parameters_get(m, P);
-	if (m->type == 	ool_conmin_minimizer_pgrad) {
-		Pp = (ool_conmin_pgrad_parameters*) P;
-		ary = create_parameters_ary_pgrad(Pp);
-	} else if (m->type == ool_conmin_minimizer_spg) {
-		Ps = (ool_conmin_spg_parameters*) P;
-		ary = create_parameters_ary_spg(Ps);						
-	} else {
-		Pg = (ool_conmin_gencan_parameters*) P;
-		ary = create_parameters_ary_gencan(Pg);						
-	}
-	return ary;
-}
-
-static VALUE rb_ool_conmin_minimizer_parameters_set(VALUE obj, VALUE params)
-{
-	ool_conmin_minimizer *m;
-	ool_conmin_pgrad_parameters *Pp;
-	ool_conmin_spg_parameters *Ps;
-	ool_conmin_gencan_parameters *Pg;
-	void *P;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	P = get_parameter(m->type, Pp, Ps, Pg, params);
-	ool_conmin_parameters_set(m, P);
-	return params;
-}
-
-static VALUE rb_ool_conmin_minimizer_name(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return rb_str_new2(ool_conmin_minimizer_name(m));
-}
-static VALUE rb_ool_conmin_minimizer_f(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return rb_float_new(m->f);
-}
-static VALUE rb_ool_conmin_minimizer_x(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return Data_Wrap_Struct(cgsl_vector, 0, NULL, m->x);
-}
-static VALUE rb_ool_conmin_minimizer_gradient(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return Data_Wrap_Struct(cgsl_vector, 0, NULL, m->gradient);
-}
-static VALUE rb_ool_conmin_minimizer_minimum(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return rb_float_new(ool_conmin_minimizer_minimum(m));
-}
-static VALUE rb_ool_conmin_minimizer_dx(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return Data_Wrap_Struct(cgsl_vector, 0, NULL, m->dx);
-}
-static VALUE rb_ool_conmin_minimizer_size(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return rb_float_new(ool_conmin_minimizer_size(m));
-}
-static VALUE rb_ool_conmin_minimizer_fcount(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return INT2FIX((int) ool_conmin_minimizer_fcount(m));
-}
-static VALUE rb_ool_conmin_minimizer_gcount(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return INT2FIX((int) ool_conmin_minimizer_gcount(m));
-}
-static VALUE rb_ool_conmin_minimizer_hcount(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return INT2FIX((int) ool_conmin_minimizer_hcount(m));
-}
-static VALUE rb_ool_conmin_minimizer_is_optimal(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return INT2FIX((int) ool_conmin_is_optimal(m));
-}
-static VALUE rb_ool_conmin_minimizer_is_optimal2(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	if (ool_conmin_is_optimal(m)) return Qtrue;
-	else return Qfalse;
-}
-static VALUE rb_ool_conmin_minimizer_iterate(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return INT2FIX((int) ool_conmin_minimizer_iterate(m));
-}
-static VALUE rb_ool_conmin_minimizer_restart(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	return INT2FIX((int) ool_conmin_minimizer_restart(m));
-}
-
-static VALUE rb_ool_conmin_pgrad_parameters_default(VALUE klass);
-static VALUE rb_ool_conmin_spg_parameters_default(VALUE klass);
-static VALUE rb_ool_conmin_gencan_parameters_default(VALUE klass);
-
-static VALUE rb_ool_conmin_minimizer_parameters_default(VALUE obj)
-{
-	ool_conmin_minimizer *m;
-	Data_Get_Struct(obj, ool_conmin_minimizer, m);
-	if (m->type == ool_conmin_minimizer_spg) {
-			return rb_ool_conmin_spg_parameters_default(cool_conmin_spg);
-	} else if (m->type == ool_conmin_minimizer_pgrad) {
-			return rb_ool_conmin_pgrad_parameters_default(cool_conmin_pgrad);		
-	} else if (m->type == ool_conmin_minimizer_gencan) {
-			return rb_ool_conmin_gencan_parameters_default(cool_conmin_gencan);		
-	} else {
-			rb_raise(rb_eRuntimeError, "Unkowm minimizer type.");
-	}	
-	return Qnil;   /* never reaches here */
-}
-
-/***/
-
-static void rb_ool_conmin_function_mark(ool_conmin_function *F)
-{
-  rb_gc_mark((VALUE) F->params);
-}
-
-static double rb_ool_conmin_function_f(const gsl_vector *x, void *p);
-static void rb_ool_conmin_function_df(const gsl_vector *x, void *p, gsl_vector *g);
-static void rb_ool_conmin_function_fdf(const gsl_vector *x, void *p, 
-				      double *f, gsl_vector *g);
-static void rb_ool_conmin_function_Hv(const gsl_vector *X, void *params,
-			const gsl_vector *V, gsl_vector *hv);				  
-static void set_functions(int argc, VALUE *argv, ool_conmin_function *F);
-static void set_params(ool_conmin_function *F, VALUE p);
-static VALUE rb_ool_conmin_function_set_n(VALUE obj, VALUE nn);
-static VALUE rb_ool_conmin_function_set_functions(int argc, VALUE *argv, VALUE obj);
-static VALUE rb_ool_conmin_function_set(int argc, VALUE *argv, VALUE obj);
-			    
-static VALUE rb_ool_conmin_function_alloc(int argc, VALUE *argv, VALUE klass)
-{
-  ool_conmin_function *F = NULL;
-  VALUE ary, obj;
-
-  F = ALLOC(ool_conmin_function);
-  F->f = &rb_ool_conmin_function_f;
-  F->df = &rb_ool_conmin_function_df;
-  F->fdf = &rb_ool_conmin_function_fdf;
-  F->Hv = &rb_ool_conmin_function_Hv;
-  F->n = 0;
-  ary = rb_ary_new2(5);
-
-  F->params = (void *) ary;
-  rb_ary_store(ary, 0, Qnil);  /* proc f */
-  rb_ary_store(ary, 1, Qnil);  /* proc df */
-  rb_ary_store(ary, 2, Qnil);  /* proc fdf */
-  rb_ary_store(ary, 3, Qnil);  /* proc Hv */
-  rb_ary_store(ary, 4, Qnil);  /* params */
-//  set_functions(argc, argv, F);
-	obj = Data_Wrap_Struct(klass, rb_ool_conmin_function_mark, free, F);
-	rb_ool_conmin_function_set(argc, argv, obj);
-  return obj;
-}
-
-static VALUE rb_ool_conmin_function_set(int argc, VALUE *argv, VALUE obj)
-{
-	ool_conmin_function *F;
-	Data_Get_Struct(obj, ool_conmin_function, F);
-	switch (argc) {
-	case 0:
-			break;
-	case 1:
-		rb_ool_conmin_function_set_n(obj, argv[0]);
-		break;
-	case 4:
-		set_functions(argc, argv, F);
-		break;
-	case 5:
-		if (FIXNUM_P(argv[0])) {
-			rb_ool_conmin_function_set_n(obj, argv[0]);			
-			set_functions(argc-1, argv+1, F);			
-		} else {
-			set_functions(argc-1, argv, F);
-			set_params(F, argv[argc-1]);
-		}
-		break;
-	case 6:
-		rb_ool_conmin_function_set_n(obj, argv[0]);	
-		set_functions(argc-2, argv+1, F);			
-		set_params(F, argv[argc-1]);		
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments.");
-	}	
-	return obj;
-}
-
-static VALUE rb_ool_conmin_function_set_n(VALUE obj, VALUE nn)
-{
-  ool_conmin_function *F = NULL;
-	if (FIXNUM_P(nn)) {
-		Data_Get_Struct(obj, ool_conmin_function, F);
-	  F->n = (size_t) FIX2INT(nn);		
-	} else {
-			rb_raise(rb_eArgError, "Wrong argument type %s (Fixnum expected)",
-							rb_class2name(CLASS_OF(nn)));
-	}
-  return nn;
-}
-
-static VALUE rb_ool_conmin_function_n(VALUE obj)
-{
-  ool_conmin_function *F = NULL;
-  Data_Get_Struct(obj, ool_conmin_function, F);
-  return INT2FIX((int) F->n);
-}
-static double rb_ool_conmin_function_f(const gsl_vector *x, void *p)
-{
-  VALUE vx, proc, vp, result, ary;
-  vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
-  ary = (VALUE) p;
-  proc = rb_ary_entry(ary, 0);
-  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
-  if (NIL_P(vp)) result = rb_funcall(proc, RBGSL_ID_call, 1, vx);
-  else result = rb_funcall(proc, RBGSL_ID_call, 2, vx, vp);
-  return NUM2DBL(result);
-}
-
-static void rb_ool_conmin_function_df(const gsl_vector *x, void *p, gsl_vector *g)
-{
-  VALUE vx, vg, proc, vp, ary;
-  vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
-  vg = Data_Wrap_Struct(cgsl_vector, 0, NULL, g);
-  ary = (VALUE) p;
-  proc = rb_ary_entry(ary, 1);
-  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
-  if (NIL_P(vp)) {
-    rb_funcall(proc, RBGSL_ID_call, 2, vx, vg);
-  } else {
-    rb_funcall(proc, RBGSL_ID_call, 3, vx, vp, vg);
-  }
-}
-
-static void rb_ool_conmin_function_fdf(const gsl_vector *x, void *p, 
-				      double *f, gsl_vector *g)
-{
-  VALUE vx, vf, vg, proc_fdf, proc_f, proc_df, vp, ary, result;
-  vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
-  vg = Data_Wrap_Struct(cgsl_vector, 0, NULL, g);
-  vf = rb_float_new(*f);
-  ary = (VALUE) p;
-  proc_f = rb_ary_entry(ary, 0);
-  proc_df = rb_ary_entry(ary, 1);
-  proc_fdf = rb_ary_entry(ary, 2);
-  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
-  if (NIL_P(vp)) {
-    result = rb_funcall(proc_f, RBGSL_ID_call, 1, vx);
-    rb_funcall(proc_df, RBGSL_ID_call, 2, vx, vg);
-  } else {
-    result = rb_funcall(proc_f, RBGSL_ID_call, 2, vx, vp);
-    rb_funcall(proc_df, RBGSL_ID_call, 3, vx, vp, vg);
-  }
-  *f = NUM2DBL(result);
-}
-
-static void rb_ool_conmin_function_Hv(const gsl_vector *X, void *params,
-			const gsl_vector *V, gsl_vector *hv)
-{
-	VALUE vX, vV, vHv, ary, proc_Hv, vp;
-	vX = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector*) X);
-	vV = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector*) V);
-	vHv = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector*) hv);
-	ary = (VALUE) params;
-	proc_Hv = rb_ary_entry(ary, 3);
-  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
-  if (NIL_P(vp)) {
-    rb_funcall(proc_Hv, RBGSL_ID_call, 3, vX, vV, vHv);
-  } else {
-    rb_funcall(proc_Hv, RBGSL_ID_call, 4, vX, vp, vV, vHv);
-  }  	
-}
-
-static VALUE rb_ool_conmin_function_set_functions(int argc, VALUE *argv, VALUE obj)
-{
-	ool_conmin_function *F;
-	Data_Get_Struct(obj, ool_conmin_function, F);
-	set_functions(argc, argv, F);
-	return obj;
-}
-
-static void set_functions(int argc, VALUE *argv, ool_conmin_function *F)
-{
-  VALUE ary;
-  size_t i;
-  if (F->params == NULL) {
-    ary = rb_ary_new2(5);
-    /*    (VALUE) F->params = ary;*/
-    F->params = (void *) ary;
-  } else {
-    ary = (VALUE) F->params;
-  }
-  switch (argc) {
-	case 4:
-		for (i = 0; i < argc; i++) rb_ary_store(ary, i, argv[i]);
-		break;
-	default:
-		rb_raise(rb_eArgError,"Wrong number of arguments (%d for 4)", argc);
-	}
-}
-
-static VALUE rb_ool_conmin_function_set_f(VALUE obj, VALUE proc)
-{
-	ool_conmin_function *F;
-	VALUE ary;
-	Data_Get_Struct(obj, ool_conmin_function, F);	
-  if (F->params == NULL) {
-    ary = rb_ary_new2(5);
-    F->params = (void *) ary;
-  } else {
-    ary = (VALUE) F->params;
-  }
-  rb_ary_store(ary, 0, proc);
-  return proc;  
-}
-
-static VALUE rb_ool_conmin_function_set_df(VALUE obj, VALUE proc)
-{
-	ool_conmin_function *F;
-	VALUE ary;
-	Data_Get_Struct(obj, ool_conmin_function, F);	
-  if (F->params == NULL) {
-    ary = rb_ary_new2(5);
-    F->params = (void *) ary;
-  } else {
-    ary = (VALUE) F->params;
-  }
-  rb_ary_store(ary, 1, proc);
-  return proc;  
-}
-
-static VALUE rb_ool_conmin_function_set_fdf(VALUE obj, VALUE proc)
-{
-	ool_conmin_function *F;
-	VALUE ary;
-	Data_Get_Struct(obj, ool_conmin_function, F);	
-  if (F->params == NULL) {
-    ary = rb_ary_new2(5);
-    F->params = (void *) ary;
-  } else {
-    ary = (VALUE) F->params;
-  }
-  rb_ary_store(ary, 2, proc);
-  return proc;  
-}
-
-static VALUE rb_ool_conmin_function_set_Hv(VALUE obj, VALUE proc)
-{
-	ool_conmin_function *F;
-	VALUE ary;
-	Data_Get_Struct(obj, ool_conmin_function, F);	
-  if (F->params == NULL) {
-    ary = rb_ary_new2(5);
-    F->params = (void *) ary;
-  } else {
-    ary = (VALUE) F->params;
-  }
-  rb_ary_store(ary, 3, proc);
-  return proc;
-}
-
-static VALUE rb_ool_conmin_function_set_params(VALUE obj, VALUE p)
-{
-	ool_conmin_function *F;
-	Data_Get_Struct(obj, ool_conmin_function, F);
-	set_params(F, p);
-	return p;
-}
-
-static void set_params(ool_conmin_function *F, VALUE p)
-{
-	VALUE ary;
-  if (F->params == NULL) {
-    ary = rb_ary_new2(5);
-    /*    (VALUE) F->params = ary;*/
-    F->params = (void *) ary;
-  } else {
-    ary = (VALUE) F->params;
-  }
-  rb_ary_store(ary, 4, p);
-}
-
-static VALUE rb_ool_conmin_function_params(VALUE obj)
-{
-	ool_conmin_function *F;
-	Data_Get_Struct(obj, ool_conmin_function, F);
-	return rb_ary_entry((VALUE) F->params, 4);;
-}
-
-static VALUE rb_ool_conmin_constraint_set(int argc, VALUE *argv, VALUE obj);
-static VALUE rb_ool_conmin_constraint_set_n(VALUE obj, VALUE n);
-static VALUE rb_ool_conmin_constraint_alloc(int argc, VALUE *argv, VALUE klass)
-{
-	ool_conmin_constraint *C;
-	VALUE obj;
-	C = ALLOC(ool_conmin_constraint);
-	C->n = 0;
-	C->L = NULL;
-	C->U = NULL;
-	
-	obj = Data_Wrap_Struct(klass, 0, free, C);
-	rb_ool_conmin_constraint_set(argc, argv, obj);
-	return obj;
-}
-
-static VALUE rb_ool_conmin_constraint_set_n(VALUE obj, VALUE n)
-{	
-	ool_conmin_constraint *C;
-	if (!FIXNUM_P(n)) rb_raise(rb_eArgError, "Wrong argument type %s (Fixnum expected)",
-		rb_class2name(CLASS_OF(n)));
-	Data_Get_Struct(obj, ool_conmin_constraint, C);
-	C->n = (size_t) FIX2INT(n);
-	return n;
-}
-
-static VALUE rb_ool_conmin_constraint_set_L(VALUE obj, VALUE vL)
-{
-	ool_conmin_constraint *C;	
-	gsl_vector *L;
-	CHECK_VECTOR(vL);
-	Data_Get_Struct(obj, ool_conmin_constraint, C);	
-	Data_Get_Struct(vL, gsl_vector, L);
-	C->L = L;
-	return vL;
-}
-
-static VALUE rb_ool_conmin_constraint_set_U(VALUE obj, VALUE vU)
-{
-	ool_conmin_constraint *C;	
-	gsl_vector *U;
-	CHECK_VECTOR(vU);
-	Data_Get_Struct(obj, ool_conmin_constraint, C);	
-	Data_Get_Struct(vU, gsl_vector, U);
-	C->U = U;
-	return vU;
-}
-
-static VALUE rb_ool_conmin_constraint_set_LU(VALUE obj, VALUE vL, VALUE vU)
-{
-	rb_ool_conmin_constraint_set_L(obj, vL);
-	rb_ool_conmin_constraint_set_U(obj, vU);
-	return obj;
-}
-
-static VALUE rb_ool_conmin_constraint_set(int argc, VALUE *argv, VALUE obj)
-{
-	ool_conmin_constraint *C;	
-	Data_Get_Struct(obj, ool_conmin_constraint, C);	
-	switch (argc) {
-	case 0:
-		break;
-	case 1:
-		rb_ool_conmin_constraint_set_n(obj, argv[0]);
-		break;
-	case 2:
-		rb_ool_conmin_constraint_set_LU(obj, argv[0], argv[1]);	
-		break;
-	case 3:
-		rb_ool_conmin_constraint_set_n(obj, argv[0]);	
-		rb_ool_conmin_constraint_set_LU(obj, argv[1], argv[2]);			
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1-3)", argc);
-	}
-	return obj;
-}
-
-static VALUE rb_ool_conmin_pgrad_parameters_default(VALUE klass)
-{
-	ool_conmin_pgrad_parameters P;
-	VALUE ary;
-	ool_conmin_parameters_default(ool_conmin_minimizer_pgrad, (void*) &P);
-	ary = create_parameters_ary_pgrad(&P);
-	RBGSL_SET_CLASS(ary, cool_conmin_pgrad_parameters);
-	return ary;
-}
-
-static VALUE rb_ool_conmin_spg_parameters_default(VALUE klass)
-{
-	ool_conmin_spg_parameters P;
-	VALUE ary;
-	ool_conmin_parameters_default(ool_conmin_minimizer_spg, (void*) &P);
-	ary = create_parameters_ary_spg(&P);	
-	RBGSL_SET_CLASS(ary, cool_conmin_spg_parameters);	
-	return ary;	
-}
-
-static VALUE rb_ool_conmin_gencan_parameters_default(VALUE klass)
-{
-	ool_conmin_gencan_parameters P;
-	VALUE ary;
-	ool_conmin_parameters_default(ool_conmin_minimizer_gencan, (void*) &P);
-	ary = create_parameters_ary_gencan(&P);		
-	RBGSL_SET_CLASS(ary, cool_conmin_gencan_parameters);	
-	return ary;
-}
-
-/*************************************************/
-void Init_ool(VALUE module) 
-{
-	VALUE mOOL, mConmin;
-	VALUE cool_conmin_minimizer;
-	
-	mOOL = rb_define_module("OOL");
-	mConmin = rb_define_module_under(mOOL, "Conmin");
-	cool_conmin_function = rb_define_class_under(mConmin, "Function", cgsl_function);
-	cool_conmin_constraint = rb_define_class_under(mConmin, "Constraint", cGSL_Object);
- 	cool_conmin_minimizer = rb_define_class_under(mConmin, "Minimizer", cGSL_Object);
- 	cool_conmin_pgrad = rb_define_class_under(cool_conmin_minimizer, "Pgrad", cGSL_Object);
- 	cool_conmin_spg = rb_define_class_under(cool_conmin_minimizer, "Spg", cGSL_Object);
- 	cool_conmin_gencan = rb_define_class_under(cool_conmin_minimizer, "Gencan", cGSL_Object); 	
-
- 	def_const(mOOL); 	
- 	
- 	rb_define_singleton_method(cool_conmin_minimizer, "alloc", rb_ool_conmin_minimizer_alloc, -1);
- 	rb_define_method(cool_conmin_minimizer, "set", rb_ool_conmin_minimizer_set, -1); 	
- 	rb_define_method(cool_conmin_minimizer, "parameters_default", rb_ool_conmin_minimizer_parameters_default, 0); 	
- 	rb_define_method(cool_conmin_minimizer, "name", rb_ool_conmin_minimizer_name, 0);
- 	rb_define_method(cool_conmin_minimizer, "size", rb_ool_conmin_minimizer_size, 0); 	
- 	rb_define_method(cool_conmin_minimizer, "f", rb_ool_conmin_minimizer_f, 0);
- 	rb_define_method(cool_conmin_minimizer, "x", rb_ool_conmin_minimizer_x, 0);
- 	rb_define_method(cool_conmin_minimizer, "dx", rb_ool_conmin_minimizer_dx, 0);
- 	rb_define_method(cool_conmin_minimizer, "gradient", rb_ool_conmin_minimizer_gradient, 0); 	 	
- 	rb_define_method(cool_conmin_minimizer, "minimum", rb_ool_conmin_minimizer_minimum, 0); 	 	 	
- 	rb_define_method(cool_conmin_minimizer, "fcount", rb_ool_conmin_minimizer_fcount, 0); 	
- 	rb_define_method(cool_conmin_minimizer, "gcount", rb_ool_conmin_minimizer_gcount, 0); 	
- 	rb_define_method(cool_conmin_minimizer, "hcount", rb_ool_conmin_minimizer_hcount, 0); 	 	 	
- 	rb_define_method(cool_conmin_minimizer, "is_optimal", rb_ool_conmin_minimizer_is_optimal, 0);
- 	rb_define_method(cool_conmin_minimizer, "is_optimal?", rb_ool_conmin_minimizer_is_optimal2, 0); 	
- 	rb_define_method(cool_conmin_minimizer, "iterate", rb_ool_conmin_minimizer_iterate, 0); 	 	 	
- 	rb_define_method(cool_conmin_minimizer, "restart", rb_ool_conmin_minimizer_restart, 0); 	 	 	
- 	rb_define_method(cool_conmin_minimizer, "parameters_get", rb_ool_conmin_minimizer_parameters_get, 0);
- 	rb_define_method(cool_conmin_minimizer, "parameters_set", rb_ool_conmin_minimizer_parameters_set, 1);
-  	 	
- 	rb_define_singleton_method(cool_conmin_function, "alloc", rb_ool_conmin_function_alloc, -1);
- 	rb_define_method(cool_conmin_function, "set", rb_ool_conmin_function_set, -1);
- 	rb_define_method(cool_conmin_function, "set_n", rb_ool_conmin_function_set_n, 1);
-	rb_define_alias(cool_conmin_function, "n=", "set_n"); 	
- 	rb_define_method(cool_conmin_function, "n", rb_ool_conmin_function_n, 0); 	
- 	rb_define_method(cool_conmin_function, "params", rb_ool_conmin_function_params, 0); 	 	
- 	rb_define_method(cool_conmin_function, "set_params", rb_ool_conmin_function_set_params, 1);
-	rb_define_alias(cool_conmin_function, "params=", "set_params"); 	 	
- 	rb_define_method(cool_conmin_function, "set_functions", rb_ool_conmin_function_set_functions, 1);
-	rb_define_alias(cool_conmin_function, "functions=", "set_functions"); 	 		
- 	rb_define_method(cool_conmin_function, "set_f", rb_ool_conmin_function_set_f, 1);
-	rb_define_alias(cool_conmin_function, "f=", "set_f"); 	 	
- 	rb_define_method(cool_conmin_function, "set_df", rb_ool_conmin_function_set_df, 1);
-	rb_define_alias(cool_conmin_function, "df=", "set_df"); 	 	
- 	rb_define_method(cool_conmin_function, "set_fdf", rb_ool_conmin_function_set_fdf, 1);
-	rb_define_alias(cool_conmin_function, "fdf=", "set_fdf"); 	 	
- 	rb_define_method(cool_conmin_function, "set_Hv", rb_ool_conmin_function_set_Hv, 1);
-	rb_define_alias(cool_conmin_function, "Hv=", "set_Hv"); 	 						
-
-	rb_define_singleton_method(cool_conmin_constraint, "alloc", rb_ool_conmin_constraint_alloc,
-		-1);
-	rb_define_method(cool_conmin_constraint, "set", rb_ool_conmin_constraint_set, -1);		
-	rb_define_method(cool_conmin_constraint, "set_n", rb_ool_conmin_constraint_set_n, 1);
-	rb_define_alias(cool_conmin_constraint, "n=", "set_n");
-	rb_define_method(cool_conmin_constraint, "set_L", rb_ool_conmin_constraint_set_L, 1);
-	rb_define_alias(cool_conmin_constraint, "L=", "set_L");	
-	rb_define_method(cool_conmin_constraint, "set_U", rb_ool_conmin_constraint_set_U, 1);
-	rb_define_alias(cool_conmin_constraint, "U=", "set_U");	
-	rb_define_method(cool_conmin_constraint, "set_LU", rb_ool_conmin_constraint_set_LU, 2);
-	rb_define_alias(cool_conmin_constraint, "LU=", "set_LU");		
-	
-	cool_conmin_pgrad_parameters = rb_define_class_under(cool_conmin_pgrad, "Parameters",
-			rb_cArray);
-	cool_conmin_spg_parameters = rb_define_class_under(cool_conmin_spg, "Parameters",
-			rb_cArray);
-	cool_conmin_gencan_parameters = rb_define_class_under(cool_conmin_gencan, "Parameters",
-			rb_cArray);			
-	rb_define_singleton_method(cool_conmin_pgrad, "parameters_default",
-		rb_ool_conmin_pgrad_parameters_default, 0);	
-	rb_define_singleton_method(cool_conmin_spg, "parameters_default",
-		rb_ool_conmin_spg_parameters_default, 0);	
-	rb_define_singleton_method(cool_conmin_gencan, "parameters_default",
-		rb_ool_conmin_gencan_parameters_default, 0);							
-}
-
-#endif
diff --git a/ext/gsl/oper_complex_source.c b/ext/gsl/oper_complex_source.c
deleted file mode 100644
index 4071756..0000000
--- a/ext/gsl/oper_complex_source.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* matrix/oper_complex_source.c
- * 
- * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef GSL_1_2_LATER
-#include <config.h>
-#include <stdlib.h>
-#include <math.h>
-#include <gsl/gsl_math.h>
-#include <gsl/gsl_matrix.h>
-
-#define BASE_GSL_COMPLEX
-#include "include/templates_on.h"
-
-int
-FUNCTION (gsl_matrix, add) (GSL_TYPE (gsl_matrix) * a,
-                            const GSL_TYPE (gsl_matrix) * b)
-{
-  const size_t M = a->size1;
-  const size_t N = a->size2;
-
-  if (b->size1 != M || b->size2 != N)
-    {
-      GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
-    }
-  else
-    {
-      const size_t tda_a = a->tda;
-      const size_t tda_b = b->tda;
-
-      size_t i, j;
-
-      for (i = 0; i < M; i++)
-        {
-          for (j = 0; j < N; j++)
-            {
-              const size_t aij = 2 * (i * tda_a + j);
-              const size_t bij = 2 * (i * tda_b + j);
-
-              a->data[aij] += b->data[bij];
-              a->data[aij + 1] += b->data[bij + 1];
-            }
-        }
-
-      return GSL_SUCCESS;
-    }
-}
-
-int
-FUNCTION (gsl_matrix, sub) (GSL_TYPE (gsl_matrix) * a,
-                            const GSL_TYPE (gsl_matrix) * b)
-{
-  const size_t M = a->size1;
-  const size_t N = a->size2;
-
-  if (b->size1 != M || b->size2 != N)
-    {
-      GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
-    }
-  else
-    {
-      const size_t tda_a = a->tda;
-      const size_t tda_b = b->tda;
-
-      size_t i, j;
-
-      for (i = 0; i < M; i++)
-        {
-          for (j = 0; j < N; j++)
-            {
-              const size_t aij = 2 * (i * tda_a + j);
-              const size_t bij = 2 * (i * tda_b + j);
-
-              a->data[aij] -= b->data[bij];
-              a->data[aij + 1] -= b->data[bij + 1];
-            }
-        }
-
-      return GSL_SUCCESS;
-    }
-}
-
-int
-FUNCTION (gsl_matrix, mul_elements) (GSL_TYPE (gsl_matrix) * a,
-                                     const GSL_TYPE (gsl_matrix) * b)
-{
-  const size_t M = a->size1;
-  const size_t N = a->size2;
-
-  if (b->size1 != M || b->size2 != N)
-    {
-      GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
-    }
-  else
-    {
-      const size_t tda_a = a->tda;
-      const size_t tda_b = b->tda;
-
-      size_t i, j;
-
-      for (i = 0; i < M; i++)
-        {
-          for (j = 0; j < N; j++)
-            {
-              const size_t aij = 2 * (i * tda_a + j);
-              const size_t bij = 2 * (i * tda_b + j);
-
-              ATOMIC ar = a->data[aij];
-              ATOMIC ai = a->data[aij + 1];
-
-              ATOMIC br = b->data[bij];
-              ATOMIC bi = b->data[bij + 1];
-
-              a->data[aij] = ar * br - ai * bi;
-              a->data[aij + 1] = ar * bi + ai * br;
-            }
-        }
-
-      return GSL_SUCCESS;
-    }
-}
-
-int
-FUNCTION (gsl_matrix, div_elements) (GSL_TYPE (gsl_matrix) * a,
-                                     const GSL_TYPE (gsl_matrix) * b)
-{
-  const size_t M = a->size1;
-  const size_t N = a->size2;
-
-  if (b->size1 != M || b->size2 != N)
-    {
-      GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
-    }
-  else
-    {
-      const size_t tda_a = a->tda;
-      const size_t tda_b = b->tda;
-
-      size_t i, j;
-
-      for (i = 0; i < M; i++)
-        {
-          for (j = 0; j < N; j++)
-            {
-              const size_t aij = 2 * (i * tda_a + j);
-              const size_t bij = 2 * (i * tda_b + j);
-
-              ATOMIC ar = a->data[aij];
-              ATOMIC ai = a->data[aij + 1];
-
-              ATOMIC br = b->data[bij];
-              ATOMIC bi = b->data[bij + 1];
-
-              ATOMIC s = 1.0 / hypot(br, bi);
-
-              ATOMIC sbr = s * br;
-              ATOMIC sbi = s * bi;
-              
-              a->data[aij] = (ar * sbr + ai * sbi) * s;
-              a->data[aij + 1] = (ai * sbr - ar * sbi) * s;
-            }
-        }
-
-      return GSL_SUCCESS;
-    }
-}
-
-int FUNCTION (gsl_matrix, scale) (GSL_TYPE (gsl_matrix) * a, const BASE x)
-{
-  const size_t M = a->size1;
-  const size_t N = a->size2;
-  const size_t tda = a->tda;
-
-  size_t i, j;
-
-  ATOMIC xr = GSL_REAL(x);
-  ATOMIC xi = GSL_IMAG(x);
-
-  for (i = 0; i < M; i++)
-    {
-      for (j = 0; j < N; j++)
-        {
-          const size_t aij = 2 * (i * tda + j);
-
-          ATOMIC ar = a->data[aij];
-          ATOMIC ai = a->data[aij + 1];
-          
-          a->data[aij] = ar * xr - ai * xi;
-          a->data[aij + 1] = ar * xi + ai * xr;
-        }
-    }
-
-  return GSL_SUCCESS;
-}
-
-int FUNCTION (gsl_matrix, add_constant) (GSL_TYPE (gsl_matrix) * a, const BASE x)
-{
-  const size_t M = a->size1;
-  const size_t N = a->size2;
-  const size_t tda = a->tda;
-
-  size_t i, j;
-
-  for (i = 0; i < M; i++)
-    {
-      for (j = 0; j < N; j++)
-        {
-          a->data[2 * (i * tda + j)] += GSL_REAL (x);
-          a->data[2 * (i * tda + j) + 1] += GSL_IMAG (x);
-        }
-    }
-
-  return GSL_SUCCESS;
-}
-
-
-int FUNCTION (gsl_matrix, add_diagonal) (GSL_TYPE (gsl_matrix) * a, const BASE x)
-{
-  const size_t M = a->size1;
-  const size_t N = a->size2;
-  const size_t tda = a->tda;
-  const size_t loop_lim = (M < N ? M : N);
-  size_t i;
-  for (i = 0; i < loop_lim; i++)
-    {
-      a->data[2 * (i * tda + i)] += GSL_REAL (x);
-      a->data[2 * (i * tda + i) + 1] += GSL_IMAG (x);
-    }
-
-  return GSL_SUCCESS;
-}
-
-
-#include "include/templates_off.h"
-#undef  BASE_GSL_COMPLEX
-#endif
diff --git a/ext/gsl/sf_mathieu.c b/ext/gsl/sf_mathieu.c
deleted file mode 100644
index 721c7ff..0000000
--- a/ext/gsl/sf_mathieu.c
+++ /dev/null
@@ -1,238 +0,0 @@
-#include "include/rb_gsl.h"
-#ifdef GSL_1_9_LATER
-
-static VALUE cWorkspace;
-
-static VALUE rb_gsl_sf_mathieu_alloc(VALUE klass, VALUE n, VALUE q)
-{
-	gsl_sf_mathieu_workspace *w;
-	w = gsl_sf_mathieu_alloc((size_t) FIX2INT(n), NUM2DBL(q));
-	return Data_Wrap_Struct(klass, 0, gsl_sf_mathieu_free, w);
-}
- 
-static VALUE sf_mathieu_eval(VALUE order, VALUE qq,
-	int (*f)(int, double, gsl_sf_result*))
-{
-	gsl_sf_result r;
-	(*f)(FIX2INT(order), NUM2DBL(qq), &r);
-	return rb_float_new(r.val);
-}
-
-static VALUE sf_mathieu_eval2(VALUE n1, VALUE n2, VALUE q, VALUE x,
-	int (*f)(int, int, double, double, gsl_sf_result*))
-{
-	gsl_sf_result r;
-	(*f)(FIX2INT(n1),FIX2INT(n2),  NUM2DBL(q), NUM2DBL(x), &r);
-	return rb_float_new(r.val);
-}
-
-static VALUE sf_mathieu_array_eval(int argc, VALUE *argv,
-	int (*f)(int, int, double, gsl_sf_mathieu_workspace*, double[]))
-{
-	gsl_sf_mathieu_workspace *w;
-	gsl_vector *v;
-	int n1, n2;
-	double q;
-	switch (argc) {
-	case 4:
-		if (!rb_obj_is_kind_of(argv[3], cWorkspace)) {
-			rb_raise(rb_eTypeError, "Wrong argument type 3 (%s detected, %s expected)",
-				rb_class2name(CLASS_OF(argv[3])), rb_class2name(cWorkspace));
-		}
-		n1 = FIX2INT(argv[0]);
-		n2 = FIX2INT(argv[1]);
-		q = NUM2DBL(argv[2]);
-		Data_Get_Struct(argv[3], gsl_sf_mathieu_workspace, w);
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 4)", argc);
-	}
-	v = gsl_vector_alloc(n2 - n1 + 1);
-	(*f)(n1, n2, q, w, v->data);
-	return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
-}
-
-static VALUE sf_mathieu_array_eval2(int argc, VALUE *argv,
-	int (*f)(int, int,  double, double, gsl_sf_mathieu_workspace*, double[]))
-{
-	gsl_sf_mathieu_workspace *w;
-	gsl_vector *v;
-	int n1, n2;
-	double q, x;
-	switch (argc) {
-	case 5:
-		if (!rb_obj_is_kind_of(argv[4], cWorkspace)) {
-			rb_raise(rb_eTypeError, "Wrong argument type 4 (%s detected, %s expected)",
-				rb_class2name(CLASS_OF(argv[4])), rb_class2name(cWorkspace));
-		}
-		n1 = FIX2INT(argv[0]);
-		n2 = FIX2INT(argv[1]);
-		q = NUM2DBL(argv[2]);
-		x = NUM2DBL(argv[3]);		
-		Data_Get_Struct(argv[4], gsl_sf_mathieu_workspace, w);
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 5)", argc);
-	}
-	v = gsl_vector_alloc(n2 - n1 + 1);
-	(*f)(n1, n2, q, x, w, v->data);
-	return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
-}
-static VALUE sf_mathieu_array_eval3(int argc, VALUE *argv,
-	int (*f)(int, int, int, double, double, gsl_sf_mathieu_workspace*, double[]))
-{
-	gsl_sf_mathieu_workspace *w;
-	gsl_vector *v;
-	int n1, n2, n3;
-	double q, x;
-	switch (argc) {
-	case 6:
-		if (!rb_obj_is_kind_of(argv[5], cWorkspace)) {
-			rb_raise(rb_eTypeError, "Wrong argument type 5 (%s detected, %s expected)",
-				rb_class2name(CLASS_OF(argv[5])), rb_class2name(cWorkspace));
-		}
-		n1 = FIX2INT(argv[0]);
-		n2 = FIX2INT(argv[1]);
-		n3 = FIX2INT(argv[2]);		
-		q = NUM2DBL(argv[3]);
-		x = NUM2DBL(argv[4]);		
-		Data_Get_Struct(argv[5], gsl_sf_mathieu_workspace, w);
-		break;
-	default:
-		rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 6)", argc);
-	}
-	v = gsl_vector_alloc(n3 - n2 + 1);
-	(*f)(n1, n2, n3, q, x, w, v->data);
-	return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
-}
-static VALUE sf_mathieu_eval_int_double2(VALUE order, VALUE qq, VALUE zz,
-	int (*f)(int, double, double, gsl_sf_result*))
-{
-	gsl_sf_result r;
-	(*f)(FIX2INT(order), NUM2DBL(qq), NUM2DBL(zz), &r);
-	return rb_float_new(r.val);
-}
-static VALUE sf_mathieu_eval_e_int_double2(VALUE order, VALUE qq, VALUE zz,
-	int (*f)(int, double, double, gsl_sf_result*))
-{
-	gsl_sf_result *r;
-	VALUE val;
-	val = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r);	
-	(*f)(FIX2INT(order), NUM2DBL(qq), NUM2DBL(zz), r);
-  return val;
-}
-
-static VALUE sf_mathieu_eval_e_int2_double2(VALUE n1, VALUE n2, VALUE qq, VALUE zz,
-	int (*f)(int, int, double, double, gsl_sf_result*))
-{
-	gsl_sf_result *r;
-	VALUE val;
-	val = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r);	
-	(*f)(FIX2INT(n1), FIX2INT(n2), NUM2DBL(qq), NUM2DBL(zz), r);
-  return val;
-}
-/**********/
-static VALUE rb_gsl_sf_mathieu_a_e(VALUE module, VALUE order, VALUE qq)
-{
-	return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_a, order, qq);
-}
-static VALUE rb_gsl_sf_mathieu_a(VALUE module, VALUE order, VALUE qq)
-{
-	return sf_mathieu_eval(order, qq, gsl_sf_mathieu_a);
-}
-static VALUE rb_gsl_sf_mathieu_a_array(VALUE module, int argc, VALUE *argv)
-{
-	return sf_mathieu_array_eval(argc, argv, gsl_sf_mathieu_a_array);
-}
-static VALUE rb_gsl_sf_mathieu_b_e(VALUE module, VALUE order, VALUE qq)
-{
-	return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_b, order, qq);
-}
-static VALUE rb_gsl_sf_mathieu_b(VALUE module, VALUE order, VALUE qq)
-{
-	return sf_mathieu_eval(order, qq, gsl_sf_mathieu_b);
-}
-static VALUE rb_gsl_sf_mathieu_b_array(VALUE module, int argc, VALUE *argv)
-{
-	return sf_mathieu_array_eval(argc, argv, gsl_sf_mathieu_b_array);
-}
-static VALUE rb_gsl_sf_mathieu_ce_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
-{
-	return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
-}
-static VALUE rb_gsl_sf_mathieu_ce(VALUE module, VALUE order, VALUE qq, VALUE zz)
-{
-	return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
-}
-static VALUE rb_gsl_sf_mathieu_ce_array(VALUE module, int argc, VALUE *argv)
-{
-	return sf_mathieu_array_eval2(argc, argv, gsl_sf_mathieu_ce_array);
-}	
-static VALUE rb_gsl_sf_mathieu_se_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
-{
-	return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_se);
-}
-static VALUE rb_gsl_sf_mathieu_se(VALUE module, VALUE order, VALUE qq, VALUE zz)
-{
-	return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_se);
-}
-static VALUE rb_gsl_sf_mathieu_se_array(VALUE module, int argc, VALUE *argv)
-{
-	return sf_mathieu_array_eval2(argc, argv, gsl_sf_mathieu_se_array);
-}	
-
-/*****/
-static VALUE rb_gsl_sf_mathieu_Mc_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
-{
-	return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Mc);
-}
-static VALUE rb_gsl_sf_mathieu_Mc(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
-{
-	return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Mc);
-}
-static VALUE rb_gsl_sf_mathieu_Mc_array(VALUE module, int argc, VALUE *argv)
-{
-	return sf_mathieu_array_eval3(argc, argv, gsl_sf_mathieu_Mc_array);
-}	
-static VALUE rb_gsl_sf_mathieu_Ms_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
-{
-	return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Ms);
-}
-static VALUE rb_gsl_sf_mathieu_Ms(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
-{
-	return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Ms);
-}
-static VALUE rb_gsl_sf_mathieu_Ms_array(VALUE module, int argc, VALUE *argv)
-{
-	return sf_mathieu_array_eval3(argc, argv, gsl_sf_mathieu_Ms_array);
-}	
-/*****/
-void Init_sf_mathieu(VALUE module)
-{
-	VALUE mMathieu;
-	
-	mMathieu = rb_define_module_under(module, "Mathieu");
-	cWorkspace = rb_define_class_under(mMathieu, "Workspace", cGSL_Object);
-	rb_define_singleton_method(cWorkspace, "alloc", rb_gsl_sf_mathieu_alloc, 2);
-	
-	rb_define_module_function(module, "mathieu_a", rb_gsl_sf_mathieu_a, 2);	
-	rb_define_module_function(module, "mathieu_a_e", rb_gsl_sf_mathieu_a_e, 2);
-	rb_define_module_function(module, "mathieu_a_array", rb_gsl_sf_mathieu_a_array, -1);	
-	rb_define_module_function(module, "mathieu_b", rb_gsl_sf_mathieu_b, 2);	
-	rb_define_module_function(module, "mathieu_b_e", rb_gsl_sf_mathieu_b_e, 2);	
-	rb_define_module_function(module, "mathieu_b_array", rb_gsl_sf_mathieu_b_array, -1);		
-	rb_define_module_function(module, "mathieu_ce", rb_gsl_sf_mathieu_ce, 3);			
-	rb_define_module_function(module, "mathieu_ce_e", rb_gsl_sf_mathieu_ce_e, 3);
-	rb_define_module_function(module, "mathieu_ce_array", rb_gsl_sf_mathieu_ce_array, -1);
-	rb_define_module_function(module, "mathieu_se", rb_gsl_sf_mathieu_se, 3);	
-	rb_define_module_function(module, "mathieu_se_e", rb_gsl_sf_mathieu_se_e, 3);
-	rb_define_module_function(module, "mathieu_se_array", rb_gsl_sf_mathieu_se_array, -1);
-	rb_define_module_function(module, "mathieu_Mc", rb_gsl_sf_mathieu_Mc, 4);	
-	rb_define_module_function(module, "mathieu_Mc_e", rb_gsl_sf_mathieu_Mc_e, 4);
-	rb_define_module_function(module, "mathieu_Mc_array", rb_gsl_sf_mathieu_Mc_array, -1);
-	rb_define_module_function(module, "mathieu_Ms", rb_gsl_sf_mathieu_Ms, 4);	
-	rb_define_module_function(module, "mathieu_Ms_e", rb_gsl_sf_mathieu_Ms_e, 4);
-	rb_define_module_function(module, "mathieu_Ms_array", rb_gsl_sf_mathieu_Ms_array, -1);	
-}
-
-#endif
diff --git a/ext/gsl/alf.c b/ext/gsl_native/alf.c
similarity index 93%
rename from ext/gsl/alf.c
rename to ext/gsl_native/alf.c
index aec11f0..366e5ad 100644
--- a/ext/gsl/alf.c
+++ b/ext/gsl_native/alf.c
@@ -19,7 +19,7 @@ static VALUE rb_alf_params(VALUE obj, VALUE csphase, VALUE cnorm, VALUE norm)
   int ret;
   Data_Get_Struct(obj, alf_workspace, w);
   ret = alf_params(FIX2INT(csphase), FIX2INT(cnorm), (alf_norm_t) FIX2INT(norm), w);
-  return INT2FIX(ret); 
+  return INT2FIX(ret);
 }
 
 static void define_constants(VALUE klass)
@@ -60,11 +60,11 @@ static VALUE rb_alf_Plm_array(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(argv[1], gsl_vector, res);
       lmax = w->lmax;
       if (res->size < alf_array_size(lmax)) {
-	rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
-		 (int) alf_array_size(lmax));
+        rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
+                 (int) alf_array_size(lmax));
       }
-      ret = argv[1];      
-    } else { 
+      ret = argv[1];
+    } else {
       lmax = FIX2INT(argv[0]);
       x = NUM2DBL(argv[1]);
       res = gsl_vector_alloc(alf_array_size(lmax));
@@ -85,8 +85,8 @@ static VALUE rb_alf_Plm_array(int argc, VALUE *argv, VALUE obj)
       CHECK_VECTOR(argv[2]);
       Data_Get_Struct(argv[2], gsl_vector, res);
       if (res->size < alf_array_size(lmax)) {
-	rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
-		 (int) alf_array_size(lmax));
+        rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
+                 (int) alf_array_size(lmax));
       }
       ret = argv[2];
     }
@@ -155,11 +155,11 @@ static VALUE rb_alf_Plm_deriv_array(int argc, VALUE *argv, VALUE obj)
     Data_Get_Struct(argv[3], gsl_vector, deriv);
     if (res->size < alf_array_size(lmax)) {
       rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
-	       (int) alf_array_size(lmax));
+               (int) alf_array_size(lmax));
     }
     if (deriv->size < alf_array_size(lmax)) {
       rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
-	       (int) alf_array_size(lmax));
+               (int) alf_array_size(lmax));
     }
     ret1 = argv[2];
     ret2 = argv[3];
diff --git a/ext/gsl/array.c b/ext/gsl_native/array.c
similarity index 77%
rename from ext/gsl/array.c
rename to ext/gsl_native/array.c
index d8c6db7..6ca059b 100644
--- a/ext/gsl/array.c
+++ b/ext/gsl_native/array.c
@@ -12,9 +12,7 @@
 #include "include/rb_gsl_common.h"
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_complex.h"
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
 /* global variables */
 VALUE cgsl_block, cgsl_block_int;
@@ -47,9 +45,6 @@ double* get_vector_ptr(VALUE ary, size_t *stride, size_t *n)
   gsl_vector *v = NULL;
   gsl_vector_complex *vc = NULL;
   gsl_matrix *m;
-#ifdef HAVE_NARRAY_H
-  VALUE ary2;
-#endif
   if (VECTOR_P(ary)) {
     Data_Get_Struct(ary, gsl_vector, v);
     *stride = v->stride;
@@ -67,6 +62,7 @@ double* get_vector_ptr(VALUE ary, size_t *stride, size_t *n)
     return m->data;
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(ary)) {
+    VALUE ary2;
     *n = NA_TOTAL(ary);
     *stride = 1;
     ary2 = na_change_type(ary, NA_DFLOAT);
@@ -74,7 +70,7 @@ double* get_vector_ptr(VALUE ary, size_t *stride, size_t *n)
 #endif
   } else {
     rb_raise(rb_eTypeError,
-	     "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
+             "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
   }
 }
 
@@ -91,7 +87,7 @@ gsl_vector* get_cvector(VALUE obj)
     rb_raise(rb_eTypeError,
              "wrong argument type %s", rb_class2name(CLASS_OF(obj)));
   }
-  return v; 
+  return v;
 }
 
 VALUE make_rarray_from_cvector(const gsl_vector *v)
@@ -142,7 +138,7 @@ gsl_vector* get_vector(VALUE ary)
     return v;
   } else {
     rb_raise(rb_eTypeError,
-	     "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
+             "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
   }
 }
 
@@ -157,7 +153,7 @@ gsl_vector* make_cvector_from_rarrays(VALUE ary)
 #endif
   } else {
     rb_raise(rb_eTypeError,
-	     "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
+             "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
   }
 }
 
@@ -184,7 +180,7 @@ void carray_set_from_rarrays(double *a, VALUE ary)
 #endif
   } else {
     rb_raise(rb_eTypeError,
-	     "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
+             "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
   }
 }
 
@@ -274,7 +270,7 @@ VALUE make_matrix_clone2(VALUE vm)
   mnew = gsl_matrix_alloc(m->size1, m->size2);
   if (mnew == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_alloc failed");
   gsl_matrix_memcpy(mnew, m);
-  return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);;
+  return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
 }
 
 gsl_matrix_complex* make_matrix_complex_clone(const gsl_matrix_complex *m)
@@ -316,8 +312,8 @@ gsl_matrix_complex* matrix_to_complex(const gsl_matrix *m)
   return cm;
 }
 
-void gsl_matrix_complex_mul(gsl_matrix_complex *mnew, const gsl_matrix_complex *m, 
-			    const gsl_matrix_complex *mb)
+void gsl_matrix_complex_mul(gsl_matrix_complex *mnew, const gsl_matrix_complex *m,
+                            const gsl_matrix_complex *mb)
 {
   gsl_complex a, b, c, sum;
   size_t i, j, k;
@@ -325,45 +321,45 @@ void gsl_matrix_complex_mul(gsl_matrix_complex *mnew, const gsl_matrix_complex *
     for (j = 0; j < m->size2; j++) {
       sum = gsl_complex_rect(0.0, 0.0);
       for (k = 0; k < m->size2; k++) {
-	a = gsl_matrix_complex_get(m, j, k);
-	b = gsl_matrix_complex_get(mb, k, i);
-	c = gsl_complex_mul(a, b);
-	sum = gsl_complex_add(sum, c);
+        a = gsl_matrix_complex_get(m, j, k);
+        b = gsl_matrix_complex_get(mb, k, i);
+        c = gsl_complex_mul(a, b);
+        sum = gsl_complex_add(sum, c);
       }
       gsl_matrix_complex_set(mnew, j, i, sum);
     }
   }
 }
 
-void gsl_matrix_mul_vector(gsl_vector *vnew, 
-			   const gsl_matrix *m, const gsl_vector *v)
+void gsl_matrix_mul_vector(gsl_vector *vnew,
+                           const gsl_matrix *m, const gsl_vector *v)
 {
   size_t i, j;
   double val;
   for (i = 0; i < m->size1; i++) {
     val = 0;
-    for (j = 0; j < m->size2; j++) 
+    for (j = 0; j < m->size2; j++)
       val += gsl_matrix_get(m, i, j)*gsl_vector_get(v, j);
     gsl_vector_set(vnew, i, val);
   }
 }
 
-void gsl_matrix_int_mul_vector(gsl_vector_int *vnew, 
-			       const gsl_matrix_int *m, const gsl_vector_int *v)
+void gsl_matrix_int_mul_vector(gsl_vector_int *vnew,
+                               const gsl_matrix_int *m, const gsl_vector_int *v)
 {
   size_t i, j;
   int val;
   for (i = 0; i < m->size1; i++) {
     val = 0;
-    for (j = 0; j < m->size2; j++) 
+    for (j = 0; j < m->size2; j++)
       val += gsl_matrix_int_get(m, i, j)*gsl_vector_int_get(v, j);
     gsl_vector_int_set(vnew, i, val);
   }
 }
 
-void gsl_matrix_complex_mul_vector(gsl_vector_complex *vnew, 
-				   const gsl_matrix_complex *m, 
-				   const gsl_vector_complex *v)
+void gsl_matrix_complex_mul_vector(gsl_vector_complex *vnew,
+                                   const gsl_matrix_complex *m,
+                                   const gsl_vector_complex *v)
 {
   gsl_complex a, b, c, sum;
   size_t i, j;
@@ -377,98 +373,17 @@ void gsl_matrix_complex_mul_vector(gsl_vector_complex *vnew,
     }
     gsl_vector_complex_set(vnew, i, sum);
   }
-  
-}
-
-/*****/
-#ifndef GSL_1_12_LATER
-int gsl_vector_complex_add(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
-{
-  size_t i;
-  gsl_complex a, b, c;
-  for (i = 0; i < cv->size; i++) {
-    a = gsl_vector_complex_get(cv, i);
-    b = gsl_vector_complex_get(cv2, i);
-    c = gsl_complex_add(a, b);
-    gsl_vector_complex_set(cv, i, c);
-  }
-  return 0;
 }
 
-int gsl_vector_complex_add_constant(gsl_vector_complex *cv, gsl_complex b)
-{
-  size_t i;
-  gsl_complex a, c;
-  for (i = 0; i < cv->size; i++) {
-    a = gsl_vector_complex_get(cv, i);
-    c = gsl_complex_add(a, b);
-    gsl_vector_complex_set(cv, i, c);
-  }
-  return 0;
-}
-
-int gsl_vector_complex_scale(gsl_vector_complex *cv, gsl_complex b)
-{
-  size_t i;
-  gsl_complex a, c;
-  for (i = 0; i < cv->size; i++) {
-    a = gsl_vector_complex_get(cv, i);
-    c = gsl_complex_mul(a, b);
-    gsl_vector_complex_set(cv, i, c);
-  }
-  return 0;
-}
-
-
-int gsl_vector_complex_sub(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
-{
-  size_t i;
-  gsl_complex a, b, c;
-  for (i = 0; i < cv->size; i++) {
-    a = gsl_vector_complex_get(cv, i);
-    b = gsl_vector_complex_get(cv2, i);
-    c = gsl_complex_sub(a, b);
-    gsl_vector_complex_set(cv, i, c);
-  }
-  return 0;
-}
-
-int gsl_vector_complex_mul(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
-{
-  size_t i;
-  gsl_complex a, b, c;
-  for (i = 0; i < cv->size; i++) {
-    a = gsl_vector_complex_get(cv, i);
-    b = gsl_vector_complex_get(cv2, i);
-    c = gsl_complex_mul(a, b);
-    gsl_vector_complex_set(cv, i, c);
-  }
-  return 0;
-}
-
-int gsl_vector_complex_div(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
-{
-  size_t i;
-  gsl_complex a, b, c;
-  for (i = 0; i < cv->size; i++) {
-    a = gsl_vector_complex_get(cv, i);
-    b = gsl_vector_complex_get(cv2, i);
-    c = gsl_complex_div(a, b);
-    gsl_vector_complex_set(cv, i, c);
-  }
-  return 0;
-}
-#endif
-
 VALUE rb_gsl_range2ary(VALUE obj)
 {
   //  double beg, en;
   //  size_t n;
   //  int step;
   VALUE ary;
-  if (CLASS_OF(obj) != rb_cRange) 
+  if (CLASS_OF(obj) != rb_cRange)
     rb_raise(rb_eTypeError, "wrong argument type %s (Range expected)",
-	     rb_class2name(CLASS_OF(obj)));
+             rb_class2name(CLASS_OF(obj)));
   ary = rb_funcall(obj, rb_gsl_id_to_a, 0);
   return ary;
 }
@@ -480,9 +395,9 @@ VALUE rb_gsl_range2vector(VALUE obj)
   size_t n;
   int i, step;
   gsl_vector *v;
-  if (CLASS_OF(obj) != rb_cRange) 
+  if (CLASS_OF(obj) != rb_cRange)
     rb_raise(rb_eTypeError, "wrong argument type %s (Range expected)",
-	     rb_class2name(CLASS_OF(obj)));
+             rb_class2name(CLASS_OF(obj)));
   get_range_beg_en_n(obj, &beg, &en, &n, &step);
   v = gsl_vector_alloc(n);
   for (i = 0; i < (int) n; i++) gsl_vector_set(v, i, (double) (beg+i));
@@ -495,9 +410,9 @@ VALUE rb_gsl_range2vector_int(VALUE obj)
   int beg, en, i, step;
   size_t n;
   gsl_vector_int *v;
-  if (CLASS_OF(obj) != rb_cRange) 
+  if (CLASS_OF(obj) != rb_cRange)
     rb_raise(rb_eTypeError, "wrong argument type %s (Range expected)",
-	     rb_class2name(CLASS_OF(obj)));
+             rb_class2name(CLASS_OF(obj)));
   get_range_int_beg_en_n(obj, &beg, &en, &n, &step);
   v = gsl_vector_int_alloc(n);
   for (i = 0; i < (int) n; i++) gsl_vector_int_set(v, i, beg+i);
@@ -547,71 +462,71 @@ void rb_gsl_matrix_int_view_free(gsl_matrix_int_view * mv)
 
 void Init_gsl_array(VALUE module)
 {
-  cgsl_block = rb_define_class_under(module, "Block", 
-					 cGSL_Object);
-  cgsl_block_int = rb_define_class_under(cgsl_block, "Int", 
-					 cGSL_Object);
-  cgsl_block_uchar = rb_define_class_under(cgsl_block, "Byte", 
-					   cGSL_Object);
+  cgsl_block = rb_define_class_under(module, "Block",
+                                     cGSL_Object);
+  cgsl_block_int = rb_define_class_under(cgsl_block, "Int",
+                                         cGSL_Object);
+  cgsl_block_uchar = rb_define_class_under(cgsl_block, "Byte",
+                                           cGSL_Object);
 
   cgsl_block_complex = rb_define_class_under(cgsl_block, "Complex", cgsl_block);
-  cgsl_vector = rb_define_class_under(module, "Vector", 
-				      cGSL_Object);
-  cgsl_vector_col = rb_define_class_under(cgsl_vector, "Col", 
-					 cgsl_vector);
-  cgsl_vector_complex = rb_define_class_under(cgsl_vector, "Complex", 
-					      cGSL_Object);
+  cgsl_vector = rb_define_class_under(module, "Vector",
+                                      cGSL_Object);
+  cgsl_vector_col = rb_define_class_under(cgsl_vector, "Col",
+                                          cgsl_vector);
+  cgsl_vector_complex = rb_define_class_under(cgsl_vector, "Complex",
+                                              cGSL_Object);
   cgsl_vector_complex_col = rb_define_class_under(cgsl_vector_complex, "Col",
-					      cgsl_vector_complex);
+                                                  cgsl_vector_complex);
   cgsl_matrix = rb_define_class_under(module, "Matrix", cGSL_Object);
   cgsl_matrix_complex = rb_define_class_under(cgsl_matrix, "Complex", cGSL_Object);
 
   cgsl_vector_view = rb_define_class_under(cgsl_vector, "View", cgsl_vector);
   cgsl_vector_col_view = rb_define_class_under(cgsl_vector_col, "View", cgsl_vector_col);
 
-  cgsl_vector_complex_view = rb_define_class_under(cgsl_vector_complex, "View", 
-						   cgsl_vector_complex);
-  cgsl_vector_complex_col_view = rb_define_class_under(cgsl_vector_complex_col, "View", 
-						   cgsl_vector_complex_col);
+  cgsl_vector_complex_view = rb_define_class_under(cgsl_vector_complex, "View",
+                                                   cgsl_vector_complex);
+  cgsl_vector_complex_col_view = rb_define_class_under(cgsl_vector_complex_col, "View",
+                                                       cgsl_vector_complex_col);
 
   cgsl_vector_int = rb_define_class_under(cgsl_vector, "Int", cGSL_Object);
-  cgsl_vector_int_col = rb_define_class_under(cgsl_vector_int, "Col", cgsl_vector_int);  
+  cgsl_vector_int_col = rb_define_class_under(cgsl_vector_int, "Col", cgsl_vector_int);
   cgsl_vector_int_view = rb_define_class_under(cgsl_vector_int, "View", cgsl_vector_int);
   cgsl_vector_int_col_view = rb_define_class_under(cgsl_vector_int_col, "View", cgsl_vector_int_col);
 
 
   /*****/
 
-  cgsl_matrix_view = rb_define_class_under(cgsl_matrix, "View", 
-					   cgsl_matrix);
-  cgsl_matrix_complex_view = rb_define_class_under(cgsl_matrix_complex, "View", 
-						   cgsl_matrix_complex);
-  cgsl_permutation = rb_define_class_under(module, "Permutation", cGSL_Object);  
+  cgsl_matrix_view = rb_define_class_under(cgsl_matrix, "View",
+                                           cgsl_matrix);
+  cgsl_matrix_complex_view = rb_define_class_under(cgsl_matrix_complex, "View",
+                                                   cgsl_matrix_complex);
+  cgsl_permutation = rb_define_class_under(module, "Permutation", cGSL_Object);
   cgsl_index = rb_define_class_under(module, "Index", cgsl_permutation);
 
   cgsl_vector_view_ro = rb_define_class_under(cgsl_vector_view, "ReadOnly",
-					      cgsl_vector_view);
+                                              cgsl_vector_view);
   cgsl_vector_col_view_ro = rb_define_class_under(cgsl_vector_col_view, "ReadOnly",
-					      cgsl_vector_col_view);
+                                                  cgsl_vector_col_view);
   cgsl_vector_int_view_ro = rb_define_class_under(cgsl_vector_int_view, "ReadOnly",
-					      cgsl_vector_int_view);
+                                                  cgsl_vector_int_view);
   cgsl_vector_int_col_view_ro = rb_define_class_under(cgsl_vector_int_col_view, "ReadOnly",
-					      cgsl_vector_int_col_view);
+                                                      cgsl_vector_int_col_view);
   cgsl_matrix_view_ro = rb_define_class_under(cgsl_matrix_view, "ReadOnly",
-					      cgsl_matrix_view);
+                                              cgsl_matrix_view);
 
-  cgsl_vector_complex_view_ro = rb_define_class_under(cgsl_vector_complex_view, 
-						      "ReadOnly",
-						      cgsl_vector_complex_view);
-  cgsl_matrix_complex_view_ro = rb_define_class_under(cgsl_matrix_complex_view, 
-						      "ReadOnly",
-						      cgsl_matrix_complex_view);
+  cgsl_vector_complex_view_ro = rb_define_class_under(cgsl_vector_complex_view,
+                                                      "ReadOnly",
+                                                      cgsl_vector_complex_view);
+  cgsl_matrix_complex_view_ro = rb_define_class_under(cgsl_matrix_complex_view,
+                                                      "ReadOnly",
+                                                      cgsl_matrix_complex_view);
 
   /*****/
   cgsl_matrix_int = rb_define_class_under(cgsl_matrix, "Int", cGSL_Object);
   cgsl_matrix_int_view = rb_define_class_under(cgsl_matrix_int, "View", cgsl_matrix_int);
   cgsl_matrix_int_view_ro = rb_define_class_under(cgsl_matrix_int_view, "ReadOnly",
-					      cgsl_matrix_int_view);
+                                                  cgsl_matrix_int_view);
   /*****/
   Init_gsl_block_init(module);
   Init_gsl_block_int_init(module);
@@ -624,16 +539,14 @@ void Init_gsl_array(VALUE module)
   Init_gsl_matrix_int(module);
   Init_gsl_matrix_complex(module);
   Init_gsl_permutation(module);
-#ifdef GSL_1_1_LATER
   Init_gsl_combination(module);
-#endif
   Init_gsl_array_complex(module);
   Init_gsl_matrix_nmf();
 
   rb_define_method(cgsl_vector_view_ro, "set", rb_gsl_obj_read_only, -1);
   rb_define_method(cgsl_matrix_view_ro, "set", rb_gsl_obj_read_only, -1);
   rb_define_method(cgsl_vector_int_view_ro, "set", rb_gsl_obj_read_only, -1);
-  rb_define_method(cgsl_matrix_int_view_ro, "set", rb_gsl_obj_read_only, -1);  
+  rb_define_method(cgsl_matrix_int_view_ro, "set", rb_gsl_obj_read_only, -1);
   rb_define_method(cgsl_vector_complex_view_ro, "set", rb_gsl_obj_read_only, -1);
   rb_define_method(cgsl_matrix_complex_view_ro, "set", rb_gsl_obj_read_only, -1);
 
diff --git a/ext/gsl/array_complex.c b/ext/gsl_native/array_complex.c
similarity index 71%
rename from ext/gsl/array_complex.c
rename to ext/gsl_native/array_complex.c
index 0d579a4..fe27463 100644
--- a/ext/gsl/array_complex.c
+++ b/ext/gsl_native/array_complex.c
@@ -74,7 +74,7 @@ static VALUE rb_gsl_complex_arithmetics5(int flag, VALUE obj, VALUE bb)
     case GSL_COMPLEX_DIV:
       c = ALLOC(gsl_complex);
       *c = tmp;
-      return Data_Wrap_Struct(cgsl_complex, 0, free, c); 
+      return Data_Wrap_Struct(cgsl_complex, 0, free, c);
       break;
     }
     break;
@@ -87,83 +87,81 @@ static VALUE rb_gsl_complex_arithmetics5(int flag, VALUE obj, VALUE bb)
       case GSL_COMPLEX_SUB:
       case GSL_COMPLEX_MUL:
       case GSL_COMPLEX_DIV:
-	c = ALLOC(gsl_complex);
-	*c = tmp;
-	return Data_Wrap_Struct(cgsl_complex, 0, free, c); 
-	break;
+        c = ALLOC(gsl_complex);
+        *c = tmp;
+        return Data_Wrap_Struct(cgsl_complex, 0, free, c);
+        break;
       }
     } else {
       if (VECTOR_P(bb)) {
-	Data_Get_Struct(bb, gsl_vector, v);
-	cv = vector_to_complex(v);
-	cvnew = gsl_vector_complex_alloc(v->size);
-	if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
-	gsl_vector_complex_set_all(cvnew, *a);
-	switch (flag) {
-	case GSL_COMPLEX_ADD:
-	  gsl_vector_complex_add(cvnew, cv);
-	  break;
-	case GSL_COMPLEX_SUB:
-	  gsl_vector_complex_sub(cvnew, cv);
-	  break;
-	case GSL_COMPLEX_MUL:
-	  gsl_vector_complex_mul(cvnew, cv);
-	  break;
-	case GSL_COMPLEX_DIV:
-	  gsl_vector_complex_add(cvnew, cv);
-	  break;
-	}
-	gsl_vector_complex_free(cv);
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
+        Data_Get_Struct(bb, gsl_vector, v);
+        cv = vector_to_complex(v);
+        cvnew = gsl_vector_complex_alloc(v->size);
+        if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
+        gsl_vector_complex_set_all(cvnew, *a);
+        switch (flag) {
+        case GSL_COMPLEX_ADD:
+          gsl_vector_complex_add(cvnew, cv);
+          break;
+        case GSL_COMPLEX_SUB:
+          gsl_vector_complex_sub(cvnew, cv);
+          break;
+        case GSL_COMPLEX_MUL:
+          gsl_vector_complex_mul(cvnew, cv);
+          break;
+        case GSL_COMPLEX_DIV:
+          gsl_vector_complex_add(cvnew, cv);
+          break;
+        }
+        gsl_vector_complex_free(cv);
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
       }
       if (VECTOR_COMPLEX_P(bb)) {
-	Data_Get_Struct(bb, gsl_vector_complex, cv);
-	cvnew = gsl_vector_complex_alloc(v->size);
-	if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
-	gsl_vector_complex_set_all(cvnew, *a);
-	switch (flag) {
-	case GSL_COMPLEX_ADD:
-	  gsl_vector_complex_add(cvnew, cv);
-	  break;
-	case GSL_COMPLEX_SUB:
-	  gsl_vector_complex_sub(cvnew, cv);
-	  break;
-	case GSL_COMPLEX_MUL:
-	  gsl_vector_complex_mul(cvnew, cv);
-	  break;
-	case GSL_COMPLEX_DIV:
-	  gsl_vector_complex_add(cvnew, cv);
-	  break;
-	}
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
+        Data_Get_Struct(bb, gsl_vector_complex, cv);
+        cvnew = gsl_vector_complex_alloc(v->size);
+        if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
+        gsl_vector_complex_set_all(cvnew, *a);
+        switch (flag) {
+        case GSL_COMPLEX_ADD:
+          gsl_vector_complex_add(cvnew, cv);
+          break;
+        case GSL_COMPLEX_SUB:
+          gsl_vector_complex_sub(cvnew, cv);
+          break;
+        case GSL_COMPLEX_MUL:
+          gsl_vector_complex_mul(cvnew, cv);
+          break;
+        case GSL_COMPLEX_DIV:
+          gsl_vector_complex_add(cvnew, cv);
+          break;
+        }
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
       }
-
-
       if (MATRIX_P(bb)) {
-	Data_Get_Struct(bb, gsl_matrix, m);
-	cm = matrix_to_complex(m);
-	flagcm = 1;
-      }	else if (MATRIX_COMPLEX_P(bb)) {
-	Data_Get_Struct(bb, gsl_matrix_complex, cm);
+        Data_Get_Struct(bb, gsl_matrix, m);
+        cm = matrix_to_complex(m);
+        flagcm = 1;
+      } else if (MATRIX_COMPLEX_P(bb)) {
+        Data_Get_Struct(bb, gsl_matrix_complex, cm);
       } else {
-	rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
+        rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
       }
       cmself = gsl_matrix_complex_alloc(m->size1, m->size2);
       if (cmself == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_complex_alloc failed");
       gsl_matrix_complex_set_all(cmself, *a);
       switch (flag) {
       case GSL_COMPLEX_ADD:
-	gsl_matrix_complex_add(cmself, cm);
-	break;
+        gsl_matrix_complex_add(cmself, cm);
+        break;
       case GSL_COMPLEX_SUB:
-	gsl_matrix_complex_sub(cmself, cm);
-	break;
+        gsl_matrix_complex_sub(cmself, cm);
+        break;
       case GSL_COMPLEX_MUL:
-	gsl_matrix_complex_mul_elements(cmself, cm);
-	break;
+        gsl_matrix_complex_mul_elements(cmself, cm);
+        break;
       case GSL_COMPLEX_DIV:
-	gsl_matrix_complex_div_elements(cmself, cm);
-	break;
+        gsl_matrix_complex_div_elements(cmself, cm);
+        break;
       }
       if (flagcm == 1) gsl_matrix_complex_free(cm);
       return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmself);
@@ -206,7 +204,7 @@ static VALUE rb_gsl_complex_coerce(VALUE obj, VALUE other)
     c = ALLOC(gsl_complex);
     *c = gsl_complex_rect(x, 0.0);
     return rb_ary_new3(2, Data_Wrap_Struct(cgsl_complex, 0, free, c),
-		       obj);
+                       obj);
     break;
   default:
     if (MATRIX_P(other)) {
@@ -219,7 +217,7 @@ static VALUE rb_gsl_complex_coerce(VALUE obj, VALUE other)
       gsl_matrix_complex_set_all(cmself, *c);
       vcmself = Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmself);
       return rb_ary_new3(2, vcmself, vcmnew);
-    } 
+    }
     if (MATRIX_COMPLEX_P(other)) {
       Data_Get_Struct(other, gsl_matrix_complex, cmnew);
       cmself = gsl_matrix_complex_alloc(cmnew->size1, cmnew->size2);
diff --git a/ext/gsl/blas.c b/ext/gsl_native/blas.c
similarity index 100%
rename from ext/gsl/blas.c
rename to ext/gsl_native/blas.c
diff --git a/ext/gsl/blas1.c b/ext/gsl_native/blas1.c
similarity index 94%
rename from ext/gsl/blas1.c
rename to ext/gsl_native/blas1.c
index 6beefda..c027443 100644
--- a/ext/gsl/blas1.c
+++ b/ext/gsl_native/blas1.c
@@ -16,10 +16,10 @@
 
 static int get_vector1(int argc, VALUE *argv, VALUE obj, gsl_vector **x);
 static int get_vector_complex1(int argc, VALUE *argv, VALUE obj, gsl_vector_complex **x);
-static int get_vector2(int argc, VALUE *argv, VALUE obj, 
-		       gsl_vector **x, gsl_vector **y);
-static int get_vector_complex2(int argc, VALUE *argv, VALUE obj, 
-		       gsl_vector_complex **x, gsl_vector_complex **y);
+static int get_vector2(int argc, VALUE *argv, VALUE obj,
+                       gsl_vector **x, gsl_vector **y);
+static int get_vector_complex2(int argc, VALUE *argv, VALUE obj,
+                               gsl_vector_complex **x, gsl_vector_complex **y);
 
 static int get_vector1(int argc, VALUE *argv, VALUE obj, gsl_vector **x)
 {
@@ -29,7 +29,7 @@ static int get_vector1(int argc, VALUE *argv, VALUE obj, gsl_vector **x)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Data_Get_Vector(argv[0], (*x));
     break;
   default:
@@ -48,7 +48,7 @@ static int get_vector_complex1(int argc, VALUE *argv, VALUE obj, gsl_vector_comp
   case T_CLASS:
   case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_vector_complex, (*x));
     break;
@@ -60,8 +60,8 @@ static int get_vector_complex1(int argc, VALUE *argv, VALUE obj, gsl_vector_comp
   return flag;
 }
 
-static int get_vector2(int argc, VALUE *argv, VALUE obj, 
-		       gsl_vector **x, gsl_vector **y)
+static int get_vector2(int argc, VALUE *argv, VALUE obj,
+                       gsl_vector **x, gsl_vector **y)
 {
   int flag = 0;
   switch (TYPE(obj)) {
@@ -69,13 +69,13 @@ static int get_vector2(int argc, VALUE *argv, VALUE obj,
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Data_Get_Vector(argv[0], (*x));
     Data_Get_Vector(argv[1], (*y));
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Data_Get_Vector(obj, (*x));
     Data_Get_Vector(argv[0], (*y));
     flag = 1;
@@ -85,8 +85,8 @@ static int get_vector2(int argc, VALUE *argv, VALUE obj,
 }
 
 
-static int get_vector_complex2(int argc, VALUE *argv, VALUE obj, 
-		       gsl_vector_complex **x, gsl_vector_complex **y)
+static int get_vector_complex2(int argc, VALUE *argv, VALUE obj,
+                               gsl_vector_complex **x, gsl_vector_complex **y)
 {
   int flag = 0;
   switch (TYPE(obj)) {
@@ -94,7 +94,7 @@ static int get_vector_complex2(int argc, VALUE *argv, VALUE obj,
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[0]);
     CHECK_VECTOR_COMPLEX(argv[1]);
     Data_Get_Struct(argv[0], gsl_vector_complex, (*x));
@@ -102,7 +102,7 @@ static int get_vector_complex2(int argc, VALUE *argv, VALUE obj,
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[0]);
     Data_Get_Struct(obj, gsl_vector_complex, (*x));
     Data_Get_Struct(argv[0], gsl_vector_complex, (*y));
@@ -242,7 +242,7 @@ static VALUE rb_gsl_blas_daxpy(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_vector, x);
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     //    a = RFLOAT(argv[0])->value;
     a = NUM2DBL(argv[0]);
@@ -269,7 +269,7 @@ static VALUE rb_gsl_blas_daxpy2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_vector, x);
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     CHECK_VECTOR(argv[1]);
     //    a = RFLOAT(argv[0])->value;
@@ -298,7 +298,7 @@ static VALUE rb_gsl_blas_zaxpy(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_vector_complex, x);
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_COMPLEX(argv[0]);
     CHECK_VECTOR_COMPLEX(argv[1]);
     Data_Get_Struct(argv[0], gsl_complex, a);
@@ -325,7 +325,7 @@ static VALUE rb_gsl_blas_zaxpy2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_vector_complex, x);
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_COMPLEX(argv[0]);
     CHECK_VECTOR_COMPLEX(argv[1]);
     Data_Get_Struct(argv[0], gsl_complex, a);
@@ -347,7 +347,7 @@ static VALUE rb_gsl_blas_dscal(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     CHECK_VECTOR(argv[1]);
     //    a = RFLOAT(argv[0])->value;
@@ -358,7 +358,7 @@ static VALUE rb_gsl_blas_dscal(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     //    a = RFLOAT(argv[0])->value;
     a = NUM2DBL(argv[0]);
@@ -379,7 +379,7 @@ static VALUE rb_gsl_blas_dscal2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     CHECK_VECTOR(argv[1]);
     a = NUM2DBL(argv[0]);
@@ -388,7 +388,7 @@ static VALUE rb_gsl_blas_dscal2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_vector, x);
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     a = NUM2DBL(argv[0]);
     break;
@@ -408,7 +408,7 @@ static VALUE rb_gsl_blas_zdscal(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     CHECK_VECTOR_COMPLEX(argv[1]);
     //    a = RFLOAT(argv[0])->value;
@@ -420,7 +420,7 @@ static VALUE rb_gsl_blas_zdscal(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_vector_complex, x);
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     a = NUM2DBL(argv[0]);
     gsl_blas_zdscal(a, x);
@@ -438,7 +438,7 @@ static VALUE rb_gsl_blas_zdscal2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     CHECK_VECTOR_COMPLEX(argv[1]);
     a = NUM2DBL(argv[0]);
@@ -447,7 +447,7 @@ static VALUE rb_gsl_blas_zdscal2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_vector_complex, x);
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Need_Float(argv[0]);
     a = NUM2DBL(argv[0]);
     break;
@@ -468,7 +468,7 @@ static VALUE rb_gsl_blas_zscal(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[1]);
     Data_Get_Struct(argv[0], gsl_complex, a);
     Data_Get_Struct(argv[1], gsl_vector_complex, x);
@@ -477,7 +477,7 @@ static VALUE rb_gsl_blas_zscal(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Data_Get_Struct(obj, gsl_vector_complex, x);
     Data_Get_Struct(argv[0], gsl_complex, a);
     gsl_blas_zscal(*a, x);
@@ -496,14 +496,14 @@ static VALUE rb_gsl_blas_zscal2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[1]);
     Data_Get_Struct(argv[0], gsl_complex, a);
     Data_Get_Struct(argv[1], gsl_vector_complex, x);
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Data_Get_Struct(obj, gsl_vector_complex, x);
     Data_Get_Struct(argv[0], gsl_complex, a);
     break;
@@ -548,7 +548,7 @@ static VALUE rb_gsl_blas_drot2(VALUE obj, VALUE xx, VALUE yy, VALUE cc, VALUE ss
   gsl_vector_memcpy(ynew, y);
   gsl_blas_drot(xnew, ynew, c, s);
   return rb_ary_new3(2, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew),
-		     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, ynew));
+                     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, ynew));
 }
 
 static VALUE rb_gsl_blas_drotm(VALUE obj, VALUE xx, VALUE yy, VALUE PP)
@@ -601,7 +601,7 @@ static VALUE rb_gsl_blas_drotm2(VALUE obj, VALUE xx, VALUE yy, VALUE PP)
   gsl_blas_drotm(xnew, ynew, p->data);
   if (flag == 1) gsl_vector_free(p);
   return rb_ary_new3(2, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew),
-		     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, ynew));
+                     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, ynew));
 }
 
 void Init_gsl_blas1(VALUE module)
diff --git a/ext/gsl/blas2.c b/ext/gsl_native/blas2.c
similarity index 94%
rename from ext/gsl/blas2.c
rename to ext/gsl_native/blas2.c
index f43a574..7063e1f 100644
--- a/ext/gsl/blas2.c
+++ b/ext/gsl_native/blas2.c
@@ -57,7 +57,7 @@ static VALUE rb_gsl_blas_dgemv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_MATRIX(argv[2]);
@@ -71,7 +71,7 @@ static VALUE rb_gsl_blas_dgemv(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_VECTOR(argv[2]);
@@ -100,7 +100,6 @@ static VALUE rb_gsl_blas_dgemv(int argc, VALUE *argv, VALUE obj)
   gsl_blas_dgemv(type, a, A, x, b, y);
   if (flag == 1) return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, y);
   else return argv[argc-1];
-  
 }
 
 static VALUE rb_gsl_blas_dgemv2(int argc, VALUE *argv, VALUE obj)
@@ -114,7 +113,7 @@ static VALUE rb_gsl_blas_dgemv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_MATRIX(argv[2]);
@@ -128,7 +127,7 @@ static VALUE rb_gsl_blas_dgemv2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_VECTOR(argv[2]);
@@ -172,7 +171,7 @@ static VALUE rb_gsl_blas_zgemv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_MATRIX_COMPLEX(argv[2]);
@@ -186,7 +185,7 @@ static VALUE rb_gsl_blas_zgemv(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_VECTOR_COMPLEX(argv[2]);
@@ -216,7 +215,6 @@ static VALUE rb_gsl_blas_zgemv(int argc, VALUE *argv, VALUE obj)
   gsl_blas_zgemv(type, *a, A, x, *b, y);
   if (flag == 1) return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, y);
   else return argv[argc-1];
-  
 }
 
 
@@ -231,7 +229,7 @@ static VALUE rb_gsl_blas_zgemv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_MATRIX_COMPLEX(argv[2]);
@@ -245,7 +243,7 @@ static VALUE rb_gsl_blas_zgemv2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_VECTOR_COMPLEX(argv[2]);
@@ -288,7 +286,7 @@ static VALUE rb_gsl_blas_dtrmv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[3]);
     CHECK_VECTOR(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix, A);
@@ -296,7 +294,7 @@ static VALUE rb_gsl_blas_dtrmv(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR(argv[3]);
     Data_Get_Struct(obj, gsl_matrix, A);
     Data_Get_Struct(argv[3], gsl_vector, x);
@@ -304,7 +302,7 @@ static VALUE rb_gsl_blas_dtrmv(int argc, VALUE *argv, VALUE obj)
   }
   CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
   gsl_blas_dtrmv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, x);
+                 A, x);
   return argv[argc-1];
 }
 
@@ -318,7 +316,7 @@ static VALUE rb_gsl_blas_dtrmv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[3]);
     CHECK_VECTOR(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix, A);
@@ -326,7 +324,7 @@ static VALUE rb_gsl_blas_dtrmv2(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR(argv[3]);
     Data_Get_Struct(obj, gsl_matrix, A);
     Data_Get_Struct(argv[3], gsl_vector, x);
@@ -336,7 +334,7 @@ static VALUE rb_gsl_blas_dtrmv2(int argc, VALUE *argv, VALUE obj)
   xnew = gsl_vector_alloc(x->size);
   gsl_vector_memcpy(xnew, x);
   gsl_blas_dtrmv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, xnew);
+                 A, xnew);
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew);
 }
 
@@ -350,7 +348,7 @@ static VALUE rb_gsl_blas_ztrmv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[3]);
     CHECK_VECTOR_COMPLEX(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix_complex, A);
@@ -358,7 +356,7 @@ static VALUE rb_gsl_blas_ztrmv(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[3]);
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     Data_Get_Struct(argv[3], gsl_vector_complex, x);
@@ -366,7 +364,7 @@ static VALUE rb_gsl_blas_ztrmv(int argc, VALUE *argv, VALUE obj)
   }
   CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
   gsl_blas_ztrmv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, x);
+                 A, x);
   return argv[argc-1];
 }
 
@@ -379,7 +377,7 @@ static VALUE rb_gsl_blas_ztrmv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[3]);
     CHECK_VECTOR_COMPLEX(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix_complex, A);
@@ -387,7 +385,7 @@ static VALUE rb_gsl_blas_ztrmv2(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[3]);
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     Data_Get_Struct(argv[3], gsl_vector_complex, x);
@@ -397,7 +395,7 @@ static VALUE rb_gsl_blas_ztrmv2(int argc, VALUE *argv, VALUE obj)
   xnew = gsl_vector_complex_alloc(x->size);
   gsl_vector_complex_memcpy(xnew, x);
   gsl_blas_ztrmv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, xnew);
+                 A, xnew);
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, xnew);
 }
 
@@ -410,7 +408,7 @@ static VALUE rb_gsl_blas_dtrsv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[3]);
     CHECK_VECTOR(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix, A);
@@ -418,7 +416,7 @@ static VALUE rb_gsl_blas_dtrsv(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR(argv[3]);
     Data_Get_Struct(obj, gsl_matrix, A);
     Data_Get_Struct(argv[3], gsl_vector, x);
@@ -426,7 +424,7 @@ static VALUE rb_gsl_blas_dtrsv(int argc, VALUE *argv, VALUE obj)
   }
   CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
   gsl_blas_dtrsv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, x);
+                 A, x);
   return argv[argc-1];
 }
 
@@ -439,7 +437,7 @@ static VALUE rb_gsl_blas_dtrsv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[3]);
     CHECK_VECTOR(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix, A);
@@ -447,7 +445,7 @@ static VALUE rb_gsl_blas_dtrsv2(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR(argv[3]);
     Data_Get_Struct(obj, gsl_matrix, A);
     Data_Get_Struct(argv[3], gsl_vector, x);
@@ -457,7 +455,7 @@ static VALUE rb_gsl_blas_dtrsv2(int argc, VALUE *argv, VALUE obj)
   xnew = gsl_vector_alloc(x->size);
   gsl_vector_memcpy(xnew, x);
   gsl_blas_dtrsv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, xnew);
+                 A, xnew);
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew);
 }
 
@@ -470,7 +468,7 @@ static VALUE rb_gsl_blas_ztrsv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[3]);
     CHECK_VECTOR_COMPLEX(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix_complex, A);
@@ -478,7 +476,7 @@ static VALUE rb_gsl_blas_ztrsv(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[3]);
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     Data_Get_Struct(argv[3], gsl_vector_complex, x);
@@ -486,7 +484,7 @@ static VALUE rb_gsl_blas_ztrsv(int argc, VALUE *argv, VALUE obj)
   }
   CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
   gsl_blas_ztrsv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, x);
+                 A, x);
   return argv[argc-1];
 }
 
@@ -499,7 +497,7 @@ static VALUE rb_gsl_blas_ztrsv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 5) rb_raise(rb_eArgError, "wrong number of arguments (%d for 5)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[3]);
     CHECK_VECTOR_COMPLEX(argv[4]);
     Data_Get_Struct(argv[3], gsl_matrix_complex, A);
@@ -507,7 +505,7 @@ static VALUE rb_gsl_blas_ztrsv2(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)",
-			    argc);
+                            argc);
     CHECK_VECTOR_COMPLEX(argv[3]);
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     Data_Get_Struct(argv[3], gsl_vector_complex, x);
@@ -517,7 +515,7 @@ static VALUE rb_gsl_blas_ztrsv2(int argc, VALUE *argv, VALUE obj)
   xnew = gsl_vector_complex_alloc(x->size);
   gsl_vector_complex_memcpy(xnew, x);
   gsl_blas_ztrsv(FIX2INT(argv[0]), FIX2INT(argv[1]), FIX2INT(argv[2]),
-		 A, xnew);
+                 A, xnew);
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, xnew);
 }
 
@@ -532,7 +530,7 @@ static VALUE rb_gsl_blas_dsymv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_MATRIX(argv[2]);
@@ -546,7 +544,7 @@ static VALUE rb_gsl_blas_dsymv(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_VECTOR(argv[2]);
@@ -575,7 +573,6 @@ static VALUE rb_gsl_blas_dsymv(int argc, VALUE *argv, VALUE obj)
   gsl_blas_dsymv(type, a, A, x, b, y);
   if (flag == 1) return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, y);
   else return argv[argc-1];
-  
 }
 
 static VALUE rb_gsl_blas_dsymv2(int argc, VALUE *argv, VALUE obj)
@@ -589,7 +586,7 @@ static VALUE rb_gsl_blas_dsymv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_MATRIX(argv[2]);
@@ -603,7 +600,7 @@ static VALUE rb_gsl_blas_dsymv2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]);
     CHECK_VECTOR(argv[2]);
@@ -647,7 +644,7 @@ static VALUE rb_gsl_blas_zhemv(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_MATRIX_COMPLEX(argv[2]);
@@ -661,7 +658,7 @@ static VALUE rb_gsl_blas_zhemv(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_VECTOR_COMPLEX(argv[2]);
@@ -691,7 +688,6 @@ static VALUE rb_gsl_blas_zhemv(int argc, VALUE *argv, VALUE obj)
   gsl_blas_zhemv(type, *a, A, x, *b, y);
   if (flag == 1) return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, y);
   else return argv[argc-1];
-  
 }
 
 static VALUE rb_gsl_blas_zhemv2(int argc, VALUE *argv, VALUE obj)
@@ -705,7 +701,7 @@ static VALUE rb_gsl_blas_zhemv2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc < 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_MATRIX_COMPLEX(argv[2]);
@@ -719,7 +715,7 @@ static VALUE rb_gsl_blas_zhemv2(int argc, VALUE *argv, VALUE obj)
   default:
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     if (argc < 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 3)",
-			   argc);
+                           argc);
     CHECK_FIXNUM(argv[0]);
     CHECK_COMPLEX(argv[1]);
     CHECK_VECTOR_COMPLEX(argv[2]);
@@ -759,7 +755,7 @@ static VALUE rb_gsl_blas_dger(VALUE obj, VALUE aa, VALUE xx, VALUE yy, VALUE AA)
   gsl_vector *x = NULL, *y = NULL;
   double a;
   Need_Float(aa);
-  CHECK_VECTOR(xx);  CHECK_VECTOR(yy);  
+  CHECK_VECTOR(xx);  CHECK_VECTOR(yy);
   CHECK_MATRIX(AA);
   a = NUM2DBL(aa);
   Data_Get_Struct(xx, gsl_vector, x);
@@ -775,7 +771,7 @@ static VALUE rb_gsl_blas_dger2(VALUE obj, VALUE aa, VALUE xx, VALUE yy, VALUE AA
   gsl_vector *x = NULL, *y = NULL;
   double a;
   Need_Float(aa);
-  CHECK_VECTOR(xx);  CHECK_VECTOR(yy);  
+  CHECK_VECTOR(xx);  CHECK_VECTOR(yy);
   CHECK_MATRIX(AA);
   a = NUM2DBL(aa);
   Data_Get_Struct(xx, gsl_vector, x);
@@ -793,7 +789,7 @@ static VALUE rb_gsl_blas_zgeru(VALUE obj, VALUE aa, VALUE xx, VALUE yy, VALUE AA
   gsl_vector_complex *x = NULL, *y = NULL;
   gsl_complex *a;
   CHECK_COMPLEX(aa);
-  CHECK_VECTOR_COMPLEX(xx);CHECK_VECTOR_COMPLEX(yy); 
+  CHECK_VECTOR_COMPLEX(xx); CHECK_VECTOR_COMPLEX(yy);
   CHECK_MATRIX_COMPLEX(AA);
   Data_Get_Struct(aa, gsl_complex, a);
   Data_Get_Struct(xx, gsl_vector_complex, x);
@@ -809,7 +805,7 @@ static VALUE rb_gsl_blas_zgeru2(VALUE obj, VALUE aa, VALUE xx, VALUE yy, VALUE A
   gsl_vector_complex *x = NULL, *y = NULL;
   gsl_complex *a;
   CHECK_COMPLEX(aa);
-  CHECK_VECTOR_COMPLEX(xx);CHECK_VECTOR_COMPLEX(yy); 
+  CHECK_VECTOR_COMPLEX(xx); CHECK_VECTOR_COMPLEX(yy);
   CHECK_MATRIX_COMPLEX(AA);
   Data_Get_Struct(aa, gsl_complex, a);
   Data_Get_Struct(xx, gsl_vector_complex, x);
@@ -827,7 +823,7 @@ static VALUE rb_gsl_blas_zgerc(VALUE obj, VALUE aa, VALUE xx, VALUE yy, VALUE AA
   gsl_vector_complex *x = NULL, *y = NULL;
   gsl_complex *a;
   CHECK_COMPLEX(aa);
-  CHECK_VECTOR_COMPLEX(xx);CHECK_VECTOR_COMPLEX(yy); 
+  CHECK_VECTOR_COMPLEX(xx); CHECK_VECTOR_COMPLEX(yy);
   CHECK_MATRIX_COMPLEX(AA);
   Data_Get_Struct(aa, gsl_complex, a);
   Data_Get_Struct(xx, gsl_vector_complex, x);
@@ -843,7 +839,7 @@ static VALUE rb_gsl_blas_zgerc2(VALUE obj, VALUE aa, VALUE xx, VALUE yy, VALUE A
   gsl_vector_complex *x = NULL, *y = NULL;
   gsl_complex *a;
   CHECK_COMPLEX(aa);
-  CHECK_VECTOR_COMPLEX(xx);CHECK_VECTOR_COMPLEX(yy); 
+  CHECK_VECTOR_COMPLEX(xx); CHECK_VECTOR_COMPLEX(yy);
   CHECK_MATRIX_COMPLEX(AA);
   Data_Get_Struct(aa, gsl_complex, a);
   Data_Get_Struct(xx, gsl_vector_complex, x);
@@ -919,8 +915,8 @@ static VALUE rb_gsl_blas_zher_a(VALUE obj, VALUE tt, VALUE aa, VALUE xx, VALUE A
   return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, Anew);
 }
 
-static VALUE rb_gsl_blas_dsyr2(VALUE obj, VALUE tt, VALUE aa, VALUE xx, 
-			      VALUE yy, VALUE AA)
+static VALUE rb_gsl_blas_dsyr2(VALUE obj, VALUE tt, VALUE aa, VALUE xx,
+                               VALUE yy, VALUE AA)
 {
   gsl_matrix *A = NULL;
   gsl_vector *x = NULL, *y = NULL;
@@ -936,8 +932,8 @@ static VALUE rb_gsl_blas_dsyr2(VALUE obj, VALUE tt, VALUE aa, VALUE xx,
   return AA;
 }
 
-static VALUE rb_gsl_blas_dsyr2_a(VALUE obj, VALUE tt, VALUE aa, VALUE xx, 
-				 VALUE yy, VALUE AA)
+static VALUE rb_gsl_blas_dsyr2_a(VALUE obj, VALUE tt, VALUE aa, VALUE xx,
+                                 VALUE yy, VALUE AA)
 {
   gsl_matrix *A = NULL, *Anew = NULL;
   gsl_vector *x = NULL, *y = NULL;
@@ -955,8 +951,8 @@ static VALUE rb_gsl_blas_dsyr2_a(VALUE obj, VALUE tt, VALUE aa, VALUE xx,
   return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Anew);
 }
 
-static VALUE rb_gsl_blas_zher2(VALUE obj, VALUE tt, VALUE aa, VALUE xx, 
-			      VALUE yy, VALUE AA)
+static VALUE rb_gsl_blas_zher2(VALUE obj, VALUE tt, VALUE aa, VALUE xx,
+                               VALUE yy, VALUE AA)
 {
   gsl_matrix_complex *A = NULL;
   gsl_vector_complex *x = NULL, *y = NULL;
@@ -972,8 +968,8 @@ static VALUE rb_gsl_blas_zher2(VALUE obj, VALUE tt, VALUE aa, VALUE xx,
   return AA;
 }
 
-static VALUE rb_gsl_blas_zher2_a(VALUE obj, VALUE tt, VALUE aa, VALUE xx, 
-				 VALUE yy, VALUE AA)
+static VALUE rb_gsl_blas_zher2_a(VALUE obj, VALUE tt, VALUE aa, VALUE xx,
+                                 VALUE yy, VALUE AA)
 {
   gsl_matrix_complex *A = NULL, *Anew = NULL;
   gsl_vector_complex *x = NULL, *y = NULL;
diff --git a/ext/gsl/blas3.c b/ext/gsl_native/blas3.c
similarity index 91%
rename from ext/gsl/blas3.c
rename to ext/gsl_native/blas3.c
index 73d33b1..999b76d 100644
--- a/ext/gsl/blas3.c
+++ b/ext/gsl_native/blas3.c
@@ -91,11 +91,11 @@ static VALUE rb_gsl_blas_dgemm(int argc, VALUE *argv, VALUE obj)
 static VALUE rb_gsl_blas_zgemm(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix_complex *A = NULL, *B = NULL, *C = NULL;
-  gsl_complex alpha, beta, *pa = &alpha, *pb = β
+  gsl_complex *pa = NULL, *pb = NULL;
   CBLAS_TRANSPOSE_t TransA, TransB;
   int flag = 0;
-  alpha.dat[0] = 1.0; alpha.dat[1] = 0.0;
-  beta.dat[0] = 0.0; beta.dat[1] = 0.0;
+  (*pa).dat[0] = 1.0; (*pa).dat[1] = 0.0;
+  (*pb).dat[0] = 0.0; (*pb).dat[1] = 0.0;
   switch (argc) {
   case 2:
     CHECK_MATRIX_COMPLEX(argv[0]);
@@ -156,7 +156,7 @@ static VALUE rb_gsl_blas_zgemm(int argc, VALUE *argv, VALUE obj)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 7)", argc);
     break;
   }
-  gsl_blas_zgemm(TransA, TransB, alpha, A, B, beta, C);
+  gsl_blas_zgemm(TransA, TransB, *pa, A, B, *pb, C);
   if (flag == 1) return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, C);
   else return argv[6];
 }
@@ -307,7 +307,7 @@ static VALUE rb_gsl_blas_zsymm(int argc, VALUE *argv, VALUE obj)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 7)", argc);
     break;
   }
-  gsl_blas_zsymm(Side, Uplo, alpha, A, B, beta, C);
+  gsl_blas_zsymm(Side, Uplo, *pa, A, B, *pb, C);
   if (flag == 1) return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, C);
   else return argv[6];
 }
@@ -382,13 +382,13 @@ static VALUE rb_gsl_blas_zhemm(int argc, VALUE *argv, VALUE obj)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 7)", argc);
     break;
   }
-  gsl_blas_zhemm(Side, Uplo, alpha, A, B, beta, C);
+  gsl_blas_zhemm(Side, Uplo, *pa, A, B, *pb, C);
   if (flag == 1) return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, C);
   else return argv[6];
 }
 
-static VALUE rb_gsl_blas_dtrmm(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_dtrmm(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                               VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix *A = NULL, *B = NULL;
   double alpha;
@@ -410,8 +410,8 @@ static VALUE rb_gsl_blas_dtrmm(VALUE obj, VALUE s, VALUE u, VALUE ta,
   return bb;
 }
 
-static VALUE rb_gsl_blas_dtrmm2(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_dtrmm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                                VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix *A = NULL, *B = NULL, *Bnew = NULL;
   double alpha;
@@ -435,11 +435,11 @@ static VALUE rb_gsl_blas_dtrmm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
   return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Bnew);
 }
 
-static VALUE rb_gsl_blas_ztrmm(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_ztrmm(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                               VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix_complex *A = NULL, *B = NULL;
-  gsl_complex alpha, *pa = α
+  gsl_complex *pa = NULL;
   CBLAS_SIDE_t Side;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t TransA;
@@ -455,15 +455,15 @@ static VALUE rb_gsl_blas_ztrmm(VALUE obj, VALUE s, VALUE u, VALUE ta,
   Data_Get_Struct(a, gsl_complex, pa);
   Data_Get_Struct(aa, gsl_matrix_complex, A);
   Data_Get_Struct(bb, gsl_matrix_complex, B);
-  gsl_blas_ztrmm(Side, Uplo, TransA, Diag, alpha, A, B);
+  gsl_blas_ztrmm(Side, Uplo, TransA, Diag, *pa, A, B);
   return bb;
 }
 
-static VALUE rb_gsl_blas_ztrmm2(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_ztrmm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                                VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix_complex *A = NULL, *B = NULL, *Bnew = NULL;
-  gsl_complex alpha, *pa = α
+  gsl_complex *pa = NULL;
   CBLAS_SIDE_t Side;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t TransA;
@@ -480,12 +480,12 @@ static VALUE rb_gsl_blas_ztrmm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
   Data_Get_Struct(bb, gsl_matrix_complex, B);
   Bnew = gsl_matrix_complex_alloc(B->size1, B->size2);
   gsl_matrix_complex_memcpy(Bnew, B);
-  gsl_blas_ztrmm(Side, Uplo, TransA, Diag, alpha, A, Bnew);
+  gsl_blas_ztrmm(Side, Uplo, TransA, Diag, *pa, A, Bnew);
   return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, Bnew);
 }
 
-static VALUE rb_gsl_blas_dtrsm(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_dtrsm(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                               VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix *A = NULL, *B = NULL;
   double alpha;
@@ -507,8 +507,8 @@ static VALUE rb_gsl_blas_dtrsm(VALUE obj, VALUE s, VALUE u, VALUE ta,
   return bb;
 }
 
-static VALUE rb_gsl_blas_dtrsm2(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_dtrsm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                                VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix *A = NULL, *B = NULL, *Bnew = NULL;
   double alpha;
@@ -532,11 +532,11 @@ static VALUE rb_gsl_blas_dtrsm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
   return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Bnew);
 }
 
-static VALUE rb_gsl_blas_ztrsm(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_ztrsm(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                               VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix_complex *A = NULL, *B = NULL;
-  gsl_complex alpha, *pa = α
+  gsl_complex *pa = NULL;
   CBLAS_SIDE_t Side;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t TransA;
@@ -552,15 +552,15 @@ static VALUE rb_gsl_blas_ztrsm(VALUE obj, VALUE s, VALUE u, VALUE ta,
   Data_Get_Struct(a, gsl_complex, pa);
   Data_Get_Struct(aa, gsl_matrix_complex, A);
   Data_Get_Struct(bb, gsl_matrix_complex, B);
-  gsl_blas_ztrsm(Side, Uplo, TransA, Diag, alpha, A, B);
+  gsl_blas_ztrsm(Side, Uplo, TransA, Diag, *pa, A, B);
   return bb;
 }
 
-static VALUE rb_gsl_blas_ztrsm2(VALUE obj, VALUE s, VALUE u, VALUE ta, 
-			       VALUE d, VALUE a, VALUE aa, VALUE bb)
+static VALUE rb_gsl_blas_ztrsm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
+                                VALUE d, VALUE a, VALUE aa, VALUE bb)
 {
   gsl_matrix_complex *A = NULL, *B = NULL, *Bnew = NULL;
-  gsl_complex alpha, *pa = α
+  gsl_complex *pa = NULL;
   CBLAS_SIDE_t Side;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t TransA;
@@ -578,12 +578,12 @@ static VALUE rb_gsl_blas_ztrsm2(VALUE obj, VALUE s, VALUE u, VALUE ta,
   Data_Get_Struct(bb, gsl_matrix_complex, B);
   Bnew = gsl_matrix_complex_alloc(B->size1, B->size2);
   gsl_matrix_complex_memcpy(Bnew, B);
-  gsl_blas_ztrsm(Side, Uplo, TransA, Diag, alpha, A, Bnew);
+  gsl_blas_ztrsm(Side, Uplo, TransA, Diag, *pa, A, Bnew);
   return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, Bnew);
 }
 
 static VALUE rb_gsl_blas_dsyrk(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-			       VALUE b, VALUE cc)
+                               VALUE b, VALUE cc)
 {
   gsl_matrix *A = NULL, *C = NULL;
   double alpha, beta;
@@ -603,7 +603,7 @@ static VALUE rb_gsl_blas_dsyrk(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
 }
 
 static VALUE rb_gsl_blas_dsyrk2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-			       VALUE b, VALUE cc)
+                                VALUE b, VALUE cc)
 {
   gsl_matrix *A = NULL, *C = NULL, *Cnew = NULL;
   double alpha, beta;
@@ -625,10 +625,10 @@ static VALUE rb_gsl_blas_dsyrk2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
 }
 
 static VALUE rb_gsl_blas_zsyrk(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-			       VALUE b, VALUE cc)
+                               VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *C = NULL;
-  gsl_complex alpha, beta, *pa = &alpha, *pb = β
+  gsl_complex *pa = NULL, *pb = NULL;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t Trans;
   CHECK_FIXNUM(u);  CHECK_FIXNUM(t);
@@ -640,15 +640,15 @@ static VALUE rb_gsl_blas_zsyrk(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
   Data_Get_Struct(b, gsl_complex, pb);
   Data_Get_Struct(aa, gsl_matrix_complex, A);
   Data_Get_Struct(cc, gsl_matrix_complex, C);
-  gsl_blas_zsyrk(Uplo, Trans, alpha, A, beta, C);
+  gsl_blas_zsyrk(Uplo, Trans, *pa, A, *pb, C);
   return cc;
 }
 
 static VALUE rb_gsl_blas_zsyrk2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-			       VALUE b, VALUE cc)
+                                VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *C = NULL, *Cnew = NULL;
-  gsl_complex alpha, beta, *pa = &alpha, *pb = β
+  gsl_complex *pa = NULL, *pb = NULL;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t Trans;
   CHECK_FIXNUM(u);  CHECK_FIXNUM(t);
@@ -662,12 +662,12 @@ static VALUE rb_gsl_blas_zsyrk2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
   Data_Get_Struct(cc, gsl_matrix_complex, C);
   Cnew = gsl_matrix_complex_alloc(C->size1, C->size2);
   gsl_matrix_complex_memcpy(Cnew, C);
-  gsl_blas_zsyrk(Uplo, Trans, alpha, A, beta, Cnew);
+  gsl_blas_zsyrk(Uplo, Trans, *pa, A, *pb, Cnew);
   return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, Cnew);
 }
 
 static VALUE rb_gsl_blas_zherk(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-			       VALUE b, VALUE cc)
+                               VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *C = NULL;
   double alpha, beta;
@@ -688,7 +688,7 @@ static VALUE rb_gsl_blas_zherk(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
 }
 
 static VALUE rb_gsl_blas_zherk2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-			       VALUE b, VALUE cc)
+                                VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *C = NULL, *Cnew = NULL;
   double alpha, beta;
@@ -710,7 +710,7 @@ static VALUE rb_gsl_blas_zherk2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
 }
 
 static VALUE rb_gsl_blas_dsyr2k(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-				VALUE bb, VALUE b, VALUE cc)
+                                VALUE bb, VALUE b, VALUE cc)
 {
   gsl_matrix *A = NULL, *B = NULL, *C = NULL;
   double alpha, beta;
@@ -731,7 +731,7 @@ static VALUE rb_gsl_blas_dsyr2k(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
 }
 
 static VALUE rb_gsl_blas_dsyr2k2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-				VALUE bb, VALUE b, VALUE cc)
+                                 VALUE bb, VALUE b, VALUE cc)
 {
   gsl_matrix *A = NULL, *B = NULL, *C = NULL, *Cnew = NULL;
   double alpha, beta;
@@ -754,10 +754,10 @@ static VALUE rb_gsl_blas_dsyr2k2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
 }
 
 static VALUE rb_gsl_blas_zsyr2k(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-				VALUE bb, VALUE b, VALUE cc)
+                                VALUE bb, VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *B = NULL, *C = NULL;
-  gsl_complex alpha, beta, *pa = &alpha, *pb = β
+  gsl_complex *pa = NULL, *pb = NULL;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t Trans;
   CHECK_FIXNUM(u);  CHECK_FIXNUM(t);
@@ -770,15 +770,15 @@ static VALUE rb_gsl_blas_zsyr2k(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
   Data_Get_Struct(aa, gsl_matrix_complex, A);
   Data_Get_Struct(bb, gsl_matrix_complex, B);
   Data_Get_Struct(cc, gsl_matrix_complex, C);
-  gsl_blas_zsyr2k(Uplo, Trans, alpha, A, B, beta, C);
+  gsl_blas_zsyr2k(Uplo, Trans, *pa, A, B, *pb, C);
   return cc;
 }
 
 static VALUE rb_gsl_blas_zsyr2k2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-				VALUE bb, VALUE b, VALUE cc)
+                                 VALUE bb, VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *B = NULL, *C = NULL, *Cnew = NULL;
-  gsl_complex alpha, beta, *pa = &alpha, *pb = β
+  gsl_complex *pa = NULL, *pb = NULL;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t Trans;
   CHECK_FIXNUM(u);  CHECK_FIXNUM(t);
@@ -793,15 +793,15 @@ static VALUE rb_gsl_blas_zsyr2k2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
   Data_Get_Struct(cc, gsl_matrix_complex, C);
   Cnew = gsl_matrix_complex_alloc(C->size1, C->size2);
   gsl_matrix_complex_memcpy(Cnew, C);
-  gsl_blas_zsyr2k(Uplo, Trans, alpha, A, B, beta, Cnew);
+  gsl_blas_zsyr2k(Uplo, Trans, *pa, A, B, *pb, Cnew);
   return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, Cnew);
 }
 
 static VALUE rb_gsl_blas_zher2k(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-				VALUE bb, VALUE b, VALUE cc)
+                                VALUE bb, VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *B = NULL, *C = NULL;
-  gsl_complex alpha, *pa = α
+  gsl_complex *pa = NULL;
   double beta;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t Trans;
@@ -816,15 +816,15 @@ static VALUE rb_gsl_blas_zher2k(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
   Data_Get_Struct(aa, gsl_matrix_complex, A);
   Data_Get_Struct(bb, gsl_matrix_complex, B);
   Data_Get_Struct(cc, gsl_matrix_complex, C);
-  gsl_blas_zher2k(Uplo, Trans, alpha, A, B, beta, C);
+  gsl_blas_zher2k(Uplo, Trans, *pa, A, B, beta, C);
   return cc;
 }
 
 static VALUE rb_gsl_blas_zher2k2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
-				VALUE bb, VALUE b, VALUE cc)
+                                 VALUE bb, VALUE b, VALUE cc)
 {
   gsl_matrix_complex *A = NULL, *B = NULL, *C = NULL, *Cnew = NULL;
-  gsl_complex alpha, *pa = α
+  gsl_complex *pa = NULL;
   double beta;
   CBLAS_UPLO_t Uplo;
   CBLAS_TRANSPOSE_t Trans;
@@ -841,7 +841,7 @@ static VALUE rb_gsl_blas_zher2k2(VALUE obj, VALUE u, VALUE t, VALUE a, VALUE aa,
   Data_Get_Struct(cc, gsl_matrix_complex, C);
   Cnew = gsl_matrix_complex_alloc(C->size1, C->size2);
   gsl_matrix_complex_memcpy(Cnew, C);
-  gsl_blas_zher2k(Uplo, Trans, alpha, A, B, beta, Cnew);
+  gsl_blas_zher2k(Uplo, Trans, *pa, A, B, beta, Cnew);
   return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, Cnew);
 }
 
diff --git a/ext/gsl/block.c b/ext/gsl_native/block.c
similarity index 89%
rename from ext/gsl/block.c
rename to ext/gsl_native/block.c
index bd873c3..687f4b1 100644
--- a/ext/gsl/block.c
+++ b/ext/gsl_native/block.c
@@ -18,26 +18,23 @@
 #include "include/rb_gsl_histogram.h"
 #include "include/rb_gsl_complex.h"
 #include "include/rb_gsl_poly.h"
-
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
 #define BASE_DOUBLE
 #include "include/templates_on.h"
-#include "block_source.c"
+#include "block_source.h"
 #include "include/templates_off.h"
 #undef  BASE_DOUBLE
 
 #define BASE_INT
 #include "include/templates_on.h"
-#include "block_source.c"
+#include "block_source.h"
 #include "include/templates_off.h"
 #undef  BASE_INT
 
 #define BASE_UCHAR
 #include "include/templates_on.h"
-#include "block_source.c"
+#include "block_source.h"
 #include "include/templates_off.h"
 #undef  BASE_UCHAR
 
diff --git a/ext/gsl/block_source.c b/ext/gsl_native/block_source.h
similarity index 79%
rename from ext/gsl/block_source.c
rename to ext/gsl_native/block_source.h
index 9e9f107..7483c7c 100644
--- a/ext/gsl/block_source.c
+++ b/ext/gsl_native/block_source.h
@@ -82,9 +82,9 @@ static VALUE FUNCTION(rb_gsl_block,fprintf)(int argc, VALUE *argv, VALUE obj)
   GSL_TYPE(gsl_block) *h = NULL;
   FILE *fp = NULL;
   int status, flag = 0;
-  if (argc != 1 && argc != 2) 
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments (%d for 1 or 2)", argc);
+  if (argc != 1 && argc != 2)
+    rb_raise(rb_eArgError,
+             "wrong number of arguments (%d for 1 or 2)", argc);
   Data_Get_Struct(obj, GSL_TYPE(gsl_block), h);
   fp = rb_gsl_open_writefile(argv[0], &flag);
   if (argc == 2) {
@@ -203,28 +203,27 @@ static VALUE FUNCTION(rb_gsl_block,get)(int argc, VALUE *argv, VALUE obj)
       n = RARRAY_LEN(argv[0]);
       bnew = FUNCTION(gsl_block,alloc)(n);
       for (j = 0; j < n; j++) {
-	i = FIX2INT(rb_ary_entry(argv[0], j));
-	if (i < 0) k = b->size + i; else k = i;
-	bnew->data[j] = b->data[k];
+        i = FIX2INT(rb_ary_entry(argv[0], j));
+        if (i < 0) k = b->size + i; else k = i;
+        bnew->data[j] = b->data[k];
       }
       return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
       break;
     default:
       if (PERMUTATION_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_index, p);
-	bnew = FUNCTION(gsl_block,alloc)(p->size);
-	for (j = 0; j < p->size; j++) bnew->data[j] = b->data[p->data[j]];
-	return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
+        Data_Get_Struct(argv[0], gsl_index, p);
+        bnew = FUNCTION(gsl_block,alloc)(p->size);
+        for (j = 0; j < p->size; j++) bnew->data[j] = b->data[p->data[j]];
+        return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
       } else if (CLASS_OF(argv[0]) == rb_cRange) {
-	get_range_int_beg_en_n(argv[0], &beg, &en, &n, &step);
-	bnew = FUNCTION(gsl_block,alloc)(n);
-	for (j = 0; j < n; j++) 
-	  bnew->data[j] = b->data[beg+j];
-	return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free),
-				bnew);
+        get_range_int_beg_en_n(argv[0], &beg, &en, &n, &step);
+        bnew = FUNCTION(gsl_block,alloc)(n);
+        for (j = 0; j < n; j++)
+          bnew->data[j] = b->data[beg+j];
+        return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
       } else {
-	rb_raise(rb_eArgError, "wrong argument type %s (Fixnum, Array, or Range expected)", rb_class2name(CLASS_OF(argv[0])));
-	break;
+        rb_raise(rb_eArgError, "wrong argument type %s (Fixnum, Array, or Range expected)", rb_class2name(CLASS_OF(argv[0])));
+        break;
       }
     }
     break;
@@ -237,7 +236,6 @@ static VALUE FUNCTION(rb_gsl_block,get)(int argc, VALUE *argv, VALUE obj)
     }
     return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
 
-
     break;
   }
   return Qnil;
@@ -257,9 +255,9 @@ static VALUE FUNCTION(rb_gsl_block,set)(VALUE obj, VALUE ii, VALUE xx)
 }
 
 
-static int FUNCTION(gsl_block,eq)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,eq)(const GSL_TYPE(gsl_block) *a,
+                                  const GSL_TYPE(gsl_block) *b,
+                                  gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -273,9 +271,9 @@ static int FUNCTION(gsl_block,eq)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,ne)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,ne)(const GSL_TYPE(gsl_block) *a,
+                                  const GSL_TYPE(gsl_block) *b,
+                                  gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -289,9 +287,9 @@ static int FUNCTION(gsl_block,ne)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,gt)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,gt)(const GSL_TYPE(gsl_block) *a,
+                                  const GSL_TYPE(gsl_block) *b,
+                                  gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -305,9 +303,9 @@ static int FUNCTION(gsl_block,gt)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,ge)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,ge)(const GSL_TYPE(gsl_block) *a,
+                                  const GSL_TYPE(gsl_block) *b,
+                                  gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -321,9 +319,9 @@ static int FUNCTION(gsl_block,ge)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,lt)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,lt)(const GSL_TYPE(gsl_block) *a,
+                                  const GSL_TYPE(gsl_block) *b,
+                                  gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -337,9 +335,9 @@ static int FUNCTION(gsl_block,lt)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,le)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,le)(const GSL_TYPE(gsl_block) *a,
+                                  const GSL_TYPE(gsl_block) *b,
+                                  gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -353,9 +351,9 @@ static int FUNCTION(gsl_block,le)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,and)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,and)(const GSL_TYPE(gsl_block) *a,
+                                   const GSL_TYPE(gsl_block) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -369,9 +367,9 @@ static int FUNCTION(gsl_block,and)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,or)(const GSL_TYPE(gsl_block) *a, 
-				   const GSL_TYPE(gsl_block) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,or)(const GSL_TYPE(gsl_block) *a,
+                                  const GSL_TYPE(gsl_block) *b,
+                                  gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -385,9 +383,9 @@ static int FUNCTION(gsl_block,or)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,xor)(const GSL_TYPE(gsl_block) *a, 
-				    const GSL_TYPE(gsl_block) *b,
-				    gsl_block_uchar *c)
+static int FUNCTION(gsl_block,xor)(const GSL_TYPE(gsl_block) *a,
+                                   const GSL_TYPE(gsl_block) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -401,8 +399,8 @@ static int FUNCTION(gsl_block,xor)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,eq2)(const GSL_TYPE(gsl_block) *a, 
-				    BASE b, gsl_block_uchar *c)
+static int FUNCTION(gsl_block,eq2)(const GSL_TYPE(gsl_block) *a,
+                                   BASE b, gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -415,9 +413,9 @@ static int FUNCTION(gsl_block,eq2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,ne2)(const GSL_TYPE(gsl_block) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,ne2)(const GSL_TYPE(gsl_block) *a,
+                                   BASE b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -430,9 +428,9 @@ static int FUNCTION(gsl_block,ne2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,gt2)(const GSL_TYPE(gsl_block) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,gt2)(const GSL_TYPE(gsl_block) *a,
+                                   BASE b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -445,9 +443,9 @@ static int FUNCTION(gsl_block,gt2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,ge2)(const GSL_TYPE(gsl_block) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,ge2)(const GSL_TYPE(gsl_block) *a,
+                                   BASE b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -460,9 +458,9 @@ static int FUNCTION(gsl_block,ge2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,lt2)(const GSL_TYPE(gsl_block) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,lt2)(const GSL_TYPE(gsl_block) *a,
+                                   BASE b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -475,9 +473,9 @@ static int FUNCTION(gsl_block,lt2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,le2)(const GSL_TYPE(gsl_block) *a, 
-				    BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,le2)(const GSL_TYPE(gsl_block) *a,
+                                   BASE b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -490,9 +488,9 @@ static int FUNCTION(gsl_block,le2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,and2)(const GSL_TYPE(gsl_block) *a, 
-				    BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,and2)(const GSL_TYPE(gsl_block) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -505,9 +503,9 @@ static int FUNCTION(gsl_block,and2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,or2)(const GSL_TYPE(gsl_block) *a, 
-				    BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_block,or2)(const GSL_TYPE(gsl_block) *a,
+                                   BASE b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -520,9 +518,9 @@ static int FUNCTION(gsl_block,or2)(const GSL_TYPE(gsl_block) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_block,xor2)(const GSL_TYPE(gsl_block) *a, 
-				     BASE b,
-				    gsl_block_uchar *c)
+static int FUNCTION(gsl_block,xor2)(const GSL_TYPE(gsl_block) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -537,12 +535,12 @@ static int FUNCTION(gsl_block,xor2)(const GSL_TYPE(gsl_block) *a,
 
 
 static VALUE FUNCTION(rb_gsl_block,compare)(VALUE aa, VALUE bb,
-					     int (*cmp)(const GSL_TYPE(gsl_block)*,
-							const GSL_TYPE(gsl_block)*,
-							gsl_block_uchar*),
-					     int (*cmp2)(const GSL_TYPE(gsl_block)*,
-							 BASE,
-							 gsl_block_uchar*))
+                                            int (*cmp)(const GSL_TYPE (gsl_block)*,
+                                                       const GSL_TYPE (gsl_block)*,
+                                                       gsl_block_uchar*),
+                                            int (*cmp2)(const GSL_TYPE (gsl_block)*,
+                                                        BASE,
+                                                        gsl_block_uchar*))
 {
   GSL_TYPE(gsl_block) *a, *b;
   /*  gsl_block_int *c;*/
@@ -553,9 +551,9 @@ static VALUE FUNCTION(rb_gsl_block,compare)(VALUE aa, VALUE bb,
   c = gsl_block_uchar_alloc(a->size);
   if (BL_P(bb)) {
     Data_Get_Struct(bb, GSL_TYPE(gsl_block), b);
-    if (a->size != b->size) 
-      rb_raise(rb_eRuntimeError, "Block size mismatch, %d and %d", (int) a->size, 
-	       (int) b->size);
+    if (a->size != b->size)
+      rb_raise(rb_eRuntimeError, "Block size mismatch, %d and %d", (int) a->size,
+               (int) b->size);
     /*status =*/ (*cmp)(a, b, c);
   } else {
     /*status =*/ (*cmp2)(a, NUMCONV(bb), c);
@@ -566,55 +564,55 @@ static VALUE FUNCTION(rb_gsl_block,compare)(VALUE aa, VALUE bb,
 static VALUE FUNCTION(rb_gsl_block,eq)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,eq),
-					 FUNCTION(gsl_block,eq2));
+                                        FUNCTION(gsl_block,eq2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,ne)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,ne),
-					 FUNCTION(gsl_block,ne2));
+                                        FUNCTION(gsl_block,ne2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,gt)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,gt),
-					 FUNCTION(gsl_block,gt2));
+                                        FUNCTION(gsl_block,gt2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,ge)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,ge),
-					 FUNCTION(gsl_block,ge2));
+                                        FUNCTION(gsl_block,ge2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,lt)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,lt),
-					 FUNCTION(gsl_block,lt2));
+                                        FUNCTION(gsl_block,lt2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,le)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,le),
-					 FUNCTION(gsl_block,le2));
+                                        FUNCTION(gsl_block,le2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,and)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,and),
-					 FUNCTION(gsl_block,and2));
+                                        FUNCTION(gsl_block,and2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,or)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,or),
-					 FUNCTION(gsl_block,or2));
+                                        FUNCTION(gsl_block,or2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,xor)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,xor),
-					 FUNCTION(gsl_block,xor2));
+                                        FUNCTION(gsl_block,xor2));
 }
 
 static VALUE FUNCTION(rb_gsl_block,not)(VALUE obj)
@@ -669,11 +667,11 @@ static VALUE FUNCTION(rb_gsl_block,all)(VALUE obj)
 
   Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
   if (rb_block_given_p()) {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (!rb_yield(C_TO_VALUE(v->data[i]))) return Qfalse;
     return Qtrue;
   } else {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (!v->data[i]) return Qfalse;
     return Qtrue;
   }
@@ -686,11 +684,11 @@ static VALUE FUNCTION(rb_gsl_block,none)(VALUE obj)
 
   Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
   if (rb_block_given_p()) {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (rb_yield(C_TO_VALUE(v->data[i]))) return Qfalse;
     return Qtrue;
   } else {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (v->data[i]) return Qfalse;
     return Qtrue;
   }
@@ -708,10 +706,10 @@ static VALUE FUNCTION(rb_gsl_block,where)(VALUE obj)
     btmp = gsl_block_uchar_alloc(v->size);
     for (i = 0; i < v->size; i++) {
       if (rb_yield(C_TO_VALUE(v->data[i]))) {
-	btmp->data[i] = 1;
-	n++;
+        btmp->data[i] = 1;
+        n++;
       } else {
-	btmp->data[i] = 0;
+        btmp->data[i] = 0;
       }
     }  /* for */
   } else { /* block is not given */
@@ -744,10 +742,10 @@ static VALUE FUNCTION(rb_gsl_block,where2)(VALUE obj)
     btmp = gsl_block_uchar_alloc(v->size);
     for (i = 0; i < v->size; i++) {
       if (rb_yield(C_TO_VALUE(v->data[i]))) {
-	btmp->data[i] = 1;
-	n++;
+        btmp->data[i] = 1;
+        n++;
       } else {
-	btmp->data[i] = 0;
+        btmp->data[i] = 0;
       }
     } /* for */
   } else {  /* block is not given */
@@ -758,11 +756,11 @@ static VALUE FUNCTION(rb_gsl_block,where2)(VALUE obj)
     v2 = gsl_permutation_calloc(v->size);  /* calloc() initializes v2 */
     vv1 = Qnil;
     vv2 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v2);
-  } else if (v->size-n == 0) { 
+  } else if (v->size-n == 0) {
     v1 = gsl_permutation_calloc(n);           /* calloc() initializes v1 */
-    vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);     
+    vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);
     vv2 = Qnil;
-  } else { 
+  } else {
     /* same case as 'where' */
     v1 = gsl_permutation_alloc(n);
     v2 = gsl_permutation_alloc(v->size-n);
@@ -830,12 +828,12 @@ static VALUE FUNCTION(rb_gsl_block,collect_bang)(VALUE obj)
 
 void FUNCTION(Init_gsl_block,init)(VALUE module)
 {
-  rb_define_singleton_method(GSL_TYPE(cgsl_block), "new", 
-			     FUNCTION(rb_gsl_block,new), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_block), "alloc", 
-			     FUNCTION(rb_gsl_block,new), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_block), "calloc", 
-			     FUNCTION(rb_gsl_block,calloc), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_block), "new",
+                             FUNCTION(rb_gsl_block,new), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_block), "alloc",
+                             FUNCTION(rb_gsl_block,new), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_block), "calloc",
+                             FUNCTION(rb_gsl_block,calloc), 1);
 
   rb_define_method(GSL_TYPE(cgsl_block), "size", FUNCTION(rb_gsl_block,size), 0);
   rb_define_alias(GSL_TYPE(cgsl_block), "length", "size");
@@ -871,9 +869,9 @@ void FUNCTION(Init_gsl_block,init)(VALUE module)
   rb_define_method(GSL_TYPE(cgsl_block), "all?", FUNCTION(rb_gsl_block,all), 0);
   rb_define_method(GSL_TYPE(cgsl_block), "none?", FUNCTION(rb_gsl_block,none), 0);
   rb_define_method(GSL_TYPE(cgsl_block), "any",
-		   FUNCTION(rb_gsl_block,any), 0);
+                   FUNCTION(rb_gsl_block,any), 0);
   rb_define_method(GSL_TYPE(cgsl_block), "any?",
-		   FUNCTION(rb_gsl_block,any2), 0);
+                   FUNCTION(rb_gsl_block,any2), 0);
 
   rb_define_method(GSL_TYPE(cgsl_block), "where", FUNCTION(rb_gsl_block,where), 0);
   rb_define_method(GSL_TYPE(cgsl_block), "where2", FUNCTION(rb_gsl_block,where2), 0);
diff --git a/ext/gsl_native/bspline.c b/ext/gsl_native/bspline.c
new file mode 100644
index 0000000..accc503
--- /dev/null
+++ b/ext/gsl_native/bspline.c
@@ -0,0 +1,122 @@
+#include "include/rb_gsl.h"
+#include "gsl/gsl_bspline.h"
+
+static VALUE cBSWS;
+
+static VALUE rb_gsl_bspline_alloc(VALUE klass, VALUE k, VALUE n)
+{
+  gsl_bspline_workspace *w;
+  w = gsl_bspline_alloc(FIX2INT(k), FIX2INT(n));
+  return Data_Wrap_Struct(klass, 0, gsl_bspline_free, w);
+}
+
+static VALUE rb_gsl_bspline_ncoeffs(VALUE obj)
+{
+  gsl_bspline_workspace *w;
+  Data_Get_Struct(obj, gsl_bspline_workspace, w);
+  return INT2FIX((int)gsl_bspline_ncoeffs(w));
+}
+static VALUE rb_gsl_bspline_order(VALUE obj)
+{
+  gsl_bspline_workspace *w;
+  Data_Get_Struct(obj, gsl_bspline_workspace, w);
+  return INT2FIX((int)gsl_bspline_order(w));
+}
+static VALUE rb_gsl_bspline_nbreak(VALUE obj)
+{
+  gsl_bspline_workspace *w;
+  Data_Get_Struct(obj, gsl_bspline_workspace, w);
+  return INT2FIX((int)gsl_bspline_nbreak(w));
+}
+static VALUE rb_gsl_bspline_breakpoint(VALUE obj, VALUE i)
+{
+  gsl_bspline_workspace *w;
+  Data_Get_Struct(obj, gsl_bspline_workspace, w);
+  return rb_float_new(gsl_bspline_breakpoint(FIX2INT(i), w));
+}
+static VALUE rb_gsl_bspline_knots(VALUE obj, VALUE b)
+{
+  gsl_bspline_workspace *w;
+  gsl_vector *bpts;
+  CHECK_VECTOR(b);
+  Data_Get_Struct(obj, gsl_bspline_workspace, w);
+  Data_Get_Struct(b, gsl_vector, bpts);
+  gsl_bspline_knots(bpts, w);
+  return Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, w->knots);
+}
+static VALUE rb_gsl_bspline_knots_uniform(int argc, VALUE *argv, VALUE obj)
+{
+  gsl_bspline_workspace *w;
+  int argc2;
+  switch (TYPE(obj)) {
+  case T_MODULE:
+  case T_CLASS:
+  case T_OBJECT:
+    if (!rb_obj_is_kind_of(argv[argc-1], cBSWS)) {
+      rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::BSpline expected)",
+               rb_class2name(CLASS_OF(argv[argc-1])));
+    }
+    Data_Get_Struct(argv[argc-1], gsl_bspline_workspace, w);
+    argc2 = argc-1;
+    break;
+  default:
+    Data_Get_Struct(obj, gsl_bspline_workspace, w);
+    argc2 = argc;
+  }
+  if (argc2 != 2) rb_raise(rb_eArgError, "Wrong number of arguments.");
+  gsl_bspline_knots_uniform(NUM2DBL(argv[0]), NUM2DBL(argv[1]), w);
+  return Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, w->knots);
+}
+static VALUE rb_gsl_bspline_eval(int argc, VALUE *argv, VALUE obj)
+{
+  gsl_bspline_workspace *w;
+  double x;
+  gsl_vector *B;
+  VALUE vB;
+
+  Data_Get_Struct(obj, gsl_bspline_workspace, w);
+
+  switch (argc) {
+  case 2:
+    CHECK_VECTOR(argv[1]);
+    Data_Get_Struct(argv[1], gsl_vector, B);
+    vB = argv[1];
+    x = NUM2DBL(argv[0]);
+    break;
+  case 1:
+    x = NUM2DBL(argv[0]);
+    B = gsl_vector_alloc(w->nbreak+w->k-2);
+    vB = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, B);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
+  }
+
+  gsl_bspline_eval(x, B, w);
+
+  return vB;
+}
+
+static VALUE rb_gsl_bspline_greville_abscissa(VALUE obj, VALUE i)
+{
+  gsl_bspline_workspace *w;
+  Data_Get_Struct(obj, gsl_bspline_workspace, w);
+  return rb_float_new(gsl_bspline_greville_abscissa(i, w));
+}
+
+void Init_bspline(VALUE module)
+{
+  cBSWS = rb_define_class_under(module, "BSpline", cGSL_Object);
+
+  rb_define_singleton_method(cBSWS, "alloc", rb_gsl_bspline_alloc, 2);
+
+  rb_define_method(cBSWS, "ncoeffs", rb_gsl_bspline_ncoeffs, 0);
+  rb_define_method(cBSWS, "order", rb_gsl_bspline_order, 0);
+  rb_define_method(cBSWS, "nbreak", rb_gsl_bspline_nbreak, 0);
+  rb_define_method(cBSWS, "breakpoint", rb_gsl_bspline_breakpoint, 1);
+  rb_define_method(cBSWS, "knots", rb_gsl_bspline_knots, 1);
+  rb_define_method(cBSWS, "knots_uniform", rb_gsl_bspline_knots_uniform, -1);
+  rb_define_singleton_method(cBSWS, "knots_uniform", rb_gsl_bspline_knots_uniform, -1);
+  rb_define_method(cBSWS, "eval", rb_gsl_bspline_eval, -1);
+  rb_define_method(cBSWS, "greville_abscissa", rb_gsl_bspline_greville_abscissa, 1);
+}
diff --git a/ext/gsl/bundle.c b/ext/gsl_native/bundle.c
similarity index 100%
rename from ext/gsl/bundle.c
rename to ext/gsl_native/bundle.c
diff --git a/ext/gsl/cdf.c b/ext/gsl_native/cdf.c
similarity index 96%
rename from ext/gsl/cdf.c
rename to ext/gsl_native/cdf.c
index 1756152..5188de6 100644
--- a/ext/gsl/cdf.c
+++ b/ext/gsl_native/cdf.c
@@ -9,7 +9,6 @@
   WITHOUT ANY WARRANTY.
 */
 
-#ifdef GSL_1_4_LATER
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_common.h"
 #include "include/rb_gsl_rng.h"
@@ -18,10 +17,10 @@
 
 VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double));
 VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa, double (*f)(double, double));
-VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb, 
-			      double (*f)(double, double, double));
-VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa, 
-				       double (*f)(unsigned int, double));
+VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
+                           double (*f)(double, double, double));
+VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
+                                double (*f)(unsigned int, double));
 
 
 static VALUE rb_gsl_cdf_gaussian_P(int argc, VALUE *argv, VALUE obj)
@@ -70,316 +69,313 @@ static VALUE rb_gsl_cdf_gaussian_Qinv(int argc, VALUE *argv, VALUE obj)
 static VALUE rb_gsl_cdf_exponential_P(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_exponential_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_exponential_Q(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_exponential_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_exponential_Pinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_exponential_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_exponential_Qinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_exponential_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_laplace_P(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_laplace_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_laplace_Q(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_laplace_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_laplace_Pinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_laplace_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_laplace_Qinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_laplace_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_cauchy_P(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_cauchy_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_cauchy_Q(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_cauchy_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_cauchy_Pinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_cauchy_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_cauchy_Qinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_cauchy_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_rayleigh_P(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_rayleigh_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_rayleigh_Q(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_rayleigh_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_rayleigh_Pinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_rayleigh_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_rayleigh_Qinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_rayleigh_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_gamma_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gamma_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_gamma_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_gamma_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_gamma_Pinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_gamma_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_gamma_Qinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_gamma_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_flat_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_flat_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_flat_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_flat_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_flat_Pinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_flat_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_flat_Qinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_flat_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_lognormal_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_lognormal_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_lognormal_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_lognormal_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_lognormal_Pinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_lognormal_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_lognormal_Qinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b,  gsl_cdf_lognormal_Qinv);
-}  
+}
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_cdf_exppow_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_exppow_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_exppow_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_exppow_Q);
-}  
-#endif
+}
 
 static VALUE rb_gsl_cdf_chisq_P(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_chisq_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_chisq_Q(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_chisq_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_chisq_Pinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_chisq_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_chisq_Qinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_chisq_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_fdist_P(VALUE obj, VALUE x, VALUE nu1, VALUE nu2)
 {
   return rb_gsl_eval_pdf_cdf3(x, nu1, nu2, gsl_cdf_fdist_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_fdist_Q(VALUE obj, VALUE x, VALUE nu1, VALUE nu2)
 {
   return rb_gsl_eval_pdf_cdf3(x, nu1, nu2, gsl_cdf_fdist_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_tdist_P(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_tdist_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_tdist_Q(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_tdist_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_tdist_Pinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_tdist_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_tdist_Qinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_tdist_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_beta_P(VALUE obj, VALUE x, VALUE nu1, VALUE nu2)
 {
   return rb_gsl_eval_pdf_cdf3(x, nu1, nu2, gsl_cdf_beta_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_beta_Q(VALUE obj, VALUE x, VALUE nu1, VALUE nu2)
 {
   return rb_gsl_eval_pdf_cdf3(x, nu1, nu2, gsl_cdf_beta_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_logistic_P(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_logistic_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_logistic_Q(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_logistic_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_logistic_Pinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_logistic_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_logistic_Qinv(VALUE obj, VALUE x, VALUE mu)
 {
   return rb_gsl_eval_pdf_cdf2(x, mu, gsl_cdf_logistic_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_pareto_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_pareto_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_pareto_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_pareto_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_pareto_Pinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_pareto_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_pareto_Qinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_pareto_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_weibull_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_weibull_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_weibull_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_weibull_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_weibull_Pinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_weibull_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_weibull_Qinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_weibull_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel1_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel1_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel1_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel1_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel1_Pinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel1_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel1_Qinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel1_Qinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel2_P(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel2_P);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel2_Q(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel2_Q);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel2_Pinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel2_Pinv);
-}  
+}
 
 static VALUE rb_gsl_cdf_gumbel2_Qinv(VALUE obj, VALUE x, VALUE a, VALUE b)
 {
   return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_cdf_gumbel2_Qinv);
-}  
+}
 
-#ifdef GSL_1_8_LATER
 static VALUE rb_gsl_cdf_binomial_P(VALUE obj, VALUE kk, VALUE pp, VALUE nn)
 {
   unsigned int k, n;
@@ -516,7 +512,6 @@ static VALUE rb_gsl_cdf_fdist_Qinv(VALUE obj, VALUE qq, VALUE aa, VALUE bb)
   b = NUM2DBL(bb);
   return rb_float_new(gsl_cdf_fdist_Qinv(Q, a, b));
 }
-#endif
 
 void Init_gsl_cdf(VALUE module)
 {
@@ -535,7 +530,7 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(module, "cdf_ugaussian_Qinv", rb_gsl_cdf_gaussian_Qinv, -1);
 
   rb_define_module_function(module, "cdf_exponential_P", rb_gsl_cdf_exponential_P, 2);
- rb_define_module_function(module, "cdf_exponential_Q", rb_gsl_cdf_exponential_Q, 2);
+  rb_define_module_function(module, "cdf_exponential_Q", rb_gsl_cdf_exponential_Q, 2);
   rb_define_module_function(module, "cdf_exponential_Pinv", rb_gsl_cdf_exponential_Pinv, 2);
   rb_define_module_function(module, "cdf_exponential_Qinv", rb_gsl_cdf_exponential_Qinv, 2);
 
@@ -573,7 +568,7 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(module, "cdf_chisq_Q", rb_gsl_cdf_chisq_Q, 2);
   rb_define_module_function(module, "cdf_chisq_Pinv", rb_gsl_cdf_chisq_Pinv, 2);
   rb_define_module_function(module, "cdf_chisq_Qinv", rb_gsl_cdf_chisq_Qinv, 2);
-  
+
   rb_define_module_function(module, "cdf_fdist_P", rb_gsl_cdf_fdist_P, 3);
   rb_define_module_function(module, "cdf_fdist_Q", rb_gsl_cdf_fdist_Q, 3);
 
@@ -581,7 +576,7 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(module, "cdf_tdist_Q", rb_gsl_cdf_tdist_Q, 2);
   rb_define_module_function(module, "cdf_tdist_Pinv", rb_gsl_cdf_tdist_Pinv, 2);
   rb_define_module_function(module, "cdf_tdist_Qinv", rb_gsl_cdf_tdist_Qinv, 2);
-  
+
   rb_define_module_function(module, "cdf_beta_P", rb_gsl_cdf_beta_P, 3);
   rb_define_module_function(module, "cdf_beta_Q", rb_gsl_cdf_beta_Q, 3);
 
@@ -589,7 +584,7 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(module, "cdf_logistic_Q", rb_gsl_cdf_logistic_Q, 2);
   rb_define_module_function(module, "cdf_logistic_Pinv", rb_gsl_cdf_logistic_Pinv, 2);
   rb_define_module_function(module, "cdf_logistic_Qinv", rb_gsl_cdf_logistic_Qinv, 2);
-  
+
   rb_define_module_function(module, "cdf_pareto_P", rb_gsl_cdf_pareto_P, 3);
   rb_define_module_function(module, "cdf_pareto_Q", rb_gsl_cdf_pareto_Q, 3);
   rb_define_module_function(module, "cdf_pareto_Pinv", rb_gsl_cdf_pareto_Pinv, 3);
@@ -622,12 +617,12 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(mgsl_cdf, "ugaussian_Qinv", rb_gsl_cdf_gaussian_Qinv, -1);
 
   rb_define_module_function(mgsl_cdf, "exponential_P", rb_gsl_cdf_exponential_P, 2);
- rb_define_module_function(mgsl_cdf, "exponential_Q", rb_gsl_cdf_exponential_Q, 2);
+  rb_define_module_function(mgsl_cdf, "exponential_Q", rb_gsl_cdf_exponential_Q, 2);
   rb_define_module_function(mgsl_cdf, "exponential_Pinv", rb_gsl_cdf_exponential_Pinv, 2);
   rb_define_module_function(mgsl_cdf, "exponential_Qinv", rb_gsl_cdf_exponential_Qinv, 2);
 
- rb_define_module_function(mgsl_cdf, "laplace_P", rb_gsl_cdf_laplace_P, 2);
- rb_define_module_function(mgsl_cdf, "laplace_Q", rb_gsl_cdf_laplace_Q, 2);
+  rb_define_module_function(mgsl_cdf, "laplace_P", rb_gsl_cdf_laplace_P, 2);
+  rb_define_module_function(mgsl_cdf, "laplace_Q", rb_gsl_cdf_laplace_Q, 2);
   rb_define_module_function(mgsl_cdf, "laplace_Pinv", rb_gsl_cdf_laplace_Pinv, 2);
   rb_define_module_function(mgsl_cdf, "laplace_Qinv", rb_gsl_cdf_laplace_Qinv, 2);
 
@@ -660,7 +655,7 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(mgsl_cdf, "chisq_Q", rb_gsl_cdf_chisq_Q, 2);
   rb_define_module_function(mgsl_cdf, "chisq_Pinv", rb_gsl_cdf_chisq_Pinv, 2);
   rb_define_module_function(mgsl_cdf, "chisq_Qinv", rb_gsl_cdf_chisq_Qinv, 2);
-  
+
   rb_define_module_function(mgsl_cdf, "fdist_P", rb_gsl_cdf_fdist_P, 3);
   rb_define_module_function(mgsl_cdf, "fdist_Q", rb_gsl_cdf_fdist_Q, 3);
 
@@ -668,7 +663,7 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(mgsl_cdf, "tdist_Q", rb_gsl_cdf_tdist_Q, 2);
   rb_define_module_function(mgsl_cdf, "tdist_Pinv", rb_gsl_cdf_tdist_Pinv, 2);
   rb_define_module_function(mgsl_cdf, "tdist_Qinv", rb_gsl_cdf_tdist_Qinv, 2);
-  
+
   rb_define_module_function(mgsl_cdf, "beta_P", rb_gsl_cdf_beta_P, 3);
   rb_define_module_function(mgsl_cdf, "beta_Q", rb_gsl_cdf_beta_Q, 3);
 
@@ -676,7 +671,7 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(mgsl_cdf, "logistic_Q", rb_gsl_cdf_logistic_Q, 2);
   rb_define_module_function(mgsl_cdf, "logistic_Pinv", rb_gsl_cdf_logistic_Pinv, 2);
   rb_define_module_function(mgsl_cdf, "logistic_Qinv", rb_gsl_cdf_logistic_Qinv, 2);
-  
+
   rb_define_module_function(mgsl_cdf, "pareto_P", rb_gsl_cdf_pareto_P, 3);
   rb_define_module_function(mgsl_cdf, "pareto_Q", rb_gsl_cdf_pareto_Q, 3);
   rb_define_module_function(mgsl_cdf, "pareto_Pinv", rb_gsl_cdf_pareto_Pinv, 3);
@@ -697,16 +692,12 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(mgsl_cdf, "gumbel2_Pinv", rb_gsl_cdf_gumbel2_Pinv, 3);
   rb_define_module_function(mgsl_cdf, "gumbel2_Qinv", rb_gsl_cdf_gumbel2_Qinv, 3);
 
-
-#ifdef GSL_1_6_LATER
   rb_define_module_function(module, "cdf_exppow_P", rb_gsl_cdf_exppow_P, 3);
   rb_define_module_function(module, "cdf_exppow_Q", rb_gsl_cdf_exppow_Q, 3);
 
   rb_define_module_function(mgsl_cdf, "exppow_P", rb_gsl_cdf_exppow_P, 3);
   rb_define_module_function(mgsl_cdf, "exppow_Q", rb_gsl_cdf_exppow_Q, 3);
-#endif
 
-#ifdef GSL_1_8_LATER
   rb_define_module_function(module, "cdf_binomial_P", rb_gsl_cdf_binomial_P, 3);
   rb_define_module_function(module, "cdf_binomial_Q", rb_gsl_cdf_binomial_Q, 3);
   rb_define_module_function(mgsl_cdf, "binomial_P", rb_gsl_cdf_binomial_P, 3);
@@ -746,7 +737,4 @@ void Init_gsl_cdf(VALUE module)
   rb_define_module_function(mgsl_cdf, "fdist_Pinv", rb_gsl_cdf_fdist_Pinv, 3);
   rb_define_module_function(module, "cdf_fdist_Qinv", rb_gsl_cdf_fdist_Qinv, 3);
   rb_define_module_function(mgsl_cdf, "fdist_Qinv", rb_gsl_cdf_fdist_Qinv, 3);
-#endif
-
 }
-#endif
diff --git a/ext/gsl/cheb.c b/ext/gsl_native/cheb.c
similarity index 77%
rename from ext/gsl/cheb.c
rename to ext/gsl_native/cheb.c
index c2e8caa..31cf868 100644
--- a/ext/gsl/cheb.c
+++ b/ext/gsl_native/cheb.c
@@ -15,9 +15,6 @@
 #include "include/rb_gsl_function.h"
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_chebyshev.h>
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 static VALUE cgsl_cheb;
 
@@ -98,10 +95,6 @@ static VALUE rb_gsl_cheb_eval(VALUE obj, VALUE xx)
   size_t i, j, n;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
   Data_Get_Struct(obj, gsl_cheb_series, p);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
@@ -124,6 +117,8 @@ static VALUE rb_gsl_cheb_eval(VALUE obj, VALUE xx)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
       n = na->total;
@@ -137,16 +132,16 @@ static VALUE rb_gsl_cheb_eval(VALUE obj, VALUE xx)
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, gsl_cheb_eval(p, gsl_vector_get(v, i)));
+        gsl_vector_set(vnew, i, gsl_cheb_eval(p, gsl_vector_get(v, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, gsl_cheb_eval(p, gsl_matrix_get(m, i, j)));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, gsl_cheb_eval(p, gsl_matrix_get(m, i, j)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -165,10 +160,6 @@ static VALUE rb_gsl_cheb_eval_err(VALUE obj, VALUE xx)
   size_t n, i, j;
   gsl_vector *v = NULL, *vnew = NULL, *verr = NULL;
   gsl_matrix *m = NULL, *mnew = NULL, *merr = NULL;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2, *ptr3;
-#endif
   Data_Get_Struct(obj, gsl_cheb_series, p);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
@@ -195,6 +186,8 @@ static VALUE rb_gsl_cheb_eval_err(VALUE obj, VALUE xx)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2, *ptr3;
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
       n = na->total;
@@ -203,9 +196,9 @@ static VALUE rb_gsl_cheb_eval_err(VALUE obj, VALUE xx)
       ptr2 = NA_PTR_TYPE(ary,double*);
       ptr3 = NA_PTR_TYPE(aerr,double*);
       for (i = 0; i < n; i++) {
-	gsl_cheb_eval_err(p, ptr1[i], &result, &err);
-	ptr2[i] = result;
-	ptr3[i] = err;
+        gsl_cheb_eval_err(p, ptr1[i], &result, &err);
+        ptr2[i] = result;
+        ptr3[i] = err;
       }
       return rb_ary_new3(2, ary, aerr);
     }
@@ -215,27 +208,27 @@ static VALUE rb_gsl_cheb_eval_err(VALUE obj, VALUE xx)
       vnew = gsl_vector_alloc(v->size);
       verr = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_cheb_eval_err(p, gsl_vector_get(v, i), &result, &err);
-	gsl_vector_set(vnew, i, result);
-	gsl_vector_set(verr, i, err);
+        gsl_cheb_eval_err(p, gsl_vector_get(v, i), &result, &err);
+        gsl_vector_set(vnew, i, result);
+        gsl_vector_set(verr, i, err);
       }
-      return rb_ary_new3(2, 
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
+      return rb_ary_new3(2,
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       merr = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_cheb_eval_err(p, gsl_matrix_get(m, i, j), &result, &err);
-	  gsl_matrix_set(mnew, i, j, result);
-	  gsl_matrix_set(merr, i, j, err);
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_cheb_eval_err(p, gsl_matrix_get(m, i, j), &result, &err);
+          gsl_matrix_set(mnew, i, j, result);
+          gsl_matrix_set(merr, i, j, err);
+        }
       }
       return rb_ary_new3(2,
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
     } else {
       rb_raise(rb_eTypeError, "wrong argument type");
     }
@@ -251,10 +244,6 @@ static VALUE rb_gsl_cheb_eval_n(VALUE obj, VALUE nn, VALUE xx)
   size_t n, order, i, j;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
   CHECK_FIXNUM(nn);
   order = FIX2INT(nn);
   Data_Get_Struct(obj, gsl_cheb_series, p);
@@ -279,6 +268,8 @@ static VALUE rb_gsl_cheb_eval_n(VALUE obj, VALUE nn, VALUE xx)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
       n = na->total;
@@ -292,17 +283,17 @@ static VALUE rb_gsl_cheb_eval_n(VALUE obj, VALUE nn, VALUE xx)
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, gsl_cheb_eval_n(p, order, gsl_vector_get(v, i)));
+        gsl_vector_set(vnew, i, gsl_cheb_eval_n(p, order, gsl_vector_get(v, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, 
-			 gsl_cheb_eval_n(p, order, gsl_matrix_get(m, i, j)));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j,
+                         gsl_cheb_eval_n(p, order, gsl_matrix_get(m, i, j)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -321,11 +312,7 @@ static VALUE rb_gsl_cheb_eval_n_err(VALUE obj, VALUE nn, VALUE xx)
   size_t n, order, i, j;
   gsl_vector *v, *vnew, *verr;
   gsl_matrix *m, *mnew, *merr;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2, *ptr3;
-#endif
-  CHECK_FIXNUM(nn); 
+  CHECK_FIXNUM(nn);
   order = FIX2INT(nn);
   Data_Get_Struct(obj, gsl_cheb_series, p);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
@@ -353,6 +340,8 @@ static VALUE rb_gsl_cheb_eval_n_err(VALUE obj, VALUE nn, VALUE xx)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2, *ptr3;
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
       n = na->total;
@@ -361,9 +350,9 @@ static VALUE rb_gsl_cheb_eval_n_err(VALUE obj, VALUE nn, VALUE xx)
       ptr2 = NA_PTR_TYPE(ary,double*);
       ptr3 = NA_PTR_TYPE(aerr,double*);
       for (i = 0; i < n; i++) {
-	gsl_cheb_eval_n_err(p, order, ptr1[i], &result, &err);
-	ptr2[i] = result;
-	ptr3[i] = err;
+        gsl_cheb_eval_n_err(p, order, ptr1[i], &result, &err);
+        ptr2[i] = result;
+        ptr3[i] = err;
       }
       return rb_ary_new3(2, ary, aerr);
     }
@@ -373,27 +362,27 @@ static VALUE rb_gsl_cheb_eval_n_err(VALUE obj, VALUE nn, VALUE xx)
       vnew = gsl_vector_alloc(v->size);
       verr = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_cheb_eval_n_err(p, order, gsl_vector_get(v, i), &result, &err);
-	gsl_vector_set(vnew, i, result);
-	gsl_vector_set(verr, i, err);
+        gsl_cheb_eval_n_err(p, order, gsl_vector_get(v, i), &result, &err);
+        gsl_vector_set(vnew, i, result);
+        gsl_vector_set(verr, i, err);
       }
-      return rb_ary_new3(2, 
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
+      return rb_ary_new3(2,
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       merr = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_cheb_eval_n_err(p, order, gsl_matrix_get(m, i, j), &result, &err);
-	  gsl_matrix_set(mnew, i, j, result);
-	  gsl_matrix_set(merr, i, j, err);
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_cheb_eval_n_err(p, order, gsl_matrix_get(m, i, j), &result, &err);
+          gsl_matrix_set(mnew, i, j, result);
+          gsl_matrix_set(merr, i, j, err);
+        }
       }
       return rb_ary_new3(2,
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
     } else {
       rb_raise(rb_eTypeError, "wrong argument type");
     }
@@ -412,20 +401,20 @@ static VALUE rb_gsl_cheb_calc_deriv(int argc, VALUE *argv, VALUE obj)
   case T_OBJECT:
     switch (argc) {
     case 1:
-      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[0])));
+      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
+        rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_cheb_series, cs);
       deriv = gsl_cheb_alloc(cs->order);
       retval = Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_cheb_free, deriv);
       break;
     case 2:
-      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[0])));
-      if (!rb_obj_is_kind_of(argv[1], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[1])));
+      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
+        rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
+      if (!rb_obj_is_kind_of(argv[1], cgsl_cheb))
+        rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
       Data_Get_Struct(argv[1], gsl_cheb_series, cs);
       retval = argv[0];
@@ -443,9 +432,9 @@ static VALUE rb_gsl_cheb_calc_deriv(int argc, VALUE *argv, VALUE obj)
       retval = Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_cheb_free, deriv);
       break;
     case 1:
-      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[0])));
+      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
+        rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
       retval = argv[0];
       break;
@@ -469,20 +458,20 @@ static VALUE rb_gsl_cheb_calc_integ(int argc, VALUE *argv, VALUE obj)
   case T_OBJECT:
     switch (argc) {
     case 1:
-      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[0])));
+      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
+        rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_cheb_series, cs);
       deriv = gsl_cheb_alloc(cs->order);
       retval = Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_cheb_free, deriv);
       break;
     case 2:
-      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[0])));
-      if (!rb_obj_is_kind_of(argv[1], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[1])));
+      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
+        rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
+      if (!rb_obj_is_kind_of(argv[1], cgsl_cheb))
+        rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
       Data_Get_Struct(argv[1], gsl_cheb_series, cs);
       retval = argv[0];
@@ -500,9 +489,9 @@ static VALUE rb_gsl_cheb_calc_integ(int argc, VALUE *argv, VALUE obj)
       retval = Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_cheb_free, deriv);
       break;
     case 1:
-      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb)) 
-	rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
-		 rb_class2name(CLASS_OF(argv[0])));
+      if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
+        rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
       retval = argv[0];
       break;
diff --git a/ext/gsl/combination.c b/ext/gsl_native/combination.c
similarity index 95%
rename from ext/gsl/combination.c
rename to ext/gsl_native/combination.c
index b95d781..c3b939c 100644
--- a/ext/gsl/combination.c
+++ b/ext/gsl_native/combination.c
@@ -9,7 +9,6 @@
   WITHOUT ANY WARRANTY.
 */
 
-#ifdef GSL_1_1_LATER
 #include "include/rb_gsl_common.h"
 #include "include/rb_gsl_array.h"
 
@@ -18,7 +17,7 @@ static VALUE cgsl_combination_data;
 static VALUE rb_gsl_combination_new(VALUE klass, VALUE n, VALUE k)
 {
   gsl_combination *c = NULL;
-  CHECK_FIXNUM(n);CHECK_FIXNUM(k);
+  CHECK_FIXNUM(n); CHECK_FIXNUM(k);
   c = gsl_combination_alloc(FIX2INT(n), FIX2INT(k));
   return Data_Wrap_Struct(klass, 0, gsl_combination_free, c);
 }
@@ -26,7 +25,7 @@ static VALUE rb_gsl_combination_new(VALUE klass, VALUE n, VALUE k)
 static VALUE rb_gsl_combination_calloc(VALUE klass, VALUE n, VALUE k)
 {
   gsl_combination *c = NULL;
-  CHECK_FIXNUM(n);CHECK_FIXNUM(k);
+  CHECK_FIXNUM(n); CHECK_FIXNUM(k);
   c = gsl_combination_calloc(FIX2INT(n), FIX2INT(k));
   return Data_Wrap_Struct(klass, 0, gsl_combination_free, c);
 }
@@ -47,18 +46,16 @@ static VALUE rb_gsl_combination_init_last(VALUE obj)
   return obj;
 }
 
-#ifdef GSL_1_4_LATER
 /* singleton */
 static VALUE rb_gsl_combination_memcpy(VALUE klass, VALUE dst, VALUE src)
 {
   gsl_combination *c, *c2;
   if (!rb_obj_is_kind_of(dst, klass))
     rb_raise(rb_eTypeError, "wrong argument type %s (Combination expected)",
-	     rb_class2name(CLASS_OF(dst)));
+             rb_class2name(CLASS_OF(dst)));
   if (!rb_obj_is_kind_of(src, klass))
     rb_raise(rb_eTypeError, "wrong argument type %s (Combination expected)",
-	     rb_class2name(CLASS_OF(src)));
-
+             rb_class2name(CLASS_OF(src)));
   Data_Get_Struct(dst, gsl_combination, c2);
   Data_Get_Struct(src, gsl_combination, c);
   gsl_combination_memcpy(c2, c);
@@ -73,7 +70,6 @@ static VALUE rb_gsl_combination_clone(VALUE obj)
   gsl_combination_memcpy(c2, c);
   return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_combination_free, c2);
 }
-#endif
 
 static VALUE rb_gsl_combination_get(VALUE obj, VALUE ii)
 {
@@ -182,9 +178,8 @@ static VALUE rb_gsl_combination_fprintf(int argc, VALUE *argv, VALUE obj)
   FILE *fp = NULL;
   int status, flag = 0;
 
-  if (argc != 1 && argc != 2) rb_raise(rb_eArgError, 
-				       "wrong number of arguments (%d for 1 or 2)", argc);
-
+  if (argc != 1 && argc != 2) rb_raise(rb_eArgError,
+                                       "wrong number of arguments (%d for 1 or 2)", argc);
   Data_Get_Struct(obj, gsl_combination, h);
   fp = rb_gsl_open_writefile(argv[0], &flag);
   switch (argc) {
@@ -246,17 +241,15 @@ void Init_gsl_combination(VALUE module)
 {
   VALUE cgsl_combination;
   cgsl_combination = rb_define_class_under(module, "Combination", cGSL_Object);
-  cgsl_combination_data = rb_define_class_under(cgsl_combination, "Data", 
-						cgsl_permutation);
+  cgsl_combination_data = rb_define_class_under(cgsl_combination, "Data",
+                                                cgsl_permutation);
   rb_define_singleton_method(cgsl_combination, "new", rb_gsl_combination_new, 2);
   rb_define_singleton_method(cgsl_combination, "alloc", rb_gsl_combination_new, 2);
   rb_define_singleton_method(cgsl_combination, "calloc", rb_gsl_combination_calloc, 2);
   rb_define_method(cgsl_combination, "init_first", rb_gsl_combination_init_first, 0);
   rb_define_method(cgsl_combination, "init_last", rb_gsl_combination_init_last, 0);
-#ifdef GSL_1_4_LATER
   rb_define_singleton_method(cgsl_combination, "memcpy", rb_gsl_combination_memcpy, 2);
   rb_define_method(cgsl_combination, "clone", rb_gsl_combination_clone, 0);
-#endif
   rb_define_method(cgsl_combination, "get", rb_gsl_combination_get, 1);
   rb_define_alias(cgsl_combination, "[]", "get");
   rb_define_method(cgsl_combination, "set", rb_gsl_combination_set, 2);
@@ -279,4 +272,4 @@ void Init_gsl_combination(VALUE module)
   rb_define_method(cgsl_combination, "equal?", rb_gsl_combination_equal, 1);
   rb_define_alias(cgsl_combination, "==", "equal?");
 }
-#endif
+
diff --git a/ext/gsl/common.c b/ext/gsl_native/common.c
similarity index 91%
rename from ext/gsl/common.c
rename to ext/gsl_native/common.c
index 572552c..5eea645 100644
--- a/ext/gsl/common.c
+++ b/ext/gsl_native/common.c
@@ -16,11 +16,7 @@
 
 FILE* rb_gsl_open_writefile(VALUE io, int *flag)
 {
-#ifdef HAVE_RUBY_IO_H
   rb_io_t *fptr = NULL;
-#else
-  OpenFile *fptr = NULL;
-#endif
   FILE *fp = NULL;
   char *name;
   switch (TYPE(io)) {
@@ -31,19 +27,8 @@ FILE* rb_gsl_open_writefile(VALUE io, int *flag)
     break;
   case T_FILE:
     GetOpenFile(io, fptr);
-    /*
-#ifdef HAVE_RUBY_IO_H
-    name = STR2CSTR(fptr->pathv);
-#else
-    name = fptr->path;
-#endif
-    */
     rb_io_check_writable(fptr);
-#ifdef HAVE_RUBY_IO_H
     fp = rb_io_stdio_file(fptr);
-#else
-    fp = GetWriteFile(fptr);
-#endif
     *flag = 0;
     break;
   default:
@@ -57,11 +42,7 @@ FILE* rb_gsl_open_writefile(VALUE io, int *flag)
 
 FILE* rb_gsl_open_readfile(VALUE io, int *flag)
 {
-#ifdef HAVE_RUBY_IO_H
   rb_io_t *fptr = NULL;
-#else
-  OpenFile *fptr = NULL;
-#endif
   FILE *fp = NULL;
   char *name;
   switch (TYPE(io)) {
@@ -72,19 +53,8 @@ FILE* rb_gsl_open_readfile(VALUE io, int *flag)
     break;
   case T_FILE:
     GetOpenFile(io, fptr);
-    /*
-#ifdef HAVE_RUBY_IO_H
-    name = STR2CSTR(fptr->pathv);
-#else
-    name = fptr->path;
-#endif
-    */
     rb_io_check_readable(fptr);
-#ifdef HAVE_RUBY_IO_H
     fp = rb_io_stdio_file(fptr);
-#else
-    fp = fptr->f;
-#endif
     *flag = 0;
     break;
   default:
@@ -136,8 +106,8 @@ size_t count_columns(const char *str)
       flag = 1;
     } else {
       if (flag == 1) {
-	flag = 0;
-	n++;
+        flag = 0;
+        n++;
       }
     }
     p++;
@@ -156,9 +126,9 @@ char* str_scan_double(const char *str, double *val)
   do {
     if (isspace(*p)) {
       if (flag == 0) {
-	/* do nothing */
+        /* do nothing */
       } else {
-	break;
+        break;
       }
     } else {
       *q++ = *p;
@@ -192,9 +162,9 @@ char* str_scan_int(const char *str, int *val)
   do {
     if (isspace(*p)) {
       if (flag == 0) {
-	/* do nothing */
+        /* do nothing */
       } else {
-	break;
+        break;
       }
     } else {
       *q++ = *p;
@@ -255,7 +225,7 @@ gsl_complex ary2complex(VALUE obj)
       c = *z;
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Array or Complex expected)",
-	       rb_class2name(CLASS_OF(obj)));
+               rb_class2name(CLASS_OF(obj)));
     }
     break;
   }
diff --git a/ext/gsl/complex.c b/ext/gsl_native/complex.c
similarity index 84%
rename from ext/gsl/complex.c
rename to ext/gsl_native/complex.c
index 6e78567..40b1ac5 100644
--- a/ext/gsl/complex.c
+++ b/ext/gsl_native/complex.c
@@ -31,11 +31,9 @@ gsl_complex rb_gsl_obj_to_gsl_complex(VALUE obj, gsl_complex *z)
     z = &tmp;
     GSL_SET_COMPLEX(z, 0.0, 0.0);
   }
-
   if(obj == Qnil) {
     return *z;
   }
-
   switch(TYPE(obj)) {
   case T_ARRAY:
     vre = rb_ary_entry(obj,0);
@@ -54,8 +52,8 @@ gsl_complex rb_gsl_obj_to_gsl_complex(VALUE obj, gsl_complex *z)
       *z = *zz;
     } else {
       rb_raise(rb_eTypeError,
-          "wrong type %s, (nil, Array, Float, Integer, or GSL::Complex expected)",
-          rb_class2name(CLASS_OF(obj)));
+               "wrong type %s, (nil, Array, Float, Integer, or GSL::Complex expected)",
+               rb_class2name(CLASS_OF(obj)));
     }
     break;
   }
@@ -66,7 +64,7 @@ static VALUE rb_gsl_complex_new(int argc, VALUE *argv, VALUE klass)
 {
   gsl_complex *c = NULL;
   VALUE obj;
-  obj = Data_Make_Struct(klass, gsl_complex, 0, free, c); 
+  obj = Data_Make_Struct(klass, gsl_complex, 0, free, c);
   switch (argc) {
   case 1:
     switch (TYPE(argv[0])) {
@@ -80,8 +78,8 @@ static VALUE rb_gsl_complex_new(int argc, VALUE *argv, VALUE klass)
       *c = gsl_complex_rect(NUM2DBL(argv[0]), 0.0);
       break;
     default:
-      rb_raise(rb_eTypeError, "wrong argument type %s", 
-	       rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError, "wrong argument type %s",
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   case 2:
@@ -107,7 +105,7 @@ static VALUE rb_gsl_complex_polar(VALUE klass, VALUE r, VALUE theta)
   VALUE obj;
   gsl_complex *c = NULL;
   Need_Float(r); Need_Float(theta);
-  obj = Data_Make_Struct(klass, gsl_complex, 0, free, c); 
+  obj = Data_Make_Struct(klass, gsl_complex, 0, free, c);
   *c = gsl_complex_polar(NUM2DBL(r), NUM2DBL(theta));
   return obj;
 }
@@ -121,10 +119,10 @@ static VALUE rb_gsl_complex_get(VALUE obj, VALUE ii)
   i = FIX2INT(ii);
   switch (i) {
   case 0:
-    return  rb_float_new(GSL_REAL(*c));
+    return rb_float_new(GSL_REAL(*c));
     break;
   case 1:
-    return  rb_float_new(GSL_IMAG(*c));
+    return rb_float_new(GSL_IMAG(*c));
     break;
   default:
     rb_raise(rb_eArgError, "wrong argument (%d for 0 or 1)", i);
@@ -137,14 +135,14 @@ static VALUE rb_gsl_complex_real(VALUE obj)
 {
   gsl_complex *c = NULL;
   Data_Get_Struct(obj, gsl_complex, c);
-  return  rb_float_new(GSL_REAL(*c));
+  return rb_float_new(GSL_REAL(*c));
 }
 
 static VALUE rb_gsl_complex_imag(VALUE obj)
 {
   gsl_complex *c = NULL;
   Data_Get_Struct(obj, gsl_complex, c);
-  return  rb_float_new(GSL_IMAG(*c));
+  return rb_float_new(GSL_IMAG(*c));
 }
 
 static VALUE rb_gsl_complex_print(VALUE obj)
@@ -172,7 +170,7 @@ static VALUE rb_gsl_complex_return_double(double (*func)(gsl_complex), VALUE obj
 {
   gsl_complex *c = NULL;
   Data_Get_Struct(obj, gsl_complex, c);
-  return  rb_float_new((*func)(*c));
+  return rb_float_new((*func)(*c));
 }
 
 static VALUE rb_gsl_complex_arg(VALUE obj)
@@ -196,10 +194,10 @@ static VALUE rb_gsl_complex_logabs(VALUE obj)
 }
 
 static VALUE rb_gsl_complex_arithmetics2(gsl_complex (*func)(gsl_complex, double),
-					 VALUE obj, VALUE xx);
+                                         VALUE obj, VALUE xx);
 
 static VALUE rb_gsl_complex_arithmetics2(gsl_complex (*func)(gsl_complex, double),
-					VALUE obj, VALUE xx)
+                                         VALUE obj, VALUE xx)
 {
   gsl_complex *a = NULL, *c = NULL, tmp;
   VALUE obj2;
@@ -208,7 +206,7 @@ static VALUE rb_gsl_complex_arithmetics2(gsl_complex (*func)(gsl_complex, double
   Data_Get_Struct(obj, gsl_complex, a);
   x = NUM2DBL(xx);
   tmp = (*func)(*a, x);
-  obj2 = Data_Make_Struct(cgsl_complex, gsl_complex, 0, free, c); 
+  obj2 = Data_Make_Struct(cgsl_complex, gsl_complex, 0, free, c);
   *c = tmp;
   return obj2;
 }
@@ -262,7 +260,7 @@ static VALUE rb_gsl_complex_operate(gsl_complex (*func)(gsl_complex), VALUE obj)
   Data_Get_Struct(obj, gsl_complex, c);
   cnew = ALLOC(gsl_complex);
   *cnew = (*func)(*c);
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_operate2(gsl_complex (*func)(gsl_complex), int argc, VALUE *argv, VALUE obj)
@@ -279,33 +277,33 @@ static VALUE rb_gsl_complex_operate2(gsl_complex (*func)(gsl_complex), int argc,
     case 1:
       switch (TYPE(argv[0])) {
       case T_ARRAY:
-	tmp = ary2complex(argv[0]);
-	c = &tmp;
-	break;
+        tmp = ary2complex(argv[0]);
+        c = &tmp;
+        break;
       default:
-	if (VECTOR_COMPLEX_P(argv[0])) {
-	  Data_Get_Struct(argv[0], gsl_vector_complex, v);
-	  vnew = gsl_vector_complex_alloc(v->size);
-	  for (i = 0; i < v->size; i++) {
-	    c = GSL_COMPLEX_AT(v, i);
-	    gsl_vector_complex_set(vnew, i, (*func)(*c));
-	  }
-	  return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_free, vnew);
-	} else if (MATRIX_COMPLEX_P(obj)) {
-	  Data_Get_Struct(obj, gsl_matrix_complex, m);
-	  mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
-	  for (i = 0; i < m->size1; i++) {
-	    for (j = 0; j < m->size2; j++) {
-	      gsl_matrix_complex_set(mnew, i, j, 
-				     (*func)(gsl_matrix_complex_get(m, i, j)));
-	    }
-	  }
-	  return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
-	} else {
-	  CHECK_COMPLEX(argv[0]);
-	  Data_Get_Struct(argv[0], gsl_complex, c);
-	}
-	break;
+        if (VECTOR_COMPLEX_P(argv[0])) {
+          Data_Get_Struct(argv[0], gsl_vector_complex, v);
+          vnew = gsl_vector_complex_alloc(v->size);
+          for (i = 0; i < v->size; i++) {
+            c = GSL_COMPLEX_AT(v, i);
+            gsl_vector_complex_set(vnew, i, (*func)(*c));
+          }
+          return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_free, vnew);
+        } else if (MATRIX_COMPLEX_P(obj)) {
+          Data_Get_Struct(obj, gsl_matrix_complex, m);
+          mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
+          for (i = 0; i < m->size1; i++) {
+            for (j = 0; j < m->size2; j++) {
+              gsl_matrix_complex_set(mnew, i, j,
+                                     (*func)(gsl_matrix_complex_get(m, i, j)));
+            }
+          }
+          return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
+        } else {
+          CHECK_COMPLEX(argv[0]);
+          Data_Get_Struct(argv[0], gsl_complex, c);
+        }
+        break;
       }
       break;
     case 2:
@@ -324,7 +322,7 @@ static VALUE rb_gsl_complex_operate2(gsl_complex (*func)(gsl_complex), int argc,
   }
   cnew = ALLOC(gsl_complex);
   *cnew = (*func)(*c);
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_conjugate(VALUE obj)
@@ -350,7 +348,7 @@ static VALUE rb_gsl_complex_sqrt_real(VALUE obj, VALUE x)
   tmp = gsl_complex_sqrt_real(NUM2DBL(x));
   cnew = ALLOC(gsl_complex);
   *cnew = tmp;
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_sqrt(int argc, VALUE *argv, VALUE obj)
@@ -362,22 +360,22 @@ static VALUE rb_gsl_complex_sqrt(int argc, VALUE *argv, VALUE obj)
     case 1:
       switch (TYPE(argv[0])) {
       case T_FIXNUM: case T_FLOAT:
-	return rb_gsl_complex_sqrt_real(obj, argv[0]);
-	break;
+        return rb_gsl_complex_sqrt_real(obj, argv[0]);
+        break;
       case T_ARRAY:
-	tmp = ary2complex(argv[0]);
-	z = ALLOC(gsl_complex);
-	*z = gsl_complex_sqrt(tmp);
-	return Data_Wrap_Struct(cgsl_complex, 0, free, z);
-	break;
+        tmp = ary2complex(argv[0]);
+        z = ALLOC(gsl_complex);
+        *z = gsl_complex_sqrt(tmp);
+        return Data_Wrap_Struct(cgsl_complex, 0, free, z);
+        break;
       default:
-	CHECK_COMPLEX(argv[0]);
-	Data_Get_Struct(argv[0], gsl_complex, z);
-	tmp = *z;
-	z = ALLOC(gsl_complex);
-	*z = gsl_complex_sqrt(tmp);
-	return Data_Wrap_Struct(cgsl_complex, 0, free, z);      
-	break;
+        CHECK_COMPLEX(argv[0]);
+        Data_Get_Struct(argv[0], gsl_complex, z);
+        tmp = *z;
+        z = ALLOC(gsl_complex);
+        *z = gsl_complex_sqrt(tmp);
+        return Data_Wrap_Struct(cgsl_complex, 0, free, z);
+        break;
       }
       break;
     case 2:
@@ -385,7 +383,7 @@ static VALUE rb_gsl_complex_sqrt(int argc, VALUE *argv, VALUE obj)
       GSL_SET_REAL(&tmp, NUM2DBL(argv[0]));
       GSL_SET_IMAG(&tmp, NUM2DBL(argv[1]));
       *z = gsl_complex_sqrt(tmp);
-      return Data_Wrap_Struct(cgsl_complex, 0, free, z);     
+      return Data_Wrap_Struct(cgsl_complex, 0, free, z);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
@@ -408,14 +406,14 @@ VALUE rb_gsl_complex_pow(int argc, VALUE *argv, VALUE obj)
   case T_MODULE:
   case T_CLASS:
   case T_OBJECT:
-    if (argc != 2) 
+    if (argc != 2)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
     switch (TYPE(argv[1])) {
     case T_ARRAY:
       tmpa = ary2complex(argv[1]);
       a = &tmpa;
       break;
-    case T_FLOAT: case T_FIXNUM: 
+    case T_FLOAT: case T_FIXNUM:
       return rb_gsl_complex_pow_real(argc, argv, obj);
       break;
     default:
@@ -431,24 +429,24 @@ VALUE rb_gsl_complex_pow(int argc, VALUE *argv, VALUE obj)
       break;
     default:
       if (VECTOR_COMPLEX_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_vector_complex, v);
-	vnew = gsl_vector_complex_alloc(v->size);
-	for (i = 0; i < v->size; i++) {
-	  c = GSL_COMPLEX_AT(v, i);
-	  gsl_vector_complex_set(vnew, i, gsl_complex_pow(*c, *a));
-	}
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
+        Data_Get_Struct(argv[0], gsl_vector_complex, v);
+        vnew = gsl_vector_complex_alloc(v->size);
+        for (i = 0; i < v->size; i++) {
+          c = GSL_COMPLEX_AT(v, i);
+          gsl_vector_complex_set(vnew, i, gsl_complex_pow(*c, *a));
+        }
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
       }
       if (MATRIX_COMPLEX_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_matrix_complex, m);
-	mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
-	for (i = 0; i < m->size1; i++) {
-	  for (j = 0; j < m->size2; j++) {
-	    c = gsl_matrix_complex_ptr(m, i, j);
-	    gsl_matrix_complex_set(mnew, i, j, gsl_complex_pow(*c, *a));
-	  }
-	}
-	return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
+        Data_Get_Struct(argv[0], gsl_matrix_complex, m);
+        mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
+        for (i = 0; i < m->size1; i++) {
+          for (j = 0; j < m->size2; j++) {
+            c = gsl_matrix_complex_ptr(m, i, j);
+            gsl_matrix_complex_set(mnew, i, j, gsl_complex_pow(*c, *a));
+          }
+        }
+        return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
       }
       CHECK_COMPLEX(argv[0]);
       Data_Get_Struct(argv[0], gsl_complex, c);
@@ -457,7 +455,7 @@ VALUE rb_gsl_complex_pow(int argc, VALUE *argv, VALUE obj)
 
     break;
   default:
-    if (argc != 1) 
+    if (argc != 1)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     CHECK_COMPLEX(obj);
     Data_Get_Struct(obj, gsl_complex, c);
@@ -466,7 +464,7 @@ VALUE rb_gsl_complex_pow(int argc, VALUE *argv, VALUE obj)
       tmpa = ary2complex(argv[0]);
       a = &tmpa;
       break;
-    case T_FLOAT: case T_FIXNUM: 
+    case T_FLOAT: case T_FIXNUM:
       return rb_gsl_complex_pow_real(argc, argv, obj);
       break;
     default:
@@ -478,7 +476,7 @@ VALUE rb_gsl_complex_pow(int argc, VALUE *argv, VALUE obj)
   }
   cnew = ALLOC(gsl_complex);
   *cnew = gsl_complex_pow(*c, *a);
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 VALUE rb_gsl_complex_pow_real(int argc, VALUE *argv, VALUE obj)
@@ -492,7 +490,7 @@ VALUE rb_gsl_complex_pow_real(int argc, VALUE *argv, VALUE obj)
   case T_MODULE:
   case T_CLASS:
   case T_OBJECT:
-    if (argc != 2) 
+    if (argc != 2)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
     switch (TYPE(argv[0])) {
     case T_ARRAY:
@@ -502,26 +500,26 @@ VALUE rb_gsl_complex_pow_real(int argc, VALUE *argv, VALUE obj)
       break;
     default:
       if (VECTOR_COMPLEX_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_vector_complex, v);
-	vnew = gsl_vector_complex_alloc(v->size);
-	a = NUM2DBL(argv[1]);
-	for (i = 0; i < v->size; i++) {
-	  c = GSL_COMPLEX_AT(v, i);
-	  tmpc = gsl_complex_pow_real(*c, a);
-	  gsl_vector_complex_set(vnew, i, tmpc);
-	}
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_free, vnew);
+        Data_Get_Struct(argv[0], gsl_vector_complex, v);
+        vnew = gsl_vector_complex_alloc(v->size);
+        a = NUM2DBL(argv[1]);
+        for (i = 0; i < v->size; i++) {
+          c = GSL_COMPLEX_AT(v, i);
+          tmpc = gsl_complex_pow_real(*c, a);
+          gsl_vector_complex_set(vnew, i, tmpc);
+        }
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_free, vnew);
       }
       if (MATRIX_COMPLEX_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_matrix_complex, m);
-	mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
-	for (i = 0; i < m->size1; i++) {
-	  for (j = 0; j < m->size2; j++) {
-	    tmpc = gsl_complex_pow_real(gsl_matrix_complex_get(m, i, j), a);
-	    gsl_matrix_complex_set(mnew, i, j, tmpc);
-	  }
-	}
-	return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
+        Data_Get_Struct(argv[0], gsl_matrix_complex, m);
+        mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
+        for (i = 0; i < m->size1; i++) {
+          for (j = 0; j < m->size2; j++) {
+            tmpc = gsl_complex_pow_real(gsl_matrix_complex_get(m, i, j), a);
+            gsl_matrix_complex_set(mnew, i, j, tmpc);
+          }
+        }
+        return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
       }
       CHECK_COMPLEX(argv[0]);
       Data_Get_Struct(argv[0], gsl_complex, c);
@@ -531,7 +529,7 @@ VALUE rb_gsl_complex_pow_real(int argc, VALUE *argv, VALUE obj)
     a = NUM2DBL(argv[1]);
     break;
   default:
-    if (argc != 1) 
+    if (argc != 1)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     CHECK_COMPLEX(obj);
     Need_Float(argv[0]);
@@ -541,7 +539,7 @@ VALUE rb_gsl_complex_pow_real(int argc, VALUE *argv, VALUE obj)
   }
   cnew = ALLOC(gsl_complex);
   *cnew = gsl_complex_pow_real(*c, a);
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_exp(int argc, VALUE *argv, VALUE obj)
@@ -566,7 +564,7 @@ static VALUE rb_gsl_complex_log_b(int argc, VALUE *argv, VALUE obj)
   case T_MODULE:
   case T_CLASS:
   case T_OBJECT:
-    if (argc != 2) 
+    if (argc != 2)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
     switch (TYPE(argv[1])) {
     case T_ARRAY:
@@ -592,7 +590,7 @@ static VALUE rb_gsl_complex_log_b(int argc, VALUE *argv, VALUE obj)
 
     break;
   default:
-    if (argc != 1) 
+    if (argc != 1)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     CHECK_COMPLEX(obj);
     Data_Get_Struct(obj, gsl_complex, c);
@@ -610,7 +608,7 @@ static VALUE rb_gsl_complex_log_b(int argc, VALUE *argv, VALUE obj)
   }
   cnew = ALLOC(gsl_complex);
   *cnew = gsl_complex_log_b(*c, *a);
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_sin(int argc, VALUE *argv, VALUE obj)
@@ -658,7 +656,7 @@ static VALUE rb_gsl_complex_arcsin_real(VALUE obj, VALUE xx)
   tmp = gsl_complex_arcsin_real(x);
   cnew = ALLOC(gsl_complex);
   *cnew = tmp;
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_arccos(int argc, VALUE *argv, VALUE obj)
@@ -675,7 +673,7 @@ static VALUE rb_gsl_complex_arccos_real(VALUE obj, VALUE xx)
   tmp = gsl_complex_arccos_real(x);
   cnew = ALLOC(gsl_complex);
   *cnew = tmp;
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_arctan(int argc, VALUE *argv, VALUE obj)
@@ -697,7 +695,7 @@ static VALUE rb_gsl_complex_arcsec_real(VALUE obj, VALUE xx)
   tmp = gsl_complex_arcsec_real(x);
   cnew = ALLOC(gsl_complex);
   *cnew = tmp;
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_arccsc(int argc, VALUE *argv, VALUE obj)
@@ -714,7 +712,7 @@ static VALUE rb_gsl_complex_arccsc_real(VALUE obj, VALUE xx)
   tmp = gsl_complex_arccsc_real(x);
   cnew = ALLOC(gsl_complex);
   *cnew = tmp;
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_arccot(int argc, VALUE *argv, VALUE obj)
@@ -766,7 +764,7 @@ static VALUE rb_gsl_complex_arccosh_real(VALUE obj, VALUE xx)
   tmp = gsl_complex_arccosh_real(x);
   cnew = ALLOC(gsl_complex);
   *cnew = tmp;
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_arccosh(int argc, VALUE *argv, VALUE obj)
@@ -788,7 +786,7 @@ static VALUE rb_gsl_complex_arctanh_real(VALUE obj, VALUE xx)
   tmp = gsl_complex_arctanh_real(x);
   cnew = ALLOC(gsl_complex);
   *cnew = tmp;
-  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew); 
+  return Data_Wrap_Struct(cgsl_complex, 0, free, cnew);
 }
 
 static VALUE rb_gsl_complex_arcsech(int argc, VALUE *argv, VALUE obj)
@@ -807,10 +805,10 @@ static VALUE rb_gsl_complex_arccoth(int argc, VALUE *argv, VALUE obj)
 }
 
 int rbgsl_complex_equal(const gsl_complex *z1, const gsl_complex *z2,
-      double eps)
+                        double eps)
 {
   if (gsl_fcmp(z1->dat[0], z2->dat[0], eps) != 0) return 0;
-  if (gsl_fcmp(z1->dat[1], z2->dat[1], eps) != 0) return 0;  
+  if (gsl_fcmp(z1->dat[1], z2->dat[1], eps) != 0) return 0;
   return 1;
 }
 
@@ -825,11 +823,11 @@ static VALUE rb_gsl_complex_equal(int argc, VALUE *argv, VALUE obj)
 {
   gsl_complex *z1 = NULL, *z2 = NULL;
   double eps = 1e-8;
-  
+
   switch (argc) {
   case 1:
     CHECK_COMPLEX(argv[0]);
-    Data_Get_Struct(argv[0], gsl_complex, z2);      
+    Data_Get_Struct(argv[0], gsl_complex, z2);
     break;
   case 2:
     CHECK_COMPLEX(argv[0]);
diff --git a/ext/gsl_native/const.c b/ext/gsl_native/const.c
new file mode 100644
index 0000000..6dd67d3
--- /dev/null
+++ b/ext/gsl_native/const.c
@@ -0,0 +1,331 @@
+/*
+  const.c
+  Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
+    (C) Copyright 2001-2006 by Yoshiki Tsunesada
+
+  Ruby/GSL is free software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License.
+  This library is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY.
+*/
+
+#include "include/rb_gsl_const.h"
+
+static void rb_gsl_const_mks(VALUE module);
+static void rb_gsl_const_cgs(VALUE module);
+static void rb_gsl_const_num(VALUE module);
+void Init_gsl_const_additional(VALUE mmks, VALUE mcgs, VALUE mnum);
+
+static void rb_gsl_const_mks(VALUE module)
+{
+  rb_define_const(module, "SPEED_OF_LIGHT",
+                  rb_float_new(GSL_CONST_MKSA_SPEED_OF_LIGHT));
+  rb_define_const(module, "GRAVITATIONAL_CONSTANT",
+                  rb_float_new(GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT));
+  rb_define_const(module, "PLANCKS_CONSTANT_H",
+                  rb_float_new(GSL_CONST_MKSA_PLANCKS_CONSTANT_H));
+  rb_define_const(module, "PLANCKS_CONSTANT_HBAR",
+                  rb_float_new(GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR));
+  rb_define_const(module, "VACUUM_PERMEABILITY",
+                  rb_float_new(GSL_CONST_MKSA_VACUUM_PERMEABILITY));
+  rb_define_const(module, "VACUUM_PERMITTIVITY",
+                  rb_float_new(GSL_CONST_MKSA_VACUUM_PERMITTIVITY));
+  rb_define_const(module, "ASTRONOMICAL_UNIT",
+                  rb_float_new(GSL_CONST_MKSA_ASTRONOMICAL_UNIT));
+  rb_define_const(module, "LIGHT_YEAR", rb_float_new(GSL_CONST_MKSA_LIGHT_YEAR));
+  rb_define_const(module, "PARSEC", rb_float_new(GSL_CONST_MKSA_PARSEC));
+  rb_define_const(module, "GRAV_ACCEL", rb_float_new(GSL_CONST_MKSA_GRAV_ACCEL));
+  rb_define_const(module, "ELECTRON_VOLT",
+                  rb_float_new(GSL_CONST_MKSA_ELECTRON_VOLT));
+  rb_define_const(module, "MASS_ELECTRON",
+                  rb_float_new(GSL_CONST_MKSA_MASS_ELECTRON));
+  rb_define_const(module, "MASS_MUON", rb_float_new(GSL_CONST_MKSA_MASS_MUON));
+  rb_define_const(module, "MASS_PROTON", rb_float_new(GSL_CONST_MKSA_MASS_PROTON));
+  rb_define_const(module, "MASS_NEUTRON", rb_float_new(GSL_CONST_MKSA_MASS_NEUTRON));
+  rb_define_const(module, "RYDBERG", rb_float_new(GSL_CONST_MKSA_RYDBERG));
+  rb_define_const(module, "BOHR_MAGNETON",
+                  rb_float_new(GSL_CONST_MKSA_BOHR_MAGNETON));
+  rb_define_const(module, "NUCLEAR_MAGNETON",
+                  rb_float_new(GSL_CONST_MKSA_NUCLEAR_MAGNETON));
+  rb_define_const(module, "ELECTRON_MAGNETIC_MOMENT",
+                  rb_float_new(GSL_CONST_MKSA_ELECTRON_MAGNETIC_MOMENT));
+  rb_define_const(module, "PROTON_MAGNETIC_MOMENT",
+                  rb_float_new(GSL_CONST_MKSA_PROTON_MAGNETIC_MOMENT));
+  rb_define_const(module, "STANDARD_GAS_VOLUME",
+                  rb_float_new(GSL_CONST_MKSA_STANDARD_GAS_VOLUME));
+
+  rb_define_const(module, "MINUTE", rb_float_new(GSL_CONST_MKSA_MINUTE));
+  rb_define_const(module, "HOUR", rb_float_new(GSL_CONST_MKSA_HOUR));
+  rb_define_const(module, "DAY", rb_float_new(GSL_CONST_MKSA_DAY));
+  rb_define_const(module, "WEEK", rb_float_new(GSL_CONST_MKSA_WEEK));
+  rb_define_const(module, "INCH", rb_float_new(GSL_CONST_MKSA_INCH));
+  rb_define_const(module, "FOOT", rb_float_new(GSL_CONST_MKSA_FOOT));
+  rb_define_const(module, "YARD", rb_float_new(GSL_CONST_MKSA_YARD));
+  rb_define_const(module, "MILE", rb_float_new(GSL_CONST_MKSA_MILE));
+  rb_define_const(module, "NAUTICAL_MILE",
+                  rb_float_new(GSL_CONST_MKSA_NAUTICAL_MILE));
+  rb_define_const(module, "FATHOM", rb_float_new(GSL_CONST_MKSA_FATHOM));
+  rb_define_const(module, "MIL", rb_float_new(GSL_CONST_MKSA_MIL));
+  rb_define_const(module, "POINT", rb_float_new(GSL_CONST_MKSA_POINT));
+  rb_define_const(module, "TEXPOINT", rb_float_new(GSL_CONST_MKSA_TEXPOINT));
+  rb_define_const(module, "MICRON", rb_float_new(GSL_CONST_MKSA_MICRON));
+  rb_define_const(module, "ANGSTROM", rb_float_new(GSL_CONST_MKSA_ANGSTROM));
+  rb_define_const(module, "HECTARE", rb_float_new(GSL_CONST_MKSA_HECTARE));
+  rb_define_const(module, "ACRE", rb_float_new(GSL_CONST_MKSA_ACRE));
+  rb_define_const(module, "BARN", rb_float_new(GSL_CONST_MKSA_BARN));
+  rb_define_const(module, "LITER", rb_float_new(GSL_CONST_MKSA_LITER));
+  rb_define_const(module, "US_GALLON", rb_float_new(GSL_CONST_MKSA_US_GALLON));
+  rb_define_const(module, "QUART", rb_float_new(GSL_CONST_MKSA_QUART));
+  rb_define_const(module, "PINT", rb_float_new(GSL_CONST_MKSA_PINT));
+  rb_define_const(module, "CUP", rb_float_new(GSL_CONST_MKSA_CUP));
+  rb_define_const(module, "FLUID_OUNCE", rb_float_new(GSL_CONST_MKSA_FLUID_OUNCE));
+  rb_define_const(module, "TABLESPOON", rb_float_new(GSL_CONST_MKSA_TABLESPOON));
+  rb_define_const(module, "CANADIAN_GALLON",
+                  rb_float_new(GSL_CONST_MKSA_CANADIAN_GALLON));
+
+  rb_define_const(module, "UK_GALLON", rb_float_new(GSL_CONST_MKSA_UK_GALLON));
+  rb_define_const(module, "KILOMETERS_PER_HOUR",
+                  rb_float_new(GSL_CONST_MKSA_MILES_PER_HOUR));
+  rb_define_const(module, "MILES_PER_HOUR",
+                  rb_float_new(GSL_CONST_MKSA_KILOMETERS_PER_HOUR));
+  rb_define_const(module, "KNOT", rb_float_new(GSL_CONST_MKSA_KNOT));
+  rb_define_const(module, "POUND_MASS", rb_float_new(GSL_CONST_MKSA_POUND_MASS));
+  rb_define_const(module, "POUND_OUNCE", rb_float_new(GSL_CONST_MKSA_OUNCE_MASS));
+  rb_define_const(module, "POUND_TON", rb_float_new(GSL_CONST_MKSA_TON));
+  rb_define_const(module, "POUND_METRIC_TON",
+                  rb_float_new(GSL_CONST_MKSA_METRIC_TON));
+  rb_define_const(module, "POUND_UK_TON", rb_float_new(GSL_CONST_MKSA_UK_TON));
+  rb_define_const(module, "POUND_TROY_OUNCE",
+                  rb_float_new(GSL_CONST_MKSA_TROY_OUNCE));
+  rb_define_const(module, "CARAT", rb_float_new(GSL_CONST_MKSA_CARAT));
+  rb_define_const(module, "UNIFIED_ATOMIC_MASS",
+                  rb_float_new(GSL_CONST_MKSA_UNIFIED_ATOMIC_MASS));
+  rb_define_const(module, "GRAM_FORCE", rb_float_new(GSL_CONST_MKSA_GRAM_FORCE));
+  rb_define_const(module, "POUND_FORCE", rb_float_new(GSL_CONST_MKSA_POUND_FORCE));
+  rb_define_const(module, "KILOPOUND_FORCE",
+                  rb_float_new(GSL_CONST_MKSA_KILOPOUND_FORCE));
+  rb_define_const(module, "POUNDAL", rb_float_new(GSL_CONST_MKSA_POUNDAL));
+  rb_define_const(module, "CALORIE", rb_float_new(GSL_CONST_MKSA_CALORIE));
+  rb_define_const(module, "BTU", rb_float_new(GSL_CONST_MKSA_BTU));
+  rb_define_const(module, "THERM", rb_float_new(GSL_CONST_MKSA_THERM));
+  rb_define_const(module, "HORSEPOWER", rb_float_new(GSL_CONST_MKSA_HORSEPOWER));
+  rb_define_const(module, "BAR", rb_float_new(GSL_CONST_MKSA_BAR));
+  rb_define_const(module, "STD_ATMOSPHERE",
+                  rb_float_new(GSL_CONST_MKSA_STD_ATMOSPHERE));
+  rb_define_const(module, "TORR", rb_float_new(GSL_CONST_MKSA_TORR));
+  rb_define_const(module, "METER_OF_MERCURY",
+                  rb_float_new(GSL_CONST_MKSA_METER_OF_MERCURY));
+  rb_define_const(module, "INCH_OF_MERCURY",
+                  rb_float_new(GSL_CONST_MKSA_INCH_OF_MERCURY));
+  rb_define_const(module, "INCH_OF_WATER",
+                  rb_float_new(GSL_CONST_MKSA_INCH_OF_WATER));
+  rb_define_const(module, "PSI", rb_float_new(GSL_CONST_MKSA_PSI));
+  rb_define_const(module, "POISE", rb_float_new(GSL_CONST_MKSA_POISE));
+  rb_define_const(module, "STOKES", rb_float_new(GSL_CONST_MKSA_STOKES));
+  rb_define_const(module, "FARADAY", rb_float_new(GSL_CONST_MKSA_FARADAY));
+  rb_define_const(module, "ELECTRON_CHARGE",
+                  rb_float_new(GSL_CONST_MKSA_ELECTRON_CHARGE));
+  rb_define_const(module, "GAUSS", rb_float_new(GSL_CONST_MKSA_GAUSS));
+  rb_define_const(module, "STILB", rb_float_new(GSL_CONST_MKSA_STILB));
+  rb_define_const(module, "LUMEN", rb_float_new(GSL_CONST_MKSA_LUMEN));
+  rb_define_const(module, "LUX", rb_float_new(GSL_CONST_MKSA_LUX));
+  rb_define_const(module, "PHOT", rb_float_new(GSL_CONST_MKSA_PHOT));
+  rb_define_const(module, "FOOTCANDLE", rb_float_new(GSL_CONST_MKSA_FOOTCANDLE));
+  rb_define_const(module, "LAMBERT", rb_float_new(GSL_CONST_MKSA_LAMBERT));
+  rb_define_const(module, "CURIE", rb_float_new(GSL_CONST_MKSA_CURIE));
+  rb_define_const(module, "ROENTGEN", rb_float_new(GSL_CONST_MKSA_ROENTGEN));
+  rb_define_const(module, "RAD", rb_float_new(GSL_CONST_MKSA_RAD));
+  rb_define_const(module, "SOLAR_MASS", rb_float_new(GSL_CONST_MKSA_SOLAR_MASS));
+
+  rb_define_const(module, "BOLTZMANN", rb_float_new(GSL_CONST_MKSA_BOLTZMANN));
+  rb_define_const(module, "MOLAR_GAS", rb_float_new(GSL_CONST_MKSA_MOLAR_GAS));
+
+  rb_define_const(module, "BOHR_RADIUS", rb_float_new(GSL_CONST_MKSA_BOHR_RADIUS));
+  rb_define_const(module, "NEWTON", rb_float_new(GSL_CONST_MKSA_NEWTON));
+  rb_define_const(module, "DYNE", rb_float_new(GSL_CONST_MKSA_DYNE));
+  rb_define_const(module, "JOULE", rb_float_new(GSL_CONST_MKSA_JOULE));
+  rb_define_const(module, "ERG", rb_float_new(GSL_CONST_MKSA_ERG));
+
+  rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT",
+                  rb_float_new(GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT));
+  rb_define_const(module, "THOMSON_CROSS_SECTION",
+                  rb_float_new(GSL_CONST_MKSA_THOMSON_CROSS_SECTION));
+  rb_define_const(module, "DEBYE", rb_float_new(GSL_CONST_MKSA_DEBYE));
+}
+
+
+static void rb_gsl_const_cgs(VALUE module)
+{
+  rb_define_const(module, "SPEED_OF_LIGHT",
+                  rb_float_new(GSL_CONST_CGSM_SPEED_OF_LIGHT));
+  rb_define_const(module, "GRAVITATIONAL_CONSTANT",
+                  rb_float_new(GSL_CONST_CGSM_GRAVITATIONAL_CONSTANT));
+  rb_define_const(module, "PLANCKS_CONSTANT_H",
+                  rb_float_new(GSL_CONST_CGSM_PLANCKS_CONSTANT_H));
+  rb_define_const(module, "PLANCKS_CONSTANT_HBAR",
+                  rb_float_new(GSL_CONST_CGSM_PLANCKS_CONSTANT_HBAR));
+  rb_define_const(module, "ASTRONOMICAL_UNIT",
+                  rb_float_new(GSL_CONST_CGSM_ASTRONOMICAL_UNIT));
+  rb_define_const(module, "LIGHT_YEAR",
+                  rb_float_new(GSL_CONST_CGSM_LIGHT_YEAR));
+  rb_define_const(module, "PARSEC",
+                  rb_float_new(GSL_CONST_CGSM_PARSEC));
+  rb_define_const(module, "GRAV_ACCEL",
+                  rb_float_new(GSL_CONST_CGSM_GRAV_ACCEL));
+  rb_define_const(module, "ELECTRON_VOLT",
+                  rb_float_new(GSL_CONST_CGSM_ELECTRON_VOLT));
+  rb_define_const(module, "MASS_ELECTRON",
+                  rb_float_new(GSL_CONST_CGSM_MASS_ELECTRON));
+  rb_define_const(module, "MASS_MUON", rb_float_new(GSL_CONST_CGSM_MASS_MUON));
+  rb_define_const(module, "MASS_PROTON", rb_float_new(GSL_CONST_CGSM_MASS_PROTON));
+  rb_define_const(module, "MASS_NEUTRON", rb_float_new(GSL_CONST_CGSM_MASS_NEUTRON));
+  rb_define_const(module, "RYDBERG", rb_float_new(GSL_CONST_CGSM_RYDBERG));
+
+  rb_define_const(module, "BOHR_MAGNETON",
+                  rb_float_new(GSL_CONST_CGSM_BOHR_MAGNETON));
+
+  rb_define_const(module, "NUCLEAR_MAGNETON",
+                  rb_float_new(GSL_CONST_CGSM_NUCLEAR_MAGNETON));
+  rb_define_const(module, "ELECTRON_MAGNETIC_MOMENT",
+                  rb_float_new(GSL_CONST_CGSM_ELECTRON_MAGNETIC_MOMENT));
+  rb_define_const(module, "PROTON_MAGNETIC_MOMENT",
+                  rb_float_new(GSL_CONST_CGSM_PROTON_MAGNETIC_MOMENT));
+  rb_define_const(module, "STANDARD_GAS_VOLUME",
+                  rb_float_new(GSL_CONST_CGSM_STANDARD_GAS_VOLUME));
+
+  rb_define_const(module, "MINUTE", rb_float_new(GSL_CONST_CGSM_MINUTE));
+  rb_define_const(module, "HOUR", rb_float_new(GSL_CONST_CGSM_HOUR));
+  rb_define_const(module, "DAY", rb_float_new(GSL_CONST_CGSM_DAY));
+  rb_define_const(module, "WEEK", rb_float_new(GSL_CONST_CGSM_WEEK));
+  rb_define_const(module, "INCH", rb_float_new(GSL_CONST_CGSM_INCH));
+  rb_define_const(module, "FOOT", rb_float_new(GSL_CONST_CGSM_FOOT));
+  rb_define_const(module, "YARD", rb_float_new(GSL_CONST_CGSM_YARD));
+  rb_define_const(module, "MILE", rb_float_new(GSL_CONST_CGSM_MILE));
+  rb_define_const(module, "NAUTICAL_MILE",
+                  rb_float_new(GSL_CONST_CGSM_NAUTICAL_MILE));
+  rb_define_const(module, "FATHOM", rb_float_new(GSL_CONST_CGSM_FATHOM));
+  rb_define_const(module, "MIL", rb_float_new(GSL_CONST_CGSM_MIL));
+  rb_define_const(module, "POINT", rb_float_new(GSL_CONST_CGSM_POINT));
+  rb_define_const(module, "TEXPOINT", rb_float_new(GSL_CONST_CGSM_TEXPOINT));
+  rb_define_const(module, "MICRON", rb_float_new(GSL_CONST_CGSM_MICRON));
+  rb_define_const(module, "ANGSTROM", rb_float_new(GSL_CONST_CGSM_ANGSTROM));
+  rb_define_const(module, "HECTARE", rb_float_new(GSL_CONST_CGSM_HECTARE));
+  rb_define_const(module, "ACRE", rb_float_new(GSL_CONST_CGSM_ACRE));
+  rb_define_const(module, "BARN", rb_float_new(GSL_CONST_CGSM_BARN));
+  rb_define_const(module, "LITER", rb_float_new(GSL_CONST_CGSM_LITER));
+  rb_define_const(module, "US_GALLON", rb_float_new(GSL_CONST_CGSM_US_GALLON));
+  rb_define_const(module, "QUART", rb_float_new(GSL_CONST_CGSM_QUART));
+  rb_define_const(module, "PINT", rb_float_new(GSL_CONST_CGSM_PINT));
+  rb_define_const(module, "CUP", rb_float_new(GSL_CONST_CGSM_CUP));
+  rb_define_const(module, "FLUID_OUNCE", rb_float_new(GSL_CONST_CGSM_FLUID_OUNCE));
+  rb_define_const(module, "TABLESPOON", rb_float_new(GSL_CONST_CGSM_TABLESPOON));
+  rb_define_const(module, "CANADIAN_GALLON",
+                  rb_float_new(GSL_CONST_CGSM_CANADIAN_GALLON));
+
+  rb_define_const(module, "UK_GALLON", rb_float_new(GSL_CONST_CGSM_UK_GALLON));
+  rb_define_const(module, "KILOMETERS_PER_HOUR",
+                  rb_float_new(GSL_CONST_CGSM_MILES_PER_HOUR));
+  rb_define_const(module, "MILES_PER_HOUR",
+                  rb_float_new(GSL_CONST_CGSM_KILOMETERS_PER_HOUR));
+  rb_define_const(module, "KNOT", rb_float_new(GSL_CONST_CGSM_KNOT));
+  rb_define_const(module, "POUND_MASS", rb_float_new(GSL_CONST_CGSM_POUND_MASS));
+  rb_define_const(module, "POUND_OUNCE", rb_float_new(GSL_CONST_CGSM_OUNCE_MASS));
+  rb_define_const(module, "POUND_TON", rb_float_new(GSL_CONST_CGSM_TON));
+  rb_define_const(module, "POUND_METRIC_TON",
+                  rb_float_new(GSL_CONST_CGSM_METRIC_TON));
+  rb_define_const(module, "POUND_UK_TON", rb_float_new(GSL_CONST_CGSM_UK_TON));
+  rb_define_const(module, "POUND_TROY_OUNCE",
+                  rb_float_new(GSL_CONST_CGSM_TROY_OUNCE));
+  rb_define_const(module, "CARAT", rb_float_new(GSL_CONST_CGSM_CARAT));
+  rb_define_const(module, "UNIFIED_ATOMIC_MASS",
+                  rb_float_new(GSL_CONST_CGSM_UNIFIED_ATOMIC_MASS));
+  rb_define_const(module, "GRAM_FORCE", rb_float_new(GSL_CONST_CGSM_GRAM_FORCE));
+  rb_define_const(module, "POUND_FORCE", rb_float_new(GSL_CONST_CGSM_POUND_FORCE));
+  rb_define_const(module, "KILOPOUND_FORCE",
+                  rb_float_new(GSL_CONST_CGSM_KILOPOUND_FORCE));
+  rb_define_const(module, "POUNDAL", rb_float_new(GSL_CONST_CGSM_POUNDAL));
+  rb_define_const(module, "CALORIE", rb_float_new(GSL_CONST_CGSM_CALORIE));
+  rb_define_const(module, "BTU", rb_float_new(GSL_CONST_CGSM_BTU));
+  rb_define_const(module, "THERM", rb_float_new(GSL_CONST_CGSM_THERM));
+  rb_define_const(module, "HORSEPOWER", rb_float_new(GSL_CONST_CGSM_HORSEPOWER));
+  rb_define_const(module, "BAR", rb_float_new(GSL_CONST_CGSM_BAR));
+  rb_define_const(module, "STD_ATMOSPHERE",
+                  rb_float_new(GSL_CONST_CGSM_STD_ATMOSPHERE));
+  rb_define_const(module, "TORR", rb_float_new(GSL_CONST_CGSM_TORR));
+  rb_define_const(module, "METER_OF_MERCURY",
+                  rb_float_new(GSL_CONST_CGSM_METER_OF_MERCURY));
+  rb_define_const(module, "INCH_OF_MERCURY",
+                  rb_float_new(GSL_CONST_CGSM_INCH_OF_MERCURY));
+  rb_define_const(module, "INCH_OF_WATER",
+                  rb_float_new(GSL_CONST_CGSM_INCH_OF_WATER));
+  rb_define_const(module, "PSI", rb_float_new(GSL_CONST_CGSM_PSI));
+  rb_define_const(module, "POISE", rb_float_new(GSL_CONST_CGSM_POISE));
+  rb_define_const(module, "STOKES", rb_float_new(GSL_CONST_CGSM_STOKES));
+  rb_define_const(module, "FARADAY", rb_float_new(GSL_CONST_CGSM_FARADAY));
+  rb_define_const(module, "ELECTRON_CHARGE",
+                  rb_float_new(GSL_CONST_CGSM_ELECTRON_CHARGE));
+  rb_define_const(module, "ELECTRON_CHARGE_ESU",
+                  rb_float_new(GSL_CONST_CGSM_ELECTRON_CHARGE*GSL_CONST_CGSM_SPEED_OF_LIGHT));
+  rb_define_const(module, "STILB", rb_float_new(GSL_CONST_CGSM_STILB));
+  rb_define_const(module, "LUMEN", rb_float_new(GSL_CONST_CGSM_LUMEN));
+  rb_define_const(module, "LUX", rb_float_new(GSL_CONST_CGSM_LUX));
+  rb_define_const(module, "PHOT", rb_float_new(GSL_CONST_CGSM_PHOT));
+  rb_define_const(module, "FOOTCANDLE", rb_float_new(GSL_CONST_CGSM_FOOTCANDLE));
+  rb_define_const(module, "LAMBERT", rb_float_new(GSL_CONST_CGSM_LAMBERT));
+  rb_define_const(module, "CURIE", rb_float_new(GSL_CONST_CGSM_CURIE));
+  rb_define_const(module, "ROENTGEN", rb_float_new(GSL_CONST_CGSM_ROENTGEN));
+  rb_define_const(module, "RAD", rb_float_new(GSL_CONST_CGSM_RAD));
+  rb_define_const(module, "SOLAR_MASS", rb_float_new(GSL_CONST_CGSM_SOLAR_MASS));
+
+  rb_define_const(module, "BOLTZMANN", rb_float_new(GSL_CONST_CGSM_BOLTZMANN));
+  rb_define_const(module, "MOLAR_GAS", rb_float_new(GSL_CONST_CGSM_MOLAR_GAS));
+
+  rb_define_const(module, "BOHR_RADIUS", rb_float_new(GSL_CONST_CGSM_BOHR_RADIUS));
+  rb_define_const(module, "NEWTON", rb_float_new(GSL_CONST_CGSM_NEWTON));
+  rb_define_const(module, "DYNE", rb_float_new(GSL_CONST_CGSM_DYNE));
+  rb_define_const(module, "JOULE", rb_float_new(GSL_CONST_CGSM_JOULE));
+  rb_define_const(module, "ERG", rb_float_new(GSL_CONST_CGSM_ERG));
+
+  rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT",
+                  rb_float_new(GSL_CONST_CGSM_STEFAN_BOLTZMANN_CONSTANT));
+  rb_define_const(module, "THOMSON_CROSS_SECTION",
+                  rb_float_new(GSL_CONST_CGSM_THOMSON_CROSS_SECTION));
+}
+
+static void rb_gsl_const_num(VALUE module)
+{
+  rb_define_const(module, "AVOGADRO", rb_float_new(GSL_CONST_NUM_AVOGADRO));
+  rb_define_const(module, "FINE_STRUCTURE",
+                  rb_float_new(GSL_CONST_NUM_FINE_STRUCTURE));
+  rb_define_const(module, "YOTTA", rb_float_new(GSL_CONST_NUM_YOTTA));
+  rb_define_const(module, "ZETTA", rb_float_new(GSL_CONST_NUM_ZETTA));
+  rb_define_const(module, "EXA", rb_float_new(GSL_CONST_NUM_EXA));
+  rb_define_const(module, "PETA", rb_float_new(GSL_CONST_NUM_PETA));
+  rb_define_const(module, "TERA", rb_float_new(GSL_CONST_NUM_TERA));
+  rb_define_const(module, "GIGA", rb_float_new(GSL_CONST_NUM_GIGA));
+  rb_define_const(module, "MEGA", rb_float_new(GSL_CONST_NUM_MEGA));
+  rb_define_const(module, "KILO", rb_float_new(GSL_CONST_NUM_KILO));
+  rb_define_const(module, "MILLI", rb_float_new(GSL_CONST_NUM_MILLI));
+  rb_define_const(module, "MICRO", rb_float_new(GSL_CONST_NUM_MICRO));
+  rb_define_const(module, "NANO", rb_float_new(GSL_CONST_NUM_NANO));
+  rb_define_const(module, "PICO", rb_float_new(GSL_CONST_NUM_PICO));
+  rb_define_const(module, "FEMTO", rb_float_new(GSL_CONST_NUM_FEMTO));
+  rb_define_const(module, "ATTO", rb_float_new(GSL_CONST_NUM_ATTO));
+  rb_define_const(module, "ZEPTO", rb_float_new(GSL_CONST_NUM_ZEPTO));
+  rb_define_const(module, "YOCTO", rb_float_new(GSL_CONST_NUM_YOCTO));
+}
+
+void Init_gsl_const(VALUE module)
+{
+  VALUE mgsl_const;
+  VALUE mgsl_const_mks, mgsl_const_cgs, mgsl_const_num;
+
+  mgsl_const = rb_define_module_under(module, "CONST");
+  mgsl_const_mks = rb_define_module_under(mgsl_const, "MKSA");
+  rb_gsl_const_mks(mgsl_const_mks);
+  mgsl_const_cgs = rb_define_module_under(mgsl_const, "CGSM");
+  rb_gsl_const_cgs(mgsl_const_cgs);
+  mgsl_const_num = rb_define_module_under(mgsl_const, "NUM");
+  rb_gsl_const_num(mgsl_const_num);
+  Init_gsl_const_additional(mgsl_const_mks, mgsl_const_cgs, mgsl_const_num);
+}
diff --git a/ext/gsl/const_additional.c b/ext/gsl_native/const_additional.c
similarity index 68%
rename from ext/gsl/const_additional.c
rename to ext/gsl_native/const_additional.c
index d633306..1895dbb 100644
--- a/ext/gsl/const_additional.c
+++ b/ext/gsl_native/const_additional.c
@@ -11,13 +11,6 @@
 
 #include "include/rb_gsl_const.h"
 
-#ifndef GSL_1_4_9_LATER
-#define MKS_STEFAN_BOLTZMANN_CONSTANT (5.6703993443638e-08)
-#define MKS_THOMSON_CROSS_SECTION (6.65245852869236e-29)
-#define CGS_STEFAN_BOLTZMANN_CONSTANT (5.6703993443638e-05)
-#define CGS_THOMSON_CROSS_SECTION (6.65245852869236e-25)
-#endif
-
 #define MKS_CLASSICAL_ELECTRON_RADIUS (2.81794028310825e-15)
 #define MKS_RADIATION_DENSITY_CONSTANT (7.56576650685962e-16)
 #define MKS_RADIATION_NUMBER_DENSITY_CONSTANT (20.2869161066108e-6)
@@ -43,47 +36,33 @@ static void rb_gsl_const_num(VALUE module);
 static void rb_gsl_const_mks(VALUE module)
 {
   rb_define_const(module, "RADIATION_DENSITY_CONSTANT",
-		  rb_float_new(MKS_RADIATION_DENSITY_CONSTANT));
-  rb_define_const(module, "RADIATION_NUMBER_DENSITY_CONSTANT", 
-		  rb_float_new(MKS_RADIATION_NUMBER_DENSITY_CONSTANT));
+                  rb_float_new(MKS_RADIATION_DENSITY_CONSTANT));
+  rb_define_const(module, "RADIATION_NUMBER_DENSITY_CONSTANT",
+                  rb_float_new(MKS_RADIATION_NUMBER_DENSITY_CONSTANT));
   rb_define_const(module, "CLASSICAL_ELECTRON_RADIUS",
-		  rb_float_new(MKS_CLASSICAL_ELECTRON_RADIUS));
+                  rb_float_new(MKS_CLASSICAL_ELECTRON_RADIUS));
   rb_define_const(module, "SOLAR_TIME", rb_float_new(MKS_SOLAR_TIME));
   rb_define_const(module, "SOLAR_GM", rb_float_new(MKS_SOLAR_GM));
 
   rb_define_const(module, "PLANCK_MASS", rb_float_new(MKS_PLANCK_MASS));
   rb_define_const(module, "PLANCK_LENGTH", rb_float_new(MKS_PLANCK_LENGTH));
   rb_define_const(module, "PLANCK_TIME", rb_float_new(MKS_PLANCK_TIME));
-
-#ifndef GSL_1_4_9_LATER
-  rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT", 
-		  rb_float_new(MKS_STEFAN_BOLTZMANN_CONSTANT));
-  rb_define_const(module, "THOMSON_CROSS_SECTION", 
-		  rb_float_new(MKS_THOMSON_CROSS_SECTION));
-#endif
 }
 
 static void rb_gsl_const_cgs(VALUE module)
 {
-  rb_define_const(module, "RADIATION_DENSITY_CONSTANT", 
-		  rb_float_new(CGS_RADIATION_DENSITY_CONSTANT));
-  rb_define_const(module, "RADIATION_NUMBER_DENSITY_CONSTANT", 
-		  rb_float_new(CGS_RADIATION_NUMBER_DENSITY_CONSTANT));
-  rb_define_const(module, "CLASSICAL_ELECTRON_RADIUS", 
-		  rb_float_new(CGS_CLASSICAL_ELECTRON_RADIUS));
+  rb_define_const(module, "RADIATION_DENSITY_CONSTANT",
+                  rb_float_new(CGS_RADIATION_DENSITY_CONSTANT));
+  rb_define_const(module, "RADIATION_NUMBER_DENSITY_CONSTANT",
+                  rb_float_new(CGS_RADIATION_NUMBER_DENSITY_CONSTANT));
+  rb_define_const(module, "CLASSICAL_ELECTRON_RADIUS",
+                  rb_float_new(CGS_CLASSICAL_ELECTRON_RADIUS));
   rb_define_const(module, "SOLAR_TIME", rb_float_new(CGS_SOLAR_TIME));
   rb_define_const(module, "SOLAR_GM", rb_float_new(CGS_SOLAR_GM));
 
   rb_define_const(module, "PLANCK_MASS", rb_float_new(CGS_PLANCK_MASS));
   rb_define_const(module, "PLANCK_LENGTH", rb_float_new(CGS_PLANCK_LENGTH));
   rb_define_const(module, "PLANCK_TIME", rb_float_new(CGS_PLANCK_TIME));
-
-#ifndef GSL_1_4_9_LATER
-  rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT", 
-		  rb_float_new(CGS_STEFAN_BOLTZMANN_CONSTANT));
-  rb_define_const(module, "THOMSON_CROSS_SECTION", 
-		  rb_float_new(CGS_THOMSON_CROSS_SECTION));
-#endif
 }
 
 static void rb_gsl_const_num(VALUE module)
@@ -102,8 +81,8 @@ void Init_gsl_const_additional(VALUE mmks, VALUE mcgs, VALUE mnum)
 #undef MKS_STEFAN_BOLTZMANN_CONSTANT
 #undef MKS_RADIATION_DENSITY_CONSTANT
 #undef MKS_RADIATION_NUMBER_DENSITY_CONSTANT
-#undef CGS_CLASSICAL_ELECTRON_RADIUS 
-#undef CGS_STEFAN_BOLTZMANN_CONSTANT 
+#undef CGS_CLASSICAL_ELECTRON_RADIUS
+#undef CGS_STEFAN_BOLTZMANN_CONSTANT
 #undef CGS_RADIATION_DENSITY_CONSTANT
 #undef CGS_RADIATION_NUMBER_DENSITY_CONSTANT
 #undef CGS_THOMSON_CROSS_SECTION
diff --git a/ext/gsl_native/cqp.c b/ext/gsl_native/cqp.c
new file mode 100644
index 0000000..eb1a547
--- /dev/null
+++ b/ext/gsl_native/cqp.c
@@ -0,0 +1,283 @@
+#ifdef HAVE_GSL_GSL_CQP_H
+
+#include "include/rb_gsl.h"
+#include "gsl/gsl_cqp.h"
+
+static const gsl_cqpminimizer_type* type_by_string(VALUE t);
+static const gsl_cqpminimizer_type* get_type(VALUE t)
+{
+
+  switch (TYPE(t)) {
+  case T_STRING:
+    return type_by_string(t);
+    break;
+  default:
+    rb_raise(rb_eTypeError, "Wrong argument type %s.", rb_class2name(CLASS_OF(t)));
+  }
+}
+
+static const gsl_cqpminimizer_type* type_by_string(VALUE t)
+{
+  char *name;
+  name = STR2CSTR(t);
+  if (strcmp(name, "mg_pdip") == 0) {
+    return gsl_cqpminimizer_mg_pdip;
+  } else {
+    rb_raise(rb_eRuntimeError, "Unknown minimizer type %s.", name);
+  }
+  return NULL; /* never reach here */
+}
+
+static VALUE rb_cqpminimizer_alloc(VALUE klass,  VALUE t, VALUE n, VALUE me, VALUE mi)
+{
+  gsl_cqpminimizer *m;
+  m = gsl_cqpminimizer_alloc(get_type(t), (size_t) FIX2INT(n), (size_t) FIX2INT(me), (size_t) FIX2INT(mi));
+  return Data_Wrap_Struct(klass, 0, gsl_cqpminimizer_free, m);
+}
+
+static VALUE rb_cqpminimizer_set(VALUE obj, VALUE data)
+{
+  gsl_cqpminimizer *m;
+  gsl_cqp_data *d;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  Data_Get_Struct(data, gsl_cqp_data, d);
+  gsl_cqpminimizer_set(m, d);
+  return Qtrue;
+}
+
+static VALUE rb_cqpminimizer_name(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return rb_str_new2(gsl_cqpminimizer_name(m));
+}
+
+static VALUE rb_cqpminimizer_iterate(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return INT2FIX(gsl_cqpminimizer_iterate(m));
+}
+
+static VALUE rb_cqpminimizer_x(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_x(m));
+}
+
+static VALUE rb_cqpminimizer_lm_eq(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_lm_eq(m));
+}
+static VALUE rb_cqpminimizer_lm_ineq(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_lm_ineq(m));
+}
+static VALUE rb_cqpminimizer_f(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return rb_float_new(gsl_cqpminimizer_f(m));
+}
+static VALUE rb_cqpminimizer_gap(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return rb_float_new(gsl_cqpminimizer_gap(m));
+}
+static VALUE rb_cqpminimizer_residuals_norm(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return rb_float_new(gsl_cqpminimizer_residuals_norm(m));
+}
+/*
+static VALUE rb_cqpminimizer_minimum(VALUE obj)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return rb_float_new(gsl_cqpminimizer_minimum(m));
+}
+*/
+static VALUE rb_cqpminimizer_test_convergence(VALUE obj, VALUE g, VALUE r)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return INT2FIX(gsl_cqpminimizer_test_convergence(m, NUM2DBL(g), NUM2DBL(r)));
+}
+static VALUE rb_cqpminimizer_test_infeasibility(VALUE obj, VALUE e)
+{
+  gsl_cqpminimizer *m;
+  Data_Get_Struct(obj, gsl_cqpminimizer, m);
+  return INT2FIX(gsl_cqp_minimizer_test_infeasibility(m, NUM2DBL(e)));
+}
+
+static VALUE rb_cqp_data_alloc(VALUE klass)
+{
+  gsl_cqp_data *d;
+  d = (gsl_cqp_data*) malloc(sizeof(gsl_cqp_data));
+  return Data_Wrap_Struct(klass, 0, free, d);
+}
+
+static VALUE rb_cqp_data_Q(VALUE obj)
+{
+  gsl_cqp_data *d;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL,   d->Q);
+}
+
+static VALUE rb_cqp_data_q(VALUE obj)
+{
+  gsl_cqp_data *d;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  return Data_Wrap_Struct(cgsl_vector_view, 0, NULL,   d->q);
+}
+
+static VALUE rb_cqp_data_A(VALUE obj)
+{
+  gsl_cqp_data *d;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL,   d->A);
+}
+
+static VALUE rb_cqp_data_b(VALUE obj)
+{
+  gsl_cqp_data *d;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  return Data_Wrap_Struct(cgsl_vector_view, 0, NULL,   d->b);
+}
+
+static VALUE rb_cqp_data_C(VALUE obj)
+{
+  gsl_cqp_data *d;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL,   d->C);
+}
+
+static VALUE rb_cqp_data_d(VALUE obj)
+{
+  gsl_cqp_data *d;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  return Data_Wrap_Struct(cgsl_vector_view, 0, NULL,   d->d);
+}
+
+static VALUE rb_cqp_data_set_Q(VALUE obj, VALUE mm)
+{
+  gsl_cqp_data *d;
+  gsl_matrix *m;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  CHECK_MATRIX(mm);
+  Data_Get_Struct(mm, gsl_matrix, m);
+  d->Q = m;
+  return Qtrue;
+}
+
+static VALUE rb_cqp_data_set_q(VALUE obj, VALUE vv)
+{
+  gsl_cqp_data *d;
+  gsl_vector *v;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  CHECK_VECTOR(vv);
+  Data_Get_Struct(vv, gsl_vector, v);
+  d->q = v;
+  return Qtrue;
+}
+
+static VALUE rb_cqp_data_set_A(VALUE obj, VALUE mm)
+{
+  gsl_cqp_data *d;
+  gsl_matrix *m;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  CHECK_MATRIX(mm);
+  Data_Get_Struct(mm, gsl_matrix, m);
+  d->A = m;
+  return Qtrue;
+}
+
+static VALUE rb_cqp_data_set_b(VALUE obj, VALUE vv)
+{
+  gsl_cqp_data *d;
+  gsl_vector *v;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  CHECK_VECTOR(vv);
+  Data_Get_Struct(vv, gsl_vector, v);
+  d->b = v;
+  return Qtrue;
+}
+
+static VALUE rb_cqp_data_set_C(VALUE obj, VALUE mm)
+{
+  gsl_cqp_data *d;
+  gsl_matrix *m;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  CHECK_MATRIX(mm);
+  Data_Get_Struct(mm, gsl_matrix, m);
+  d->C = m;
+  return Qtrue;
+}
+
+static VALUE rb_cqp_data_set_d(VALUE obj, VALUE vv)
+{
+  gsl_cqp_data *d;
+  gsl_vector *v;
+  Data_Get_Struct(obj, gsl_cqp_data, d);
+  CHECK_VECTOR(vv);
+  Data_Get_Struct(vv, gsl_vector, v);
+  d->d = v;
+  return Qtrue;
+}
+
+void Init_cqp(VALUE module)
+{
+  VALUE mCQP, cMinimizer, cData;
+
+  mCQP = rb_define_module_under(module, "CQP");
+  cMinimizer = rb_define_class_under(mCQP, "Minimizer", cGSL_Object);
+  cData = rb_define_class_under(mCQP, "Data", cGSL_Object);
+
+  rb_define_singleton_method(cMinimizer, "alloc", rb_cqpminimizer_alloc, 4);
+
+  rb_define_method(cMinimizer, "set", rb_cqpminimizer_set, 1);
+  rb_define_method(cMinimizer, "name", rb_cqpminimizer_name, 0);
+  rb_define_method(cMinimizer, "iterate", rb_cqpminimizer_iterate, 0);
+  rb_define_method(cMinimizer, "x", rb_cqpminimizer_x, 0);
+  rb_define_method(cMinimizer, "lm_eq", rb_cqpminimizer_lm_eq, 0);
+  rb_define_method(cMinimizer, "lm_ineq", rb_cqpminimizer_lm_ineq, 0);
+  rb_define_method(cMinimizer, "f", rb_cqpminimizer_f, 0);
+  rb_define_method(cMinimizer, "gap", rb_cqpminimizer_gap, 0);
+  rb_define_method(cMinimizer, "residuals_norm", rb_cqpminimizer_residuals_norm, 0);
+/*  rb_define_method(cMinimizer, "minimum", rb_cqpminimizer_minimum, 0);  */
+  rb_define_method(cMinimizer, "test_convergence", rb_cqpminimizer_test_convergence, 2);
+  rb_define_method(cMinimizer, "test_infeasibility", rb_cqpminimizer_test_infeasibility, 1);
+
+  /*****/
+  rb_define_singleton_method(cData, "alloc", rb_cqp_data_alloc, 0);
+
+  rb_define_method(cData, "Q", rb_cqp_data_Q, 0);
+  rb_define_method(cData, "q", rb_cqp_data_q, 0);
+  rb_define_method(cData, "A", rb_cqp_data_A, 0);
+  rb_define_method(cData, "b", rb_cqp_data_b, 0);
+  rb_define_method(cData, "C", rb_cqp_data_C, 0);
+  rb_define_method(cData, "d", rb_cqp_data_d, 0);
+
+  rb_define_method(cData, "set_Q", rb_cqp_data_set_Q, 1);
+  rb_define_method(cData, "set_q", rb_cqp_data_set_q, 1);
+  rb_define_method(cData, "set_A", rb_cqp_data_set_A, 1);
+  rb_define_method(cData, "set_b", rb_cqp_data_set_b, 1);
+  rb_define_method(cData, "set_C", rb_cqp_data_set_C, 1);
+  rb_define_method(cData, "set_d", rb_cqp_data_set_d, 1);
+  rb_define_alias(cData, "Q=", "set_Q");
+  rb_define_alias(cData, "q=", "set_q");
+  rb_define_alias(cData, "A=", "set_A");
+  rb_define_alias(cData, "b=", "set_b");
+  rb_define_alias(cData, "C=", "set_C");
+  rb_define_alias(cData, "d=", "set_d");
+}
+
+#endif
+
diff --git a/ext/gsl/deriv.c b/ext/gsl_native/deriv.c
similarity index 80%
rename from ext/gsl/deriv.c
rename to ext/gsl_native/deriv.c
index f7af8c5..1332e7b 100644
--- a/ext/gsl/deriv.c
+++ b/ext/gsl_native/deriv.c
@@ -9,15 +9,11 @@
   WITHOUT ANY WARRANTY.
 */
 
-#ifdef GSL_1_4_9_LATER
 #include "include/rb_gsl_common.h"
 #include "include/rb_gsl_function.h"
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_deriv.h>
 #define RB_GSL_DERIV_H_DEFAULT (1e-8)
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 static int get_func2(int argc, VALUE *argv, VALUE obj, VALUE *ff, VALUE *xx, VALUE *hh)
 {
@@ -62,10 +58,10 @@ static int get_func2(int argc, VALUE *argv, VALUE obj, VALUE *ff, VALUE *xx, VAL
 #undef RB_GSL_DERIV_H_DEFAULT
 #endif
 
-static VALUE rb_gsl_deriv_eval(VALUE obj, VALUE xx, VALUE hh, 
-			       int (*deriv)(const gsl_function *, 
-					    double, double,
-					    double *, double *))
+static VALUE rb_gsl_deriv_eval(VALUE obj, VALUE xx, VALUE hh,
+                               int (*deriv)(const gsl_function *,
+                                            double, double,
+                                            double *, double *))
 {
   gsl_function *f = NULL;
   double result, abserr, h;
@@ -74,11 +70,6 @@ static VALUE rb_gsl_deriv_eval(VALUE obj, VALUE xx, VALUE hh,
   gsl_matrix *m = NULL, *mnew = NULL, *merr = NULL;
   size_t n, i, j;
   int status;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2, *ptr3;
-  VALUE ary2, ary3;
-#endif
   Need_Float(hh);
   Data_Get_Struct(obj, gsl_function, f);
   h = NUM2DBL(hh);
@@ -107,6 +98,9 @@ static VALUE rb_gsl_deriv_eval(VALUE obj, VALUE xx, VALUE hh,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2, *ptr3;
+      VALUE ary2, ary3;
       GetNArray(xx, na);
       n = na->total;
       ptr1 = (double*) na->ptr;
@@ -115,9 +109,9 @@ static VALUE rb_gsl_deriv_eval(VALUE obj, VALUE xx, VALUE hh,
       ptr2 = NA_PTR_TYPE(ary2, double*);
       ptr3 = NA_PTR_TYPE(ary3, double*);
       for (i = 0; i < n; i++) {
-	(*deriv)(f, ptr1[i], h, &result, &abserr);	
-	ptr2[i] = result;
-	ptr3[i] = abserr;
+        (*deriv)(f, ptr1[i], h, &result, &abserr);
+        ptr2[i] = result;
+        ptr3[i] = abserr;
       }
       return rb_ary_new3(2, ary2, ary3);
     }
@@ -127,27 +121,27 @@ static VALUE rb_gsl_deriv_eval(VALUE obj, VALUE xx, VALUE hh,
       vnew = gsl_vector_alloc(v->size);
       verr = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	(*deriv)(f, gsl_vector_get(v, i), h, &result, &abserr);	
-	gsl_vector_set(vnew, i, result);
-	gsl_vector_set(verr, i, abserr);
+        (*deriv)(f, gsl_vector_get(v, i), h, &result, &abserr);
+        gsl_vector_set(vnew, i, result);
+        gsl_vector_set(verr, i, abserr);
       }
       return rb_ary_new3(2,
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       merr = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  (*deriv)(f, gsl_matrix_get(m, i, j), h, &result, &abserr);	
-	  gsl_matrix_set(mnew, i, j, result);
-	  gsl_matrix_set(merr, i, j, abserr);
-	}
+        for (j = 0; j < m->size2; j++) {
+          (*deriv)(f, gsl_matrix_get(m, i, j), h, &result, &abserr);
+          gsl_matrix_set(mnew, i, j, result);
+          gsl_matrix_set(merr, i, j, abserr);
+        }
       }
       return rb_ary_new3(2,
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
     } else {
       rb_raise(rb_eTypeError, "wrong argument type");
     }
@@ -191,5 +185,3 @@ void Init_gsl_deriv(VALUE module)
   rb_define_singleton_method(mgsl_deriv, "forward", rb_gsl_deriv_forward, -1);
   rb_define_singleton_method(mgsl_deriv, "backward", rb_gsl_deriv_backward, -1);
 }
-
-#endif
diff --git a/ext/gsl/dht.c b/ext/gsl_native/dht.c
similarity index 91%
rename from ext/gsl/dht.c
rename to ext/gsl_native/dht.c
index 2356639..55dae39 100644
--- a/ext/gsl/dht.c
+++ b/ext/gsl_native/dht.c
@@ -13,9 +13,6 @@
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_common.h"
 #include <gsl/gsl_dht.h>
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 static VALUE rb_gsl_dht_alloc(int argc, VALUE *argv, VALUE klass)
 {
@@ -29,7 +26,7 @@ static VALUE rb_gsl_dht_alloc(int argc, VALUE *argv, VALUE klass)
     CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]); Need_Float(argv[2]);
     t = gsl_dht_new(FIX2INT(argv[0]), NUM2DBL(argv[1]), NUM2DBL(argv[2]));
-   break;
+    break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 3)", argc);
     break;
@@ -52,9 +49,6 @@ static VALUE rb_gsl_dht_apply(int argc, VALUE *argv, VALUE obj)
   double *ptr1, *ptr2;
   gsl_vector *vin, *vout;
   size_t size, stride;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-#endif
   VALUE ary;
   switch (argc) {
   case 2:
@@ -73,6 +67,7 @@ static VALUE rb_gsl_dht_apply(int argc, VALUE *argv, VALUE obj)
       ary = Data_Wrap_Struct(VECTOR_ROW_COL(argv[0]), 0, gsl_vector_free, vout);
 #ifdef HAVE_NARRAY_H
     } else if (NA_IsNArray(argv[0])) {
+      struct NARRAY *na;
       GetNArray(argv[0], na);
       ptr1 = (double*)na->ptr;
       ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(argv[0]));
@@ -80,7 +75,7 @@ static VALUE rb_gsl_dht_apply(int argc, VALUE *argv, VALUE obj)
 #endif
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Vector expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     gsl_dht_apply(t, ptr1, ptr2);
     return ary;
@@ -92,8 +87,8 @@ static VALUE rb_gsl_dht_apply(int argc, VALUE *argv, VALUE obj)
   return Qnil; /* never reach here */
 }
 
-static VALUE rb_gsl_dht_xk_sample(VALUE obj, VALUE n, 
-			       double (*sample)(const gsl_dht*, int))
+static VALUE rb_gsl_dht_xk_sample(VALUE obj, VALUE n,
+                                  double (*sample)(const gsl_dht*, int))
 {
   gsl_dht *t = NULL;
   gsl_vector_int *vi;
@@ -102,11 +97,6 @@ static VALUE rb_gsl_dht_xk_sample(VALUE obj, VALUE n,
   int nn;
   VALUE ary;
   double val;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  int *ptr;
-  double *ptr2;
-#endif
   Data_Get_Struct(obj, gsl_dht, t);
   if (CLASS_OF(n) == rb_cRange) n = rb_gsl_range2ary(n);
   switch (TYPE(n)) {
@@ -129,28 +119,30 @@ static VALUE rb_gsl_dht_xk_sample(VALUE obj, VALUE n,
       Data_Get_Struct(n, gsl_vector_int, vi);
       v = gsl_vector_alloc(vi->size);
       for (i = 0; i < v->size; i++) {
-	nn = gsl_vector_int_get(vi, i);
-	val = (*sample)(t, nn);
-	gsl_vector_set(v, i, val);
+        nn = gsl_vector_int_get(vi, i);
+        val = (*sample)(t, nn);
+        gsl_vector_set(v, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
 #ifdef HAVE_NARRAY_H
     } else if (NA_IsNArray(n)) {
+      struct NARRAY *na;
+      int *ptr;
+      double *ptr2;
       GetNArray(n, na);
       ptr = (int*) na->ptr;
       size = na->total;
       ary = na_make_object(NA_DFLOAT, na->rank, na->shape, cNArray);
       ptr2 = NA_PTR_TYPE(ary, double*);
       for (i = 0; i < size; i++) {
-	ptr2[i] = (*sample)(t, ptr[i]);	
+        ptr2[i] = (*sample)(t, ptr[i]);
       }
       return ary;
 #endif
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Vector::Int expected)",
-	       rb_class2name(CLASS_OF(n)));
+               rb_class2name(CLASS_OF(n)));
     }
-
   }
   return Qnil;
 }
@@ -204,8 +196,8 @@ static VALUE rb_gsl_dht_sample(int argc, VALUE *argv, VALUE obj)
     mm = gsl_matrix_alloc(t->size, t->size);
     for (n = 0; n < t->size; n++) {
       for (m = 0; m < t->size; m++) {
-	val =  t->j[n+1]*gsl_dht_x_sample(t, m)/t->xmax;
-	gsl_matrix_set(mm, n, m, val);
+        val = t->j[n+1]*gsl_dht_x_sample(t, m)/t->xmax;
+        gsl_matrix_set(mm, n, m, val);
       }
     }
     return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mm);
@@ -235,8 +227,8 @@ static VALUE rb_gsl_dht_num(int argc, VALUE *argv, VALUE obj)
     mm = gsl_matrix_alloc(t->size, t->size);
     for (n = 0; n < t->size; n++) {
       for (m = 0; m < t->size; m++) {
-	val = gsl_sf_bessel_Jnu(t->nu, t->j[n+1]*gsl_dht_x_sample(t, m)/t->xmax);
-	gsl_matrix_set(mm, n, m, val);
+        val = gsl_sf_bessel_Jnu(t->nu, t->j[n+1]*gsl_dht_x_sample(t, m)/t->xmax);
+        gsl_matrix_set(mm, n, m, val);
       }
     }
     return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mm);
@@ -312,9 +304,9 @@ static VALUE rb_gsl_dht_coef(int argc, VALUE *argv, VALUE obj)
     mm = gsl_matrix_alloc(t->size, t->size);
     for (n = 0; n < t->size; n++) {
       for (m = 0; m < t->size; m++) {
-	val = gsl_sf_bessel_Jnu(t->nu, t->j[n+1]*gsl_dht_x_sample(t, m)/t->xmax);
-	val *= (2.0/t->xmax/t->xmax)/t->J2[m+1];
-	gsl_matrix_set(mm, n, m, val);
+        val = gsl_sf_bessel_Jnu(t->nu, t->j[n+1]*gsl_dht_x_sample(t, m)/t->xmax);
+        val *= (2.0/t->xmax/t->xmax)/t->J2[m+1];
+        gsl_matrix_set(mm, n, m, val);
       }
     }
     return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mm);
diff --git a/ext/gsl/diff.c b/ext/gsl_native/diff.c
similarity index 79%
rename from ext/gsl/diff.c
rename to ext/gsl_native/diff.c
index aa68f55..7fb0ded 100644
--- a/ext/gsl/diff.c
+++ b/ext/gsl_native/diff.c
@@ -18,19 +18,19 @@ static int get_func(int argc, VALUE *argv, VALUE obj, VALUE *ff, VALUE *xx);
 
 static int get_func(int argc, VALUE *argv, VALUE obj, VALUE *ff, VALUE *xx)
 {
-   switch (TYPE(obj)) {
+  switch (TYPE(obj)) {
   case T_MODULE:
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_FUNCTION(argv[0]);
     *ff = argv[0];
     *xx = argv[1];
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     *ff = obj;
     *xx = argv[0];
     break;
@@ -39,7 +39,7 @@ static int get_func(int argc, VALUE *argv, VALUE obj, VALUE *ff, VALUE *xx)
 }
 
 static VALUE rb_gsl_diff_eval(VALUE obj, VALUE xx,
-			      int (*diff)(const gsl_function *, double, double *, double *))
+                              int (*diff)(const gsl_function *, double, double *, double *))
 {
   gsl_function *f = NULL;
   double result, abserr;
@@ -48,11 +48,6 @@ static VALUE rb_gsl_diff_eval(VALUE obj, VALUE xx,
   gsl_matrix *m = NULL, *mnew = NULL, *merr = NULL;
   size_t n, i, j;
   int status;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2, *ptr3;
-  struct NARRAY *na;
-  VALUE ary2, ary3;
-#endif
   Data_Get_Struct(obj, gsl_function, f);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
@@ -79,6 +74,9 @@ static VALUE rb_gsl_diff_eval(VALUE obj, VALUE xx,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      double *ptr1, *ptr2, *ptr3;
+      struct NARRAY *na;
+      VALUE ary2, ary3;
       GetNArray(xx, na);
       n = na->total;
       ptr1 = (double*) na->ptr;
@@ -87,9 +85,9 @@ static VALUE rb_gsl_diff_eval(VALUE obj, VALUE xx,
       ptr2 = NA_PTR_TYPE(ary2, double*);
       ptr3 = NA_PTR_TYPE(ary3, double*);
       for (i = 0; i < n; i++) {
-	(*diff)(f, ptr1[i], &result, &abserr);	
-	ptr2[i] = result;
-	ptr3[i] = abserr;
+        (*diff)(f, ptr1[i], &result, &abserr);
+        ptr2[i] = result;
+        ptr3[i] = abserr;
       }
       return rb_ary_new3(2, ary2, ary3);
     }
@@ -99,27 +97,27 @@ static VALUE rb_gsl_diff_eval(VALUE obj, VALUE xx,
       vnew = gsl_vector_alloc(v->size);
       verr = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	(*diff)(f, gsl_vector_get(v, i), &result, &abserr);	
-	gsl_vector_set(vnew, i, result);
-	gsl_vector_set(verr, i, abserr);
+        (*diff)(f, gsl_vector_get(v, i), &result, &abserr);
+        gsl_vector_set(vnew, i, result);
+        gsl_vector_set(verr, i, abserr);
       }
       return rb_ary_new3(2,
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
-			 Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
+                         Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       merr = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  (*diff)(f, gsl_matrix_get(m, i, j), &result, &abserr);	
-	  gsl_matrix_set(mnew, i, j, result);
-	  gsl_matrix_set(merr, i, j, abserr);
-	}
+        for (j = 0; j < m->size2; j++) {
+          (*diff)(f, gsl_matrix_get(m, i, j), &result, &abserr);
+          gsl_matrix_set(mnew, i, j, result);
+          gsl_matrix_set(merr, i, j, abserr);
+        }
       }
-      return rb_ary_new3(2, 
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
-			 Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
+      return rb_ary_new3(2,
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
+                         Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
     } else {
       rb_raise(rb_eTypeError, "wrong argument type");
     }
diff --git a/ext/gsl/dirac.c b/ext/gsl_native/dirac.c
similarity index 81%
rename from ext/gsl/dirac.c
rename to ext/gsl_native/dirac.c
index b9459cc..7c5dfc4 100644
--- a/ext/gsl/dirac.c
+++ b/ext/gsl_native/dirac.c
@@ -43,8 +43,8 @@ static VALUE rb_dirac_commute(VALUE obj, VALUE mm1, VALUE mm2)
   gsl_matrix_complex_mul(mnew2, m2, m1);
   gsl_matrix_complex_sub(mnew1, mnew2);
   gsl_matrix_complex_free(mnew2);
-  return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, 
-			  mnew1);
+  return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free,
+                          mnew1);
 }
 
 static VALUE rb_dirac_anticommute(VALUE obj, VALUE mm1, VALUE mm2)
@@ -61,8 +61,8 @@ static VALUE rb_dirac_anticommute(VALUE obj, VALUE mm1, VALUE mm2)
   gsl_matrix_complex_mul(mnew2, m2, m1);
   gsl_matrix_complex_add(mnew1, mnew2);
   gsl_matrix_complex_free(mnew2);
-  return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, 
-			  mnew1);
+  return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free,
+                          mnew1);
 }
 
 static void Init_gsl_dirac_common(VALUE module)
@@ -72,7 +72,7 @@ static void Init_gsl_dirac_common(VALUE module)
   rb_define_singleton_method(module, "anticommute", rb_dirac_anticommute, 2);
 
   cgsl_matrix_complex_const = rb_define_class_under(module, "Const",
-						    cgsl_matrix_complex);
+                                                    cgsl_matrix_complex);
   rb_define_method(cgsl_matrix_complex_const, "set", rb_dirac_refuse_set, -1);
 
   cPauli = rb_define_class_under(module, "Pauli", cgsl_matrix_complex_const);
@@ -88,16 +88,16 @@ static void define_eye(VALUE module)
   gsl_complex z;
 
   Eye2 = gsl_matrix_complex_calloc(2, 2);
-  VEye2 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0, 
-			   gsl_matrix_complex_free, Eye2);
+  VEye2 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0,
+                           gsl_matrix_complex_free, Eye2);
   z.dat[0] = 1; z.dat[1] = 0;
   gsl_matrix_complex_set(Eye2, 0, 0, z);
   gsl_matrix_complex_set(Eye2, 1, 1, z);
   rb_define_const(module, "Eye2", VEye2);
 
   Eye4 = gsl_matrix_complex_calloc(4, 4);
-  VEye4 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0, 
-			   gsl_matrix_complex_free, Eye4);
+  VEye4 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0,
+                           gsl_matrix_complex_free, Eye4);
   z.dat[0] = 1; z.dat[1] = 0;
   gsl_matrix_complex_set(Eye4, 0, 0, z);
   gsl_matrix_complex_set(Eye4, 1, 1, z);
@@ -106,16 +106,16 @@ static void define_eye(VALUE module)
   rb_define_const(module, "Eye4", VEye4);
 
   IEye2 = gsl_matrix_complex_calloc(2, 2);
-  VIEye2 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0, 
-			    gsl_matrix_complex_free, IEye2);
+  VIEye2 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0,
+                            gsl_matrix_complex_free, IEye2);
   z.dat[0] = 0; z.dat[1] = 1;
   gsl_matrix_complex_set(IEye2, 0, 0, z);
   gsl_matrix_complex_set(IEye2, 1, 1, z);
   rb_define_const(module, "IEye2", VIEye2);
 
   IEye4 = gsl_matrix_complex_calloc(4, 4);
-  VIEye4 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0, 
-			   gsl_matrix_complex_free, IEye4);
+  VIEye4 = Data_Wrap_Struct(cgsl_matrix_complex_const, 0,
+                            gsl_matrix_complex_free, IEye4);
   gsl_matrix_complex_set(IEye4, 0, 0, z);
   gsl_matrix_complex_set(IEye4, 1, 1, z);
   gsl_matrix_complex_set(IEye4, 2, 2, z);
@@ -128,16 +128,16 @@ static void define_pauli(VALUE module)
   gsl_complex z;
 
   Pauli[0] = gsl_matrix_complex_calloc(2, 2);
-  VPauli[0] = Data_Wrap_Struct(cPauli, 0, 
-			   gsl_matrix_complex_free, Pauli[0]);
+  VPauli[0] = Data_Wrap_Struct(cPauli, 0,
+                               gsl_matrix_complex_free, Pauli[0]);
   z.dat[0] = 1; z.dat[1] = 0;
   gsl_matrix_complex_set(Pauli[0], 0, 1, z);
   gsl_matrix_complex_set(Pauli[0], 1, 0, z);
   rb_define_const(module, "Pauli1", VPauli[0]);
 
   Pauli[1] = gsl_matrix_complex_calloc(2, 2);
-  VPauli[1] = Data_Wrap_Struct(cPauli, 0, 
-			   gsl_matrix_complex_free, Pauli[1]);
+  VPauli[1] = Data_Wrap_Struct(cPauli, 0,
+                               gsl_matrix_complex_free, Pauli[1]);
   z.dat[0] = 0; z.dat[1] = -1;
   gsl_matrix_complex_set(Pauli[1], 0, 1, z);
   z.dat[0] = 0; z.dat[1] = 1;
@@ -145,8 +145,8 @@ static void define_pauli(VALUE module)
   rb_define_const(module, "Pauli2", VPauli[1]);
 
   Pauli[2] = gsl_matrix_complex_calloc(2, 2);
-  VPauli[2] = Data_Wrap_Struct(cPauli, 0, 
-			   gsl_matrix_complex_free, Pauli[2]);
+  VPauli[2] = Data_Wrap_Struct(cPauli, 0,
+                               gsl_matrix_complex_free, Pauli[2]);
   z.dat[0] = 1; z.dat[1] = 0;
   gsl_matrix_complex_set(Pauli[2], 0, 0, z);
   z.dat[0] = -1; z.dat[1] = 0;
@@ -159,8 +159,8 @@ static void define_beta(VALUE module)
   gsl_complex z;
 
   Beta = gsl_matrix_complex_calloc(4, 4);
-  VGamma[0] = Data_Wrap_Struct(cGamma, 0, 
-			   gsl_matrix_complex_free, Beta);
+  VGamma[0] = Data_Wrap_Struct(cGamma, 0,
+                               gsl_matrix_complex_free, Beta);
   z.dat[0] = 1; z.dat[1] = 0;
   gsl_matrix_complex_set(Beta, 0, 0, z);
   gsl_matrix_complex_set(Beta, 1, 1, z);
@@ -180,22 +180,21 @@ static void define_alpha(VALUE module)
 
     for (j = 2; j < 4; j++) {
       for (k = 0; k < 2; k++) {
-	gsl_matrix_complex_set(Alpha[i], j, k, 
-			       gsl_matrix_complex_get(Pauli[i], j-2, k));
+        gsl_matrix_complex_set(Alpha[i], j, k,
+                               gsl_matrix_complex_get(Pauli[i], j-2, k));
       }
     }
     for (j = 0; j < 2; j++) {
       for (k = 2; k < 4; k++) {
-	gsl_matrix_complex_set(Alpha[i], j, k, 
-			       gsl_matrix_complex_get(Pauli[i], j, k-2));
+        gsl_matrix_complex_set(Alpha[i], j, k,
+                               gsl_matrix_complex_get(Pauli[i], j, k-2));
       }
     }
-    VAlpha[i] = Data_Wrap_Struct(cAlpha, 0, 
-			    gsl_matrix_complex_free, Alpha[i]);
+    VAlpha[i] = Data_Wrap_Struct(cAlpha, 0,
+                                 gsl_matrix_complex_free, Alpha[i]);
     sprintf(name, "Alpha%d", (int) i+1);
     rb_define_const(module, name, VAlpha[i]);
   }
-  
 }
 
 static void define_gamma(VALUE module)
@@ -206,8 +205,8 @@ static void define_gamma(VALUE module)
   for (i = 1; i <= 3; i++) {
     Gamma[i] = gsl_matrix_complex_calloc(4, 4);
     gsl_matrix_complex_mul(Gamma[i], Beta, Alpha[i-1]);
-    VGamma[i] = Data_Wrap_Struct(cGamma, 0, 
-			    gsl_matrix_complex_free, Gamma[i]);
+    VGamma[i] = Data_Wrap_Struct(cGamma, 0,
+                                 gsl_matrix_complex_free, Gamma[i]);
     sprintf(name, "Gamma%d", (int) i);
     rb_define_const(module, name, VGamma[i]);
   }
@@ -217,8 +216,8 @@ static void define_gamma(VALUE module)
   gsl_matrix_complex_set(Gamma[4], 1, 3, z);
   gsl_matrix_complex_set(Gamma[4], 2, 0, z);
   gsl_matrix_complex_set(Gamma[4], 3, 1, z);
-  VGamma[4] = Data_Wrap_Struct(cGamma, 0, 
-			  gsl_matrix_complex_free, Gamma[4]);
+  VGamma[4] = Data_Wrap_Struct(cGamma, 0,
+                               gsl_matrix_complex_free, Gamma[4]);
   rb_define_const(module, "Gamma5", VGamma[4]);
 }
 
@@ -234,8 +233,8 @@ static void define_lambda(VALUE module)
   zmi.dat[0] = 0; zmi.dat[1] = -1;
   for (i = 0; i < 8; i++) {
     Lambda[i] = gsl_matrix_complex_calloc(3, 3);
-    VLambda[i] = Data_Wrap_Struct(cLambda, 0, 
-			    gsl_matrix_complex_free, Lambda[i]);
+    VLambda[i] = Data_Wrap_Struct(cLambda, 0,
+                                  gsl_matrix_complex_free, Lambda[i]);
     sprintf(name, "Lambda%d", (int) i+1);
     rb_define_const(module, name, VLambda[i]);
   }
@@ -332,17 +331,17 @@ static VALUE rb_Dirac_matrix_is_equal(int argc, VALUE *argv, VALUE obj)
 #define NUM 20
 static VALUE rb_Dirac_matrix_whoami(int argc, VALUE *argv, VALUE obj)
 {
-  VALUE array[NUM] = {VPauli[0], VPauli[1], VPauli[2], 
-		      VGamma[0], VGamma[1], VGamma[2], VGamma[3],
-		      VGamma[4], VEye2, VEye4, VIEye2, VIEye4,
-		      VLambda[0], VLambda[1], VLambda[2], VLambda[3],
-		      VLambda[4], VLambda[5], VLambda[6], VLambda[7]};
-
-  const char *name[NUM] = {"Pauli1", "Pauli2", "Pauli3", 
-		     "Gamma0", "Gamma1", "Gamma2", "Gamma3", "Gamma5",
-		     "Eye2", "Eye4", "IEye2", "IEye4", "Lambda1", "Lambda2",
-		     "Lambda3", "Lambda4", "Lambda5", "Lambda6",
-		     "Lambda7", "Lambda8"};
+  VALUE array[NUM] = {VPauli[0], VPauli[1], VPauli[2],
+                      VGamma[0], VGamma[1], VGamma[2], VGamma[3],
+                      VGamma[4], VEye2, VEye4, VIEye2, VIEye4,
+                      VLambda[0], VLambda[1], VLambda[2], VLambda[3],
+                      VLambda[4], VLambda[5], VLambda[6], VLambda[7]};
+
+  const char *name[NUM] = {"Pauli1", "Pauli2", "Pauli3",
+                           "Gamma0", "Gamma1", "Gamma2", "Gamma3", "Gamma5",
+                           "Eye2", "Eye4", "IEye2", "IEye4", "Lambda1", "Lambda2",
+                           "Lambda3", "Lambda4", "Lambda5", "Lambda6",
+                           "Lambda7", "Lambda8"};
   gsl_matrix_complex *m1, *m2;
   VALUE vz;
   gsl_complex ztmp, *z;
diff --git a/ext/gsl/eigen.c b/ext/gsl_native/eigen.c
similarity index 64%
rename from ext/gsl/eigen.c
rename to ext/gsl_native/eigen.c
index 218af14..6e00056 100644
--- a/ext/gsl/eigen.c
+++ b/ext/gsl_native/eigen.c
@@ -33,12 +33,9 @@ static VALUE cgsl_eigen_herm_vectors;
 static VALUE cgsl_eigen_francis_workspace;
 
 #endif
-#ifdef GSL_1_9_LATER
 static VALUE cgsl_eigen_nonsymm_workspace;
 static VALUE cgsl_eigen_nonsymmv_workspace;
-#endif
 
-#ifdef GSL_1_10_LATER
 static VALUE cgensymm, mgensymm;
 static VALUE cgensymmv, mgensymmv;
 static VALUE cgenherm, mgenherm;
@@ -46,15 +43,14 @@ static VALUE cgenhermv, mgenhermv;
 
 static VALUE mgen, mgenv;
 static VALUE cgenw, cgenvw;
-#endif
 
 static VALUE rb_gsl_eigen_symm_alloc(VALUE klass, VALUE nn)
 {
   gsl_eigen_symm_workspace *w = NULL;
   CHECK_FIXNUM(nn);
   w = gsl_eigen_symm_alloc(FIX2INT(nn));
-  return Data_Wrap_Struct(cgsl_eigen_symm_workspace, 0, 
-			  gsl_eigen_symm_free, w);
+  return Data_Wrap_Struct(cgsl_eigen_symm_workspace, 0,
+                          gsl_eigen_symm_free, w);
 }
 
 static VALUE rb_gsl_eigen_symmv_alloc(VALUE klass, VALUE nn)
@@ -70,8 +66,8 @@ static VALUE rb_gsl_eigen_herm_alloc(VALUE klass, VALUE nn)
   gsl_eigen_herm_workspace *w = NULL;
   CHECK_FIXNUM(nn);
   w = gsl_eigen_herm_alloc(FIX2INT(nn));
-  return Data_Wrap_Struct(cgsl_eigen_herm_workspace, 0, 
-			  gsl_eigen_herm_free, w);
+  return Data_Wrap_Struct(cgsl_eigen_herm_workspace, 0,
+                          gsl_eigen_herm_free, w);
 }
 
 static VALUE rb_gsl_eigen_hermv_alloc(VALUE klass, VALUE nn)
@@ -79,12 +75,64 @@ static VALUE rb_gsl_eigen_hermv_alloc(VALUE klass, VALUE nn)
   gsl_eigen_hermv_workspace *w = NULL;
   CHECK_FIXNUM(nn);
   w = gsl_eigen_hermv_alloc(FIX2INT(nn));
-  return Data_Wrap_Struct(cgsl_eigen_hermv_workspace, 0, 
-			  gsl_eigen_hermv_free, w);
+  return Data_Wrap_Struct(cgsl_eigen_hermv_workspace, 0,
+                          gsl_eigen_hermv_free, w);
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_symm_narray(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_gsl_eigen_symm_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *na;
+  VALUE nary;
+  gsl_matrix *A = NULL;
+  gsl_eigen_symm_workspace *w = NULL;
+  gsl_vector_view vv;
+  int shape[1];
+  int flagw = 0;
+  switch (argc) {
+  case 2:
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
+    GetNArray(argv[0], na);
+    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
+    if (na->shape[0] != na->shape[1])
+      rb_raise(rb_eRuntimeError, "square matrix required");
+    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
+    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
+    if (CLASS_OF(argv[1]) != cgsl_eigen_symm_workspace)
+      rb_raise(rb_eTypeError,
+               "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected",
+               rb_class2name(CLASS_OF(argv[1])));
+    Data_Get_Struct(argv[1], gsl_eigen_symm_workspace, w);
+    flagw = 0;
+    break;
+  case 1:
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
+    GetNArray(argv[0], na);
+    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
+    if (na->shape[0] != na->shape[1])
+      rb_raise(rb_eRuntimeError, "square matrix required");
+    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
+    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
+    w = gsl_eigen_symm_alloc(A->size1);
+    flagw = 1;
+    break;
+  default:
+    rb_raise(rb_eArgError, "matrix not given");
+    break;
+  }
+  shape[0] = A->size1;
+  nary = na_make_object(NA_DFLOAT, 1, shape, cNVector);
+  vv = gsl_vector_view_array(NA_PTR_TYPE(nary,double*), A->size1);
+  gsl_eigen_symm(A, &vv.vector, w);
+  /*  gsl_sort_vector(v);*/
+  gsl_matrix_free(A);
+  if (flagw == 1) gsl_eigen_symm_free(w);
+  return nary;
+}
 #endif
 
 static VALUE rb_gsl_eigen_symm(int argc, VALUE *argv, VALUE obj)
@@ -100,19 +148,19 @@ static VALUE rb_gsl_eigen_symm(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 2:
 #ifdef HAVE_NARRAY_H
-    if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symm_narray(argc, argv, obj);
+      if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symm_narray(argc, argv, obj);
 #endif
       CHECK_MATRIX(argv[0]);
       Data_Get_Struct(argv[0], gsl_matrix, Atmp);
       if (CLASS_OF(argv[1]) != cgsl_eigen_symm_workspace)
-	rb_raise(rb_eTypeError,
-		 "argv[1]: wrong argument type %s (Eigen::Symm::Workspace expected)", 
-		 rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError,
+                 "argv[1]: wrong argument type %s (Eigen::Symm::Workspace expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       Data_Get_Struct(argv[1], gsl_eigen_symm_workspace, w);
       break;
     case 1:
 #ifdef HAVE_NARRAY_H
-    if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symm_narray(argc, argv, obj);
+      if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symm_narray(argc, argv, obj);
 #endif
       CHECK_MATRIX(argv[0]);
       Data_Get_Struct(argv[0], gsl_matrix, Atmp);
@@ -130,10 +178,9 @@ static VALUE rb_gsl_eigen_symm(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 1:
       if (CLASS_OF(argv[0]) != cgsl_eigen_symm_workspace)
-	rb_raise(rb_eTypeError, 
-		 "argv[0]:  wrong argument type %s (Eigen::Symm::Workspace expected", 
-		 rb_class2name(CLASS_OF(argv[0])));
-
+        rb_raise(rb_eTypeError,
+                 "argv[0]:  wrong argument type %s (Eigen::Symm::Workspace expected",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_eigen_symm_workspace, w);
       break;
     case 0:
@@ -154,65 +201,66 @@ static VALUE rb_gsl_eigen_symm(int argc, VALUE *argv, VALUE obj)
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_symm_narray(int argc, VALUE *argv, VALUE obj)
+static VALUE rb_gsl_eigen_symmv_narray(int argc, VALUE *argv, VALUE obj)
 {
   struct NARRAY *na;
-  VALUE nary;
+  VALUE eval, evec;
   gsl_matrix *A = NULL;
-  gsl_eigen_symm_workspace *w = NULL;
+  gsl_eigen_symmv_workspace *w = NULL;
+  gsl_matrix_view mv;
   gsl_vector_view vv;
-  int shape[1];
+  int shape1[1], shape2[2];
   int flagw = 0;
   switch (argc) {
   case 2:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     GetNArray(argv[0], na);
     if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
     if (na->shape[0] != na->shape[1])
       rb_raise(rb_eRuntimeError, "square matrix required");
     A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
     memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    if (CLASS_OF(argv[1]) != cgsl_eigen_symm_workspace)
-      rb_raise(rb_eTypeError, 
-	       "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected", 
-	       rb_class2name(CLASS_OF(argv[1])));
-    Data_Get_Struct(argv[1], gsl_eigen_symm_workspace, w);
+    if (CLASS_OF(argv[1]) != cgsl_eigen_symmv_workspace)
+      rb_raise(rb_eTypeError,
+               "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected",
+               rb_class2name(CLASS_OF(argv[1])));
+    Data_Get_Struct(argv[1], gsl_eigen_symmv_workspace, w);
     flagw = 0;
     break;
   case 1:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     GetNArray(argv[0], na);
     if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
     if (na->shape[0] != na->shape[1])
       rb_raise(rb_eRuntimeError, "square matrix required");
     A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
     memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    w = gsl_eigen_symm_alloc(A->size1);
+    w = gsl_eigen_symmv_alloc(A->size1);
     flagw = 1;
     break;
   default:
     rb_raise(rb_eArgError, "matrix not given");
     break;
   }
-  shape[0] = A->size1;
-  nary = na_make_object(NA_DFLOAT, 1, shape, cNVector);
-  vv = gsl_vector_view_array(NA_PTR_TYPE(nary,double*), A->size1);
-  gsl_eigen_symm(A, &vv.vector, w);
+  shape1[0] = A->size1;
+  shape2[0] = A->size1;
+  shape2[1] = A->size1;
+  eval = na_make_object(NA_DFLOAT, 1, shape1, cNVector);
+  evec = na_make_object(NA_DFLOAT, 2, shape2, CLASS_OF(argv[0]));
+  vv = gsl_vector_view_array(NA_PTR_TYPE(eval,double*), A->size1);
+  mv = gsl_matrix_view_array(NA_PTR_TYPE(evec,double*), A->size1, A->size2);
+  gsl_eigen_symmv(A, &vv.vector, &mv.matrix, w);
   /*  gsl_sort_vector(v);*/
   gsl_matrix_free(A);
-  if (flagw == 1) gsl_eigen_symm_free(w);
-  return nary;
+  if (flagw == 1) gsl_eigen_symmv_free(w);
+  return rb_ary_new3(2, eval, evec);
 }
 #endif
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_symmv_narray(int argc, VALUE *argv, VALUE obj);
-#endif
-
 static VALUE rb_gsl_eigen_symmv(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix *Atmp = NULL, *A = NULL, *em = NULL;
@@ -227,19 +275,19 @@ static VALUE rb_gsl_eigen_symmv(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 2:
 #ifdef HAVE_NARRAY_H
-    if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symmv_narray(argc, argv, obj);
+      if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symmv_narray(argc, argv, obj);
 #endif
       CHECK_MATRIX(argv[0]);
       Data_Get_Struct(argv[0], gsl_matrix, Atmp);
       if (CLASS_OF(argv[1]) != cgsl_eigen_symmv_workspace)
-	rb_raise(rb_eTypeError, 
-		 "argv[1]: wrong argument type %s (Eigen::Symmv::Workspace expected)",
-		 rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError,
+                 "argv[1]: wrong argument type %s (Eigen::Symmv::Workspace expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       Data_Get_Struct(argv[1], gsl_eigen_symmv_workspace, w);
       break;
     case 1:
 #ifdef HAVE_NARRAY_H
-    if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symmv_narray(argc, argv, obj);
+      if (NA_IsNArray(argv[0])) return rb_gsl_eigen_symmv_narray(argc, argv, obj);
 #endif
       CHECK_MATRIX(argv[0]);
       Data_Get_Struct(argv[0], gsl_matrix, Atmp);
@@ -256,10 +304,9 @@ static VALUE rb_gsl_eigen_symmv(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 1:
       if (CLASS_OF(argv[0]) != cgsl_eigen_symmv_workspace)
-	rb_raise(rb_eTypeError, 
-		 "argv[0]: wrong argument type %s (Eigen::Symmv::Workspace expected)", 
-		 rb_class2name(CLASS_OF(argv[0])));
-
+        rb_raise(rb_eTypeError,
+                 "argv[0]: wrong argument type %s (Eigen::Symmv::Workspace expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_eigen_symmv_workspace, w);
       break;
     case 0:
@@ -283,67 +330,6 @@ static VALUE rb_gsl_eigen_symmv(int argc, VALUE *argv, VALUE obj)
   return rb_ary_new3(2, vval, vvec);
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_symmv_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *na;
-  VALUE eval, evec;
-  gsl_matrix *A = NULL;
-  gsl_eigen_symmv_workspace *w = NULL;
-  gsl_matrix_view mv;
-  gsl_vector_view vv;
-  int shape1[1], shape2[2];
-  int flagw = 0;
-  switch (argc) {
-  case 2:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
-    GetNArray(argv[0], na);
-    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
-    if (na->shape[0] != na->shape[1])
-      rb_raise(rb_eRuntimeError, "square matrix required");
-    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
-    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    if (CLASS_OF(argv[1]) != cgsl_eigen_symmv_workspace)
-      rb_raise(rb_eTypeError, 
-	       "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected", 
-	       rb_class2name(CLASS_OF(argv[1])));
-    Data_Get_Struct(argv[1], gsl_eigen_symmv_workspace, w);
-    flagw = 0;
-    break;
-  case 1:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
-    GetNArray(argv[0], na);
-    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
-    if (na->shape[0] != na->shape[1])
-      rb_raise(rb_eRuntimeError, "square matrix required");
-    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
-    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    w = gsl_eigen_symmv_alloc(A->size1);
-    flagw = 1;
-    break;
-  default:
-    rb_raise(rb_eArgError, "matrix not given");
-    break;
-  }
-  shape1[0] = A->size1;
-  shape2[0] = A->size1;
-  shape2[1] = A->size1;
-  eval = na_make_object(NA_DFLOAT, 1, shape1, cNVector);
-  evec = na_make_object(NA_DFLOAT, 2, shape2, CLASS_OF(argv[0]));
-  vv = gsl_vector_view_array(NA_PTR_TYPE(eval,double*), A->size1);
-  mv = gsl_matrix_view_array(NA_PTR_TYPE(evec,double*), A->size1, A->size2);
-  gsl_eigen_symmv(A, &vv.vector, &mv.matrix, w);
-  /*  gsl_sort_vector(v);*/
-  gsl_matrix_free(A);
-  if (flagw == 1) gsl_eigen_symmv_free(w);
-  return rb_ary_new3(2, eval, evec);
-}
-#endif
-
 static VALUE rb_gsl_eigen_herm(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix_complex *Atmp = NULL, *A = NULL;
@@ -360,9 +346,9 @@ static VALUE rb_gsl_eigen_herm(int argc, VALUE *argv, VALUE obj)
       CHECK_MATRIX_COMPLEX(argv[0]);
       Data_Get_Struct(argv[0], gsl_matrix_complex, Atmp);
       if (CLASS_OF(argv[1]) != cgsl_eigen_herm_workspace)
-	rb_raise(rb_eTypeError, 
-		 "argv[1]: wrong argument type %s (Eigen::Herm::Workspace expected)", 
-		 rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError,
+                 "argv[1]: wrong argument type %s (Eigen::Herm::Workspace expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       Data_Get_Struct(argv[1], gsl_eigen_herm_workspace, w);
       break;
     case 1:
@@ -381,10 +367,9 @@ static VALUE rb_gsl_eigen_herm(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 1:
       if (CLASS_OF(argv[0]) != cgsl_eigen_herm_workspace)
-	rb_raise(rb_eTypeError, 
-		 "argv[0]: wrong argument type %s (Eigen::Herm::Workspace expected)", 
-		 rb_class2name(CLASS_OF(argv[0])));
-
+        rb_raise(rb_eTypeError,
+                 "argv[0]: wrong argument type %s (Eigen::Herm::Workspace expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_eigen_herm_workspace, w);
       break;
     case 0:
@@ -420,9 +405,9 @@ static VALUE rb_gsl_eigen_hermv(int argc, VALUE *argv, VALUE obj)
       CHECK_MATRIX_COMPLEX(argv[0]);
       Data_Get_Struct(argv[0], gsl_matrix_complex, Atmp);
       if (CLASS_OF(argv[1]) != cgsl_eigen_hermv_workspace)
-	rb_raise(rb_eTypeError, 
-		 "argv[1]: wrong argument type %s (Eigen::Hermv::Workspace expected)", 
-		 rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError,
+                 "argv[1]: wrong argument type %s (Eigen::Hermv::Workspace expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       Data_Get_Struct(argv[1], gsl_eigen_hermv_workspace, w);
       break;
     case 1:
@@ -441,10 +426,9 @@ static VALUE rb_gsl_eigen_hermv(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 1:
       if (CLASS_OF(argv[0]) != cgsl_eigen_hermv_workspace)
-	rb_raise(rb_eTypeError, 
-		 "argv[0]: wrong argument type %s (Eigen::Hermv::Workspace expected)", 
-		 rb_class2name(CLASS_OF(argv[0])));
-
+        rb_raise(rb_eTypeError,
+                 "argv[0]: wrong argument type %s (Eigen::Hermv::Workspace expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       Data_Get_Struct(argv[0], gsl_eigen_hermv_workspace, w);
       break;
     case 0:
@@ -500,7 +484,7 @@ static VALUE rb_gsl_eigen_vectors_complex_unpack(VALUE obj)
   for (i = 0; i < m->size1; i++) {
     v = gsl_vector_complex_alloc(m->size2);
     for (j = 0; j < m->size2; j++) {
-      z= gsl_matrix_complex_get(m, j, i);
+      z = gsl_matrix_complex_get(m, j, i);
       gsl_vector_complex_set(v, j, z);
     }
     tmp = Data_Wrap_Struct(cgsl_eigen_vector_complex, 0, gsl_vector_complex_free, v);
@@ -515,7 +499,7 @@ static void rb_gsl_eigen_define_const(VALUE topmodule, VALUE module)
   rb_define_const(topmodule, "EIGEN_SORT_VAL_DESC", INT2FIX(GSL_EIGEN_SORT_VAL_DESC));
   rb_define_const(topmodule, "EIGEN_SORT_ABS_ASC", INT2FIX(GSL_EIGEN_SORT_ABS_ASC));
   rb_define_const(topmodule, "EIGEN_SORT_ABS_DESC", INT2FIX(GSL_EIGEN_SORT_ABS_DESC));
-    
+
   rb_define_const(module, "SORT_VAL_ASC", INT2FIX(GSL_EIGEN_SORT_VAL_ASC));
   rb_define_const(module, "SORT_VAL_DESC", INT2FIX(GSL_EIGEN_SORT_VAL_DESC));
   rb_define_const(module, "SORT_ABS_ASC", INT2FIX(GSL_EIGEN_SORT_ABS_ASC));
@@ -528,7 +512,7 @@ static void rb_gsl_eigen_define_const(VALUE topmodule, VALUE module)
 }
 
 static VALUE rb_gsl_eigen_real_sort(int argc, VALUE *argv, VALUE obj,
-  int (*sortfunc)(gsl_vector*, gsl_matrix*, gsl_eigen_sort_t))
+                                    int (*sortfunc)(gsl_vector*, gsl_matrix*, gsl_eigen_sort_t))
 {
   gsl_vector *v = NULL;
   gsl_matrix *m = NULL;
@@ -537,10 +521,10 @@ static VALUE rb_gsl_eigen_real_sort(int argc, VALUE *argv, VALUE obj,
   case 3:
     CHECK_FIXNUM(argv[2]);
     type = FIX2INT(argv[2]);
-    /* no break, do next */
+  /* no break, do next */
   case 2:
     if (argv[0] == Qnil) {
-       v = NULL;
+      v = NULL;
     } else {
       CHECK_VECTOR(argv[0]);
       Data_Get_Struct(argv[0], gsl_vector, v);
@@ -560,7 +544,7 @@ static VALUE rb_gsl_eigen_real_sort(int argc, VALUE *argv, VALUE obj,
 
 
 static VALUE rb_gsl_eigen_complex_sort(int argc, VALUE *argv, VALUE obj,
-  int (*sortfunc)(gsl_vector*, gsl_matrix_complex*, gsl_eigen_sort_t))
+                                       int (*sortfunc)(gsl_vector*, gsl_matrix_complex*, gsl_eigen_sort_t))
 {
   gsl_vector *v = NULL;
   gsl_matrix_complex *m = NULL;
@@ -570,7 +554,7 @@ static VALUE rb_gsl_eigen_complex_sort(int argc, VALUE *argv, VALUE obj,
   case 3:
     CHECK_FIXNUM(argv[2]);
     type = FIX2INT(argv[2]);
-    /* no break, do next */
+  /* no break, do next */
   case 2:
     if (argv[0] == Qnil) {
       v = NULL;
@@ -582,7 +566,7 @@ static VALUE rb_gsl_eigen_complex_sort(int argc, VALUE *argv, VALUE obj,
       m = NULL;
     } else {
       CHECK_MATRIX_COMPLEX(argv[1]);
-      Data_Get_Struct(argv[1], gsl_matrix_complex, m);        
+      Data_Get_Struct(argv[1], gsl_matrix_complex, m);
     }
     break;
   default:
@@ -596,7 +580,7 @@ static VALUE rb_gsl_eigen_symmv_sort(int argc, VALUE *argv, VALUE obj)
 }
 static VALUE rb_gsl_eigen_hermv_sort(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_eigen_complex_sort(argc, argv, obj, gsl_eigen_hermv_sort);  
+  return rb_gsl_eigen_complex_sort(argc, argv, obj, gsl_eigen_hermv_sort);
 }
 
 
@@ -626,7 +610,59 @@ static VALUE rb_gsl_eigen_francis_T(int argc, VALUE *argv, VALUE obj)
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_francis_narray(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_gsl_eigen_francis_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *na;
+  VALUE nary;
+  gsl_matrix *A = NULL;
+  gsl_eigen_francis_workspace *w = NULL;
+  gsl_vector_complex_view vv;
+  int shape[1];
+  int flagw = 0;
+  switch (argc) {
+  case 2:
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
+    GetNArray(argv[0], na);
+    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
+    if (na->shape[0] != na->shape[1])
+      rb_raise(rb_eRuntimeError, "square matrix required");
+    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
+    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
+    if (CLASS_OF(argv[1]) != cgsl_eigen_francis_workspace)
+      rb_raise(rb_eTypeError,
+               "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected",
+               rb_class2name(CLASS_OF(argv[1])));
+    Data_Get_Struct(argv[1], gsl_eigen_francis_workspace, w);
+    flagw = 0;
+    break;
+  case 1:
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
+    GetNArray(argv[0], na);
+    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
+    if (na->shape[0] != na->shape[1])
+      rb_raise(rb_eRuntimeError, "square matrix required");
+    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
+    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
+    w = gsl_eigen_francis_alloc();
+    flagw = 1;
+    break;
+  default:
+    rb_raise(rb_eArgError, "matrix not given");
+    break;
+  }
+  shape[0] = A->size1;
+  nary = na_make_object(NA_DCOMPLEX, 1, shape, cNVector);
+  vv = gsl_vector_complex_view_array(NA_PTR_TYPE(nary,double*), A->size1);
+  gsl_eigen_francis(A, &vv.vector, w);
+  /*  gsl_sort_vector(v);*/
+  gsl_matrix_free(A);
+  if (flagw == 1) gsl_eigen_francis_free(w);
+  return nary;
+}
 #endif
 
 static VALUE rb_gsl_eigen_francis(int argc, VALUE *argv, VALUE obj)
@@ -640,7 +676,7 @@ static VALUE rb_gsl_eigen_francis(int argc, VALUE *argv, VALUE obj)
 
 #ifdef HAVE_NARRAY_H
   if (NA_IsNArray(obj)) return rb_gsl_eigen_francis_narray(argc, argv, obj);
-  if (argc >= 1 && NA_IsNArray(argv[0])) 
+  if (argc >= 1 && NA_IsNArray(argv[0]))
     return rb_gsl_eigen_francis_narray(argc, argv, obj);
 #endif
 
@@ -654,7 +690,6 @@ static VALUE rb_gsl_eigen_francis(int argc, VALUE *argv, VALUE obj)
     istart = 1;
     argv2 = argv + 1;
   }
-
   switch (argc-istart) {
   case 0:
     v = gsl_vector_complex_alloc(m->size1);
@@ -666,7 +701,7 @@ static VALUE rb_gsl_eigen_francis(int argc, VALUE *argv, VALUE obj)
     if (CLASS_OF(argv2[0]) == cgsl_vector_complex) {
       Data_Get_Struct(argv2[0], gsl_vector_complex, v);
       w = gsl_eigen_francis_alloc();
-      wflag = 1;      
+      wflag = 1;
     } else if (CLASS_OF(argv2[0]) == cgsl_eigen_francis_workspace) {
       v = gsl_vector_complex_alloc(m->size1);
       vflag = 1;
@@ -696,62 +731,6 @@ static VALUE rb_gsl_eigen_francis(int argc, VALUE *argv, VALUE obj)
     return argv2[0];
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_francis_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *na;
-  VALUE nary;
-  gsl_matrix *A = NULL;
-  gsl_eigen_francis_workspace *w = NULL;
-  gsl_vector_complex_view vv;
-  int shape[1];
-  int flagw = 0;
-  switch (argc) {
-  case 2:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
-    GetNArray(argv[0], na);
-    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
-    if (na->shape[0] != na->shape[1])
-      rb_raise(rb_eRuntimeError, "square matrix required");
-    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
-    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    if (CLASS_OF(argv[1]) != cgsl_eigen_francis_workspace)
-      rb_raise(rb_eTypeError, 
-	       "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected", 
-	       rb_class2name(CLASS_OF(argv[1])));
-    Data_Get_Struct(argv[1], gsl_eigen_francis_workspace, w);
-    flagw = 0;
-    break;
-  case 1:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
-    GetNArray(argv[0], na);
-    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
-    if (na->shape[0] != na->shape[1])
-      rb_raise(rb_eRuntimeError, "square matrix required");
-    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
-    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    w = gsl_eigen_francis_alloc();
-    flagw = 1;
-    break;
-  default:
-    rb_raise(rb_eArgError, "matrix not given");
-    break;
-  }
-  shape[0] = A->size1;
-  nary = na_make_object(NA_DCOMPLEX, 1, shape, cNVector);
-  vv = gsl_vector_complex_view_array(NA_PTR_TYPE(nary,double*), A->size1);
-  gsl_eigen_francis(A, &vv.vector, w);
-  /*  gsl_sort_vector(v);*/
-  gsl_matrix_free(A);
-  if (flagw == 1) gsl_eigen_francis_free(w);
-  return nary;
-}
-#endif
-
 static VALUE rb_gsl_eigen_francis_Z(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix *m, *mtmp, *Z;
@@ -771,7 +750,6 @@ static VALUE rb_gsl_eigen_francis_Z(int argc, VALUE *argv, VALUE obj)
     istart = 1;
     argv2 = argv + 1;
   }
-
   switch (argc-istart) {
   case 0:
     v = gsl_vector_complex_alloc(m->size1);
@@ -819,7 +797,6 @@ static VALUE rb_gsl_eigen_francis_Z(int argc, VALUE *argv, VALUE obj)
 }
 #endif
 
-#ifdef GSL_1_9_LATER
 static VALUE rb_gsl_eigen_nonsymm_alloc(VALUE klass, VALUE nn)
 {
   size_t n;
@@ -852,78 +829,7 @@ static VALUE rb_gsl_eigen_nonsymm_params(int argc, VALUE *argv, VALUE obj)
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_nonsymm_narray(int argc, VALUE *argv, VALUE obj);
-#endif
-
-static VALUE rb_gsl_eigen_nonsymm(int argc, VALUE *argv, VALUE obj)
-{
-  gsl_matrix *m;
-  gsl_vector_complex *v;
-  gsl_eigen_nonsymm_workspace *w;
-  int vflag = 0, wflag = 0;
-  int istart = 0;
-  VALUE *argv2;
-
-#ifdef HAVE_NARRAY_H
-  if (NA_IsNArray(obj)) return rb_gsl_eigen_nonsymm_narray(argc, argv, obj);
-  if (argc >= 1 && NA_IsNArray(argv[0])) 
-    return rb_gsl_eigen_nonsymm_narray(argc, argv, obj);
-#endif
-
-  if (MATRIX_P(obj)) {
-    Data_Get_Struct(obj, gsl_matrix, m);
-    argv2 = argv;
-    istart = 0;
-  } else {
-    if (argc < 1) rb_raise(rb_eArgError, "Wrong number of arguments.\n");
-    Data_Get_Struct(argv[0], gsl_matrix, m);
-    istart = 1;
-    argv2 = argv + 1;
-  }
-
-  switch (argc-istart) {
-  case 0:
-    v = gsl_vector_complex_alloc(m->size1);
-    w = gsl_eigen_nonsymm_alloc(m->size1);
-    vflag = 1;
-    wflag = 1;
-    break;
-  case 1:
-    if (CLASS_OF(argv2[0]) == cgsl_vector_complex) {
-      Data_Get_Struct(argv2[0], gsl_vector_complex, v);
-      w = gsl_eigen_nonsymm_alloc(m->size1);
-      wflag = 1;      
-    } else if (CLASS_OF(argv2[0]) == cgsl_eigen_nonsymm_workspace) {
-      v = gsl_vector_complex_alloc(m->size1);
-      vflag = 1;
-      Data_Get_Struct(argv2[0], gsl_eigen_nonsymm_workspace, w);
-    } else {
-      rb_raise(rb_eArgError, "Wrong argument type.\n");
-    }
-    break;
-  case 2:
-    CHECK_VECTOR_COMPLEX(argv2[0]);
-    if (CLASS_OF(argv2[1]) != cgsl_eigen_nonsymm_workspace) {
-      rb_raise(rb_eArgError, "argv[1] must be a GSL::Eigen::Nonsymm::Workspace.\n");
-    }
-    Data_Get_Struct(argv2[0], gsl_vector_complex, v);
-    Data_Get_Struct(argv2[1], gsl_eigen_nonsymm_workspace, w);
-    break;
-  default:
-    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 0-2).\n", argc);
-  }
-//  mtmp = make_matrix_clone(m);
-  gsl_eigen_nonsymm(m, v, w);
-//  gsl_matrix_free(mtmp);
-  if (wflag == 1) gsl_eigen_nonsymm_free(w);
-  if (vflag == 1)
-    return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, v);
-  else
-    return argv2[0];
-}
-
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_nonsymm_narray(int argc, VALUE *argv, VALUE obj)
+static VALUE rb_gsl_eigen_nonsymm_narray(int argc, VALUE *argv, VALUE obj)
 {
   struct NARRAY *na;
   VALUE nary;
@@ -934,9 +840,9 @@ static VALUE rb_gsl_eigen_nonsymm_narray(int argc, VALUE *argv, VALUE obj)
   int flagw = 0;
   switch (argc) {
   case 2:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     GetNArray(argv[0], na);
     if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
     if (na->shape[0] != na->shape[1])
@@ -944,16 +850,16 @@ static VALUE rb_gsl_eigen_nonsymm_narray(int argc, VALUE *argv, VALUE obj)
     A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
     memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
     if (CLASS_OF(argv[1]) != cgsl_eigen_nonsymm_workspace)
-      rb_raise(rb_eTypeError, 
-	       "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected", 
-	       rb_class2name(CLASS_OF(argv[1])));
+      rb_raise(rb_eTypeError,
+               "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected",
+               rb_class2name(CLASS_OF(argv[1])));
     Data_Get_Struct(argv[1], gsl_eigen_nonsymm_workspace, w);
     flagw = 0;
     break;
   case 1:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     GetNArray(argv[0], na);
     if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
     if (na->shape[0] != na->shape[1])
@@ -978,6 +884,72 @@ static VALUE rb_gsl_eigen_nonsymm_narray(int argc, VALUE *argv, VALUE obj)
 }
 #endif
 
+static VALUE rb_gsl_eigen_nonsymm(int argc, VALUE *argv, VALUE obj)
+{
+  gsl_matrix *m;
+  gsl_vector_complex *v;
+  gsl_eigen_nonsymm_workspace *w;
+  int vflag = 0, wflag = 0;
+  int istart = 0;
+  VALUE *argv2;
+
+#ifdef HAVE_NARRAY_H
+  if (NA_IsNArray(obj)) return rb_gsl_eigen_nonsymm_narray(argc, argv, obj);
+  if (argc >= 1 && NA_IsNArray(argv[0]))
+    return rb_gsl_eigen_nonsymm_narray(argc, argv, obj);
+#endif
+
+  if (MATRIX_P(obj)) {
+    Data_Get_Struct(obj, gsl_matrix, m);
+    argv2 = argv;
+    istart = 0;
+  } else {
+    if (argc < 1) rb_raise(rb_eArgError, "Wrong number of arguments.\n");
+    Data_Get_Struct(argv[0], gsl_matrix, m);
+    istart = 1;
+    argv2 = argv + 1;
+  }
+  switch (argc-istart) {
+  case 0:
+    v = gsl_vector_complex_alloc(m->size1);
+    w = gsl_eigen_nonsymm_alloc(m->size1);
+    vflag = 1;
+    wflag = 1;
+    break;
+  case 1:
+    if (CLASS_OF(argv2[0]) == cgsl_vector_complex) {
+      Data_Get_Struct(argv2[0], gsl_vector_complex, v);
+      w = gsl_eigen_nonsymm_alloc(m->size1);
+      wflag = 1;
+    } else if (CLASS_OF(argv2[0]) == cgsl_eigen_nonsymm_workspace) {
+      v = gsl_vector_complex_alloc(m->size1);
+      vflag = 1;
+      Data_Get_Struct(argv2[0], gsl_eigen_nonsymm_workspace, w);
+    } else {
+      rb_raise(rb_eArgError, "Wrong argument type.\n");
+    }
+    break;
+  case 2:
+    CHECK_VECTOR_COMPLEX(argv2[0]);
+    if (CLASS_OF(argv2[1]) != cgsl_eigen_nonsymm_workspace) {
+      rb_raise(rb_eArgError, "argv[1] must be a GSL::Eigen::Nonsymm::Workspace.\n");
+    }
+    Data_Get_Struct(argv2[0], gsl_vector_complex, v);
+    Data_Get_Struct(argv2[1], gsl_eigen_nonsymm_workspace, w);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 0-2).\n", argc);
+  }
+//  mtmp = make_matrix_clone(m);
+  gsl_eigen_nonsymm(m, v, w);
+//  gsl_matrix_free(mtmp);
+  if (wflag == 1) gsl_eigen_nonsymm_free(w);
+  if (vflag == 1)
+    return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, v);
+  else
+    return argv2[0];
+}
+
 static VALUE rb_gsl_eigen_nonsymm_Z(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix *m, *Z;
@@ -997,7 +969,6 @@ static VALUE rb_gsl_eigen_nonsymm_Z(int argc, VALUE *argv, VALUE obj)
     istart = 1;
     argv2 = argv + 1;
   }
-
   switch (argc-istart) {
   case 0:
     v = gsl_vector_complex_alloc(m->size1);
@@ -1054,7 +1025,62 @@ static VALUE rb_gsl_eigen_nonsymmv_alloc(VALUE klass, VALUE nn)
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_nonsymmv_narray(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_gsl_eigen_nonsymmv_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *na;
+  VALUE nary, nvec;
+  gsl_matrix *A = NULL;
+  gsl_eigen_nonsymmv_workspace *w = NULL;
+  gsl_vector_complex_view vv;
+  gsl_matrix_complex_view mm;
+  int shape[1], shape2[2];
+  int flagw = 0;
+  switch (argc) {
+  case 2:
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
+    GetNArray(argv[0], na);
+    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
+    if (na->shape[0] != na->shape[1])
+      rb_raise(rb_eRuntimeError, "square matrix required");
+    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
+    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
+    if (CLASS_OF(argv[1]) != cgsl_eigen_nonsymmv_workspace)
+      rb_raise(rb_eTypeError,
+               "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected",
+               rb_class2name(CLASS_OF(argv[1])));
+    Data_Get_Struct(argv[1], gsl_eigen_nonsymmv_workspace, w);
+    flagw = 0;
+    break;
+  case 1:
+    if (!NA_IsNArray(argv[0]))
+      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)",
+               rb_class2name(CLASS_OF(argv[0])));
+    GetNArray(argv[0], na);
+    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
+    if (na->shape[0] != na->shape[1])
+      rb_raise(rb_eRuntimeError, "square matrix required");
+    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
+    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
+    w = gsl_eigen_nonsymmv_alloc(A->size1);
+    flagw = 1;
+    break;
+  default:
+    rb_raise(rb_eArgError, "matrix not given");
+    break;
+  }
+  shape[0] = A->size1; shape2[0] = A->size1; shape2[1] = A->size2;
+  nary = na_make_object(NA_DCOMPLEX, 1, shape, cNVector);
+  vv = gsl_vector_complex_view_array(NA_PTR_TYPE(nary,double*), A->size1);
+  nvec = na_make_object(NA_DCOMPLEX, 2, shape2, CLASS_OF(argv[0]));
+  mm = gsl_matrix_complex_view_array(NA_PTR_TYPE(nvec,double*), A->size1, A->size2);
+  gsl_eigen_nonsymmv(A, &vv.vector, &mm.matrix, w);
+  /*  gsl_sort_vector(v);*/
+  gsl_matrix_free(A);
+  if (flagw == 1) gsl_eigen_nonsymmv_free(w);
+  return rb_ary_new3(2, nary, nvec);
+}
 #endif
 
 static VALUE rb_gsl_eigen_nonsymmv(int argc, VALUE *argv, VALUE obj)
@@ -1069,7 +1095,7 @@ static VALUE rb_gsl_eigen_nonsymmv(int argc, VALUE *argv, VALUE obj)
 
 #ifdef HAVE_NARRAY_H
   if (NA_IsNArray(obj)) return rb_gsl_eigen_nonsymmv_narray(argc, argv, obj);
-  if (argc >= 1 && NA_IsNArray(argv[0])) 
+  if (argc >= 1 && NA_IsNArray(argv[0]))
     return rb_gsl_eigen_nonsymmv_narray(argc, argv, obj);
 #endif
 
@@ -1083,7 +1109,6 @@ static VALUE rb_gsl_eigen_nonsymmv(int argc, VALUE *argv, VALUE obj)
     istart = 1;
     argv2 = argv + 1;
   }
-
   switch (argc-istart) {
   case 0:
     v = gsl_vector_complex_alloc(m->size1);
@@ -1127,73 +1152,14 @@ static VALUE rb_gsl_eigen_nonsymmv(int argc, VALUE *argv, VALUE obj)
 
   if (wflag == 1) gsl_eigen_nonsymmv_free(w);
   if (vflag == 1) {
-    return rb_ary_new3(2, 
-		       Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, v),
-		       Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, evec));
+    return rb_ary_new3(2,
+                       Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, v),
+                       Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, evec));
   }  else {
     return rb_ary_new3(2, argv2[0], argv2[1]);
   }
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_eigen_nonsymmv_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *na;
-  VALUE nary, nvec;
-  gsl_matrix *A = NULL;
-  gsl_eigen_nonsymmv_workspace *w = NULL;
-  gsl_vector_complex_view vv;
-  gsl_matrix_complex_view mm;
-  int shape[1], shape2[2];
-  int flagw = 0;
-  switch (argc) {
-  case 2:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
-    GetNArray(argv[0], na);
-    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
-    if (na->shape[0] != na->shape[1])
-      rb_raise(rb_eRuntimeError, "square matrix required");
-    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
-    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    if (CLASS_OF(argv[1]) != cgsl_eigen_nonsymmv_workspace)
-      rb_raise(rb_eTypeError, 
-	       "argv[1]:  wrong argument type %s (Eigen::Symm::Workspace expected", 
-	       rb_class2name(CLASS_OF(argv[1])));
-    Data_Get_Struct(argv[1], gsl_eigen_nonsymmv_workspace, w);
-    flagw = 0;
-    break;
-  case 1:
-    if (!NA_IsNArray(argv[0])) 
-      rb_raise(rb_eTypeError, "wrong argument type %s (NArray expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
-    GetNArray(argv[0], na);
-    if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
-    if (na->shape[0] != na->shape[1])
-      rb_raise(rb_eRuntimeError, "square matrix required");
-    A = gsl_matrix_alloc(na->shape[1], na->shape[0]);
-    memcpy(A->data, (double*) na->ptr, sizeof(double)*A->size1*A->size2);
-    w = gsl_eigen_nonsymmv_alloc(A->size1);
-    flagw = 1;
-    break;
-  default:
-    rb_raise(rb_eArgError, "matrix not given");
-    break;
-  }
-  shape[0] = A->size1; shape2[0] = A->size1; shape2[1] = A->size2;
-  nary = na_make_object(NA_DCOMPLEX, 1, shape, cNVector);
-  vv = gsl_vector_complex_view_array(NA_PTR_TYPE(nary,double*), A->size1);
-  nvec = na_make_object(NA_DCOMPLEX, 2, shape2, CLASS_OF(argv[0]));
-  mm = gsl_matrix_complex_view_array(NA_PTR_TYPE(nvec,double*), A->size1, A->size2);
-  gsl_eigen_nonsymmv(A, &vv.vector, &mm.matrix, w);
-  /*  gsl_sort_vector(v);*/
-  gsl_matrix_free(A);
-  if (flagw == 1) gsl_eigen_nonsymmv_free(w);
-  return rb_ary_new3(2, nary, nvec);
-}
-#endif
-
 static VALUE rb_gsl_eigen_nonsymmv_Z(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix *m, *Z = NULL;
@@ -1214,7 +1180,6 @@ static VALUE rb_gsl_eigen_nonsymmv_Z(int argc, VALUE *argv, VALUE obj)
     istart = 1;
     argv2 = argv + 1;
   }
-
   switch (argc-istart) {
   case 0:
     v = gsl_vector_complex_alloc(m->size1);
@@ -1262,17 +1227,17 @@ static VALUE rb_gsl_eigen_nonsymmv_Z(int argc, VALUE *argv, VALUE obj)
 
   if (wflag == 1) gsl_eigen_nonsymmv_free(w);
   if (vflag == 1) {
-    return rb_ary_new3(3, 
-		       Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, v),
-		       Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, evec),
-Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Z));
+    return rb_ary_new3(3,
+                       Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, v),
+                       Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, evec),
+                       Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Z));
   }  else {
     return rb_ary_new3(2, argv2[0], argv2[1], argv2[2]);
   }
 }
 
 static VALUE rb_gsl_eigen_complex_sort2(int argc, VALUE *argv, VALUE obj,
-  int (*sortfunc)(gsl_vector_complex*, gsl_matrix_complex*, gsl_eigen_sort_t))
+                                        int (*sortfunc)(gsl_vector_complex*, gsl_matrix_complex*, gsl_eigen_sort_t))
 {
   gsl_vector_complex *v = NULL;
   gsl_matrix_complex *m = NULL;
@@ -1282,19 +1247,19 @@ static VALUE rb_gsl_eigen_complex_sort2(int argc, VALUE *argv, VALUE obj,
   case 3:
     CHECK_FIXNUM(argv[2]);
     type = FIX2INT(argv[2]);
-    /* no break, do next */
+  /* no break, do next */
   case 2:
     if (argv[0] == Qnil) {
       v = NULL;
     } else {
       CHECK_VECTOR_COMPLEX(argv[0]);
-      Data_Get_Struct(argv[0], gsl_vector_complex, v);      
+      Data_Get_Struct(argv[0], gsl_vector_complex, v);
     }
     if (argv[1] == Qnil) {
       m = NULL;
     } else {
       CHECK_MATRIX_COMPLEX(argv[1]);
-      Data_Get_Struct(argv[1], gsl_matrix_complex, m);  
+      Data_Get_Struct(argv[1], gsl_matrix_complex, m);
     }
     break;
   default:
@@ -1306,13 +1271,9 @@ static VALUE rb_gsl_eigen_complex_sort2(int argc, VALUE *argv, VALUE obj,
 
 static VALUE rb_gsl_eigen_nonsymmv_sort(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_eigen_complex_sort2(argc, argv, obj, gsl_eigen_nonsymmv_sort);  
+  return rb_gsl_eigen_complex_sort2(argc, argv, obj, gsl_eigen_nonsymmv_sort);
 }
 
-#endif
-
-#ifdef GSL_1_10_LATER
-
 static VALUE rb_gsl_eigen_gensymm_alloc(VALUE klass, VALUE nn)
 {
   gsl_eigen_gensymm_workspace *w = NULL;
@@ -1343,373 +1304,371 @@ static VALUE rb_gsl_eigen_genhermv_alloc(VALUE klass, VALUE nn)
 }
 
 static int check_argv_gensymm(int argc, VALUE *argv, VALUE obj, gsl_matrix **A, gsl_matrix **B,
-	gsl_vector **eval, gsl_eigen_gensymm_workspace **w)
+                              gsl_vector **eval, gsl_eigen_gensymm_workspace **w)
 {
-	int argc2 = argc;
-	int flag = 0;
-	if (CLASS_OF(obj) == cgensymm) {
-		Data_Get_Struct(obj, gsl_eigen_gensymm_workspace, *w);
-	} else {
-		if (rb_obj_is_kind_of(argv[argc-1], cgensymm)) {
-			Data_Get_Struct(argv[argc-1], gsl_eigen_gensymm_workspace, *w);
-			argc2 = argc-1;
-		} else {
-			/* workspace is not given */
-		}
-	}
-	switch (argc2) {
-	case 2:
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;
-	case 3:
-		if (rb_obj_is_kind_of(argv[2], cgensymm)) {
-			Data_Get_Struct(argv[2], gsl_eigen_gensymm_workspace, *w);
-		} else {
-			CHECK_VECTOR(argv[2]);
-			Data_Get_Struct(argv[2], gsl_vector, *eval);
-		}
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;
-	default:
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
-	}
-	if (*eval == NULL) {
-		*eval = gsl_vector_alloc((*A)->size1);
-		flag += 1;
-	}
-	if (*w == NULL) {
-		*w = gsl_eigen_gensymm_alloc((*A)->size1);
-		flag += 2;
-	}
-	return flag;
+  int argc2 = argc;
+  int flag = 0;
+  if (CLASS_OF(obj) == cgensymm) {
+    Data_Get_Struct(obj, gsl_eigen_gensymm_workspace, *w);
+  } else {
+    if (rb_obj_is_kind_of(argv[argc-1], cgensymm)) {
+      Data_Get_Struct(argv[argc-1], gsl_eigen_gensymm_workspace, *w);
+      argc2 = argc-1;
+    } else {
+      /* workspace is not given */
+    }
+  }
+  switch (argc2) {
+  case 2:
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  case 3:
+    if (rb_obj_is_kind_of(argv[2], cgensymm)) {
+      Data_Get_Struct(argv[2], gsl_eigen_gensymm_workspace, *w);
+    } else {
+      CHECK_VECTOR(argv[2]);
+      Data_Get_Struct(argv[2], gsl_vector, *eval);
+    }
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  default:
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
+  }
+  if (*eval == NULL) {
+    *eval = gsl_vector_alloc((*A)->size1);
+    flag += 1;
+  }
+  if (*w == NULL) {
+    *w = gsl_eigen_gensymm_alloc((*A)->size1);
+    flag += 2;
+  }
+  return flag;
 }
 
 static int check_argv_gensymmv(int argc, VALUE *argv, VALUE obj, gsl_matrix **A, gsl_matrix **B,
-	gsl_vector **eval, gsl_matrix **evec, gsl_eigen_gensymmv_workspace **w)
+                               gsl_vector **eval, gsl_matrix **evec, gsl_eigen_gensymmv_workspace **w)
 {
-	int argc2 = argc;
-	int flag = 0;
-	if (CLASS_OF(obj) == cgensymmv) {
-		Data_Get_Struct(obj, gsl_eigen_gensymmv_workspace, *w);
-	} else {
-		if (rb_obj_is_kind_of(argv[argc-1], cgensymmv)) {
-			Data_Get_Struct(argv[argc-1], gsl_eigen_gensymmv_workspace, *w);
-			argc2 = argc-1;
-		} else {
-
-			/* workspace is not given */
-		}
-	}
-
-	switch (argc2) {
-	case 2:
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;
-	case 3:
-		if (rb_obj_is_kind_of(argv[2], cgensymmv)) {
-			Data_Get_Struct(argv[2], gsl_eigen_gensymmv_workspace, *w);
-		} else {
+  int argc2 = argc;
+  int flag = 0;
+  if (CLASS_OF(obj) == cgensymmv) {
+    Data_Get_Struct(obj, gsl_eigen_gensymmv_workspace, *w);
+  } else {
+    if (rb_obj_is_kind_of(argv[argc-1], cgensymmv)) {
+      Data_Get_Struct(argv[argc-1], gsl_eigen_gensymmv_workspace, *w);
+      argc2 = argc-1;
+    } else {
+
+      /* workspace is not given */
+    }
+  }
+  switch (argc2) {
+  case 2:
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  case 3:
+    if (rb_obj_is_kind_of(argv[2], cgensymmv)) {
+      Data_Get_Struct(argv[2], gsl_eigen_gensymmv_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigen::Gensymmv::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[2])));
-		}
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-
-		break;
-	case 5:
-		if (rb_obj_is_kind_of(argv[4], cgensymmv)) {
-			Data_Get_Struct(argv[4], gsl_eigen_gensymmv_workspace, *w);
-		} else {
+               rb_class2name(CLASS_OF(argv[2])));
+    }
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+
+    break;
+  case 5:
+    if (rb_obj_is_kind_of(argv[4], cgensymmv)) {
+      Data_Get_Struct(argv[4], gsl_eigen_gensymmv_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigen::Gensymmv::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[4])));      
+               rb_class2name(CLASS_OF(argv[4])));
     }
-		CHECK_VECTOR(argv[2]);
-		Data_Get_Struct(argv[2], gsl_vector, *eval);
-		CHECK_MATRIX(argv[3]);
-		Data_Get_Struct(argv[3], gsl_matrix, *evec);			
-		
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;		
-	default:
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 5)", argc);
-  }
-	if (*eval == NULL && *evec == NULL) {
-		*eval = gsl_vector_alloc((*A)->size1);
-		*evec = gsl_matrix_alloc((*A)->size1, (*A)->size2);		
-		flag += 1;
-	}
-	if (*w == NULL) {
-		*w = gsl_eigen_gensymmv_alloc((*A)->size1);
-		flag += 2;
-	}
-	return flag;
+    CHECK_VECTOR(argv[2]);
+    Data_Get_Struct(argv[2], gsl_vector, *eval);
+    CHECK_MATRIX(argv[3]);
+    Data_Get_Struct(argv[3], gsl_matrix, *evec);
+
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  default:
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 5)", argc);
+  }
+  if (*eval == NULL && *evec == NULL) {
+    *eval = gsl_vector_alloc((*A)->size1);
+    *evec = gsl_matrix_alloc((*A)->size1, (*A)->size2);
+    flag += 1;
+  }
+  if (*w == NULL) {
+    *w = gsl_eigen_gensymmv_alloc((*A)->size1);
+    flag += 2;
+  }
+  return flag;
 }
 
 static int check_argv_genherm(int argc, VALUE *argv, VALUE obj, gsl_matrix_complex **A, gsl_matrix_complex **B,
-	gsl_vector **eval, gsl_eigen_genherm_workspace **w)
+                              gsl_vector **eval, gsl_eigen_genherm_workspace **w)
 {
-	int argc2 = argc;
-	int flag = 0;
-	if (CLASS_OF(obj) == cgenherm) {
-		Data_Get_Struct(obj, gsl_eigen_genherm_workspace, *w);
-	} else {
-		if (rb_obj_is_kind_of(argv[argc-1], cgenherm)) {
-			Data_Get_Struct(argv[argc-1], gsl_eigen_genherm_workspace, *w);
-			argc2 = argc-1;
-		} else {
-			/* workspace is not given */
-		}
-	}
-	switch (argc2) {
-	case 2:
-		CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
-		Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
-		break;
-	case 3:
-		if (rb_obj_is_kind_of(argv[2], cgenherm)) {
-			Data_Get_Struct(argv[2], gsl_eigen_genherm_workspace, *w);
-		} else {
-			CHECK_VECTOR(argv[2]);
-			Data_Get_Struct(argv[2], gsl_vector, *eval);
-		}
-		CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
-		Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
-		break;
-	default:
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
-	}
-	if (*eval == NULL) {
-		*eval = gsl_vector_alloc((*A)->size1);
-		flag += 1;
-	}
-	if (*w == NULL) {
-		*w = gsl_eigen_genherm_alloc((*A)->size1);
-		flag += 2;
-	}
-	return flag;
+  int argc2 = argc;
+  int flag = 0;
+  if (CLASS_OF(obj) == cgenherm) {
+    Data_Get_Struct(obj, gsl_eigen_genherm_workspace, *w);
+  } else {
+    if (rb_obj_is_kind_of(argv[argc-1], cgenherm)) {
+      Data_Get_Struct(argv[argc-1], gsl_eigen_genherm_workspace, *w);
+      argc2 = argc-1;
+    } else {
+      /* workspace is not given */
+    }
+  }
+  switch (argc2) {
+  case 2:
+    CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
+    Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
+    break;
+  case 3:
+    if (rb_obj_is_kind_of(argv[2], cgenherm)) {
+      Data_Get_Struct(argv[2], gsl_eigen_genherm_workspace, *w);
+    } else {
+      CHECK_VECTOR(argv[2]);
+      Data_Get_Struct(argv[2], gsl_vector, *eval);
+    }
+    CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
+    Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
+    break;
+  default:
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
+  }
+  if (*eval == NULL) {
+    *eval = gsl_vector_alloc((*A)->size1);
+    flag += 1;
+  }
+  if (*w == NULL) {
+    *w = gsl_eigen_genherm_alloc((*A)->size1);
+    flag += 2;
+  }
+  return flag;
 }
 static int check_argv_genhermv(int argc, VALUE *argv, VALUE obj, gsl_matrix_complex **A, gsl_matrix_complex **B,
-	gsl_vector **eval, gsl_matrix_complex **evec, gsl_eigen_genhermv_workspace **w)
+                               gsl_vector **eval, gsl_matrix_complex **evec, gsl_eigen_genhermv_workspace **w)
 {
-	int argc2 = argc;
-	int flag = 0;
-	if (CLASS_OF(obj) == cgenhermv) {
-		Data_Get_Struct(obj, gsl_eigen_genhermv_workspace, *w);
-	} else {
-		if (rb_obj_is_kind_of(argv[argc-1], cgenhermv)) {
-			Data_Get_Struct(argv[argc-1], gsl_eigen_genhermv_workspace, *w);
-			argc2 = argc-1;
-		} else {
-
-			/* workspace is not given */
-		}
-	}
-
-	switch (argc2) {
-	case 2:
-		CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
-		Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
-		break;
-	case 3:
-		if (rb_obj_is_kind_of(argv[2], cgenhermv)) {
-			Data_Get_Struct(argv[2], gsl_eigen_genhermv_workspace, *w);
-		} else {
+  int argc2 = argc;
+  int flag = 0;
+  if (CLASS_OF(obj) == cgenhermv) {
+    Data_Get_Struct(obj, gsl_eigen_genhermv_workspace, *w);
+  } else {
+    if (rb_obj_is_kind_of(argv[argc-1], cgenhermv)) {
+      Data_Get_Struct(argv[argc-1], gsl_eigen_genhermv_workspace, *w);
+      argc2 = argc-1;
+    } else {
+
+      /* workspace is not given */
+    }
+  }
+  switch (argc2) {
+  case 2:
+    CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
+    Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
+    break;
+  case 3:
+    if (rb_obj_is_kind_of(argv[2], cgenhermv)) {
+      Data_Get_Struct(argv[2], gsl_eigen_genhermv_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigen::Genhermv::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[2])));
-		}
-		CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
-		Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
-
-		break;
-	case 5:
-		if (rb_obj_is_kind_of(argv[4], cgenhermv)) {
-			Data_Get_Struct(argv[4], gsl_eigen_genhermv_workspace, *w);
-		} else {
+               rb_class2name(CLASS_OF(argv[2])));
+    }
+    CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
+    Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
+
+    break;
+  case 5:
+    if (rb_obj_is_kind_of(argv[4], cgenhermv)) {
+      Data_Get_Struct(argv[4], gsl_eigen_genhermv_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigen::Genhermv::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[4])));      
+               rb_class2name(CLASS_OF(argv[4])));
     }
-		CHECK_VECTOR(argv[2]);
-		Data_Get_Struct(argv[2], gsl_vector, *eval);
-		CHECK_MATRIX_COMPLEX(argv[3]);
-		Data_Get_Struct(argv[3], gsl_matrix_complex, *evec);			
-		
-		CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
-		Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
-		break;		
-	default:
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 5)", argc);
-  }
-	if (*eval == NULL && *evec == NULL) {
-		*eval = gsl_vector_alloc((*A)->size1);
-		*evec = gsl_matrix_complex_alloc((*A)->size1, (*A)->size2);		
-		flag += 1;
-	}
-	if (*w == NULL) {
-		*w = gsl_eigen_genhermv_alloc((*A)->size1);
-		flag += 2;
-	}
-	return flag;
+    CHECK_VECTOR(argv[2]);
+    Data_Get_Struct(argv[2], gsl_vector, *eval);
+    CHECK_MATRIX_COMPLEX(argv[3]);
+    Data_Get_Struct(argv[3], gsl_matrix_complex, *evec);
+
+    CHECK_MATRIX_COMPLEX(argv[0]); CHECK_MATRIX_COMPLEX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix_complex, *A);
+    Data_Get_Struct(argv[1], gsl_matrix_complex, *B);
+    break;
+  default:
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 5)", argc);
+  }
+  if (*eval == NULL && *evec == NULL) {
+    *eval = gsl_vector_alloc((*A)->size1);
+    *evec = gsl_matrix_complex_alloc((*A)->size1, (*A)->size2);
+    flag += 1;
+  }
+  if (*w == NULL) {
+    *w = gsl_eigen_genhermv_alloc((*A)->size1);
+    flag += 2;
+  }
+  return flag;
 }
 static VALUE rb_gsl_eigen_gensymm(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix *A = NULL, *B = NULL;
-	gsl_matrix *Atmp = NULL;	
-	gsl_vector *eval = NULL;
-	gsl_eigen_gensymm_workspace *w = NULL;
-	int flag;
-	VALUE veval = Qnil;
-	flag = check_argv_gensymm(argc, argv, obj, &A, &B, &eval, &w);
+  gsl_matrix *A = NULL, *B = NULL;
+  gsl_matrix *Atmp = NULL;
+  gsl_vector *eval = NULL;
+  gsl_eigen_gensymm_workspace *w = NULL;
+  int flag;
+  VALUE veval = Qnil;
+  flag = check_argv_gensymm(argc, argv, obj, &A, &B, &eval, &w);
   Atmp = make_matrix_clone(A);
-//  Btmp = make_matrix_clone(B);  
-	gsl_eigen_gensymm(Atmp, B, eval, w);
+//  Btmp = make_matrix_clone(B);
+  gsl_eigen_gensymm(Atmp, B, eval, w);
   gsl_matrix_free(Atmp);
-//  gsl_matrix_free(Btmp);  
-	switch (flag) {
-	case 0:
-		veval = argv[2];
-		break;
-	case 1:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		break;
-	case 2:
-		veval = argv[2];
-		gsl_eigen_gensymm_free(w);
-		break;
-	case 3:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		gsl_eigen_gensymm_free(w);
-		break;
-	}
-
-	return veval;
+//  gsl_matrix_free(Btmp);
+  switch (flag) {
+  case 0:
+    veval = argv[2];
+    break;
+  case 1:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    break;
+  case 2:
+    veval = argv[2];
+    gsl_eigen_gensymm_free(w);
+    break;
+  case 3:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    gsl_eigen_gensymm_free(w);
+    break;
+  }
+
+  return veval;
 }
 
 static VALUE rb_gsl_eigen_gensymmv(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix *A = NULL, *B = NULL;
-	gsl_matrix *Atmp = NULL;
-	gsl_vector *eval = NULL;
-	gsl_matrix *evec = NULL;
-	gsl_eigen_gensymmv_workspace *w = NULL;
-	int flag;
-	VALUE veval = Qnil, vevec = Qnil;
-	flag = check_argv_gensymmv(argc, argv, obj, &A, &B, &eval, &evec, &w);
+  gsl_matrix *A = NULL, *B = NULL;
+  gsl_matrix *Atmp = NULL;
+  gsl_vector *eval = NULL;
+  gsl_matrix *evec = NULL;
+  gsl_eigen_gensymmv_workspace *w = NULL;
+  int flag;
+  VALUE veval = Qnil, vevec = Qnil;
+  flag = check_argv_gensymmv(argc, argv, obj, &A, &B, &eval, &evec, &w);
   Atmp = make_matrix_clone(A);
-//  Btmp = make_matrix_clone(B);  	
-	gsl_eigen_gensymmv(Atmp, B, eval, evec, w);
+//  Btmp = make_matrix_clone(B);
+  gsl_eigen_gensymmv(Atmp, B, eval, evec, w);
   gsl_matrix_free(Atmp);
-//  gsl_matrix_free(Btmp);  
-    
-	switch (flag) {
-	case 0:
-		veval = argv[2];
-		vevec = argv[3];		
-		break;
-	case 1:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		vevec = Data_Wrap_Struct(cgsl_eigen_vectors, 0, gsl_matrix_free, evec);		
-		break;
-	case 2:
-		veval = argv[2];
-		vevec = argv[3];
-		gsl_eigen_gensymmv_free(w);
-	  break;
-	case 3:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		vevec = Data_Wrap_Struct(cgsl_eigen_vectors, 0, gsl_matrix_free, evec);	
-		gsl_eigen_gensymmv_free(w);
-		break;
-	}
-
-	return rb_ary_new3(2, veval, vevec);
+//  gsl_matrix_free(Btmp);
+
+  switch (flag) {
+  case 0:
+    veval = argv[2];
+    vevec = argv[3];
+    break;
+  case 1:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    vevec = Data_Wrap_Struct(cgsl_eigen_vectors, 0, gsl_matrix_free, evec);
+    break;
+  case 2:
+    veval = argv[2];
+    vevec = argv[3];
+    gsl_eigen_gensymmv_free(w);
+    break;
+  case 3:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    vevec = Data_Wrap_Struct(cgsl_eigen_vectors, 0, gsl_matrix_free, evec);
+    gsl_eigen_gensymmv_free(w);
+    break;
+  }
+
+  return rb_ary_new3(2, veval, vevec);
 }
 
 static VALUE rb_gsl_eigen_genherm(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix_complex *A = NULL, *B = NULL;
-	gsl_matrix_complex *Atmp = NULL, *Btmp = NULL;	
-	gsl_vector *eval = NULL;
-	gsl_eigen_genherm_workspace *w = NULL;
-	int flag;
-	VALUE veval = Qnil;
-	flag = check_argv_genherm(argc, argv, obj, &A, &B, &eval, &w);
+  gsl_matrix_complex *A = NULL, *B = NULL;
+  gsl_matrix_complex *Atmp = NULL, *Btmp = NULL;
+  gsl_vector *eval = NULL;
+  gsl_eigen_genherm_workspace *w = NULL;
+  int flag;
+  VALUE veval = Qnil;
+  flag = check_argv_genherm(argc, argv, obj, &A, &B, &eval, &w);
   Atmp = make_matrix_complex_clone(A);
-  Btmp = make_matrix_complex_clone(B);  
-	gsl_eigen_genherm(Atmp, Btmp, eval, w);
+  Btmp = make_matrix_complex_clone(B);
+  gsl_eigen_genherm(Atmp, Btmp, eval, w);
   gsl_matrix_complex_free(Atmp);
-  gsl_matrix_complex_free(Btmp);  
-	switch (flag) {
-	case 0:
-		veval = argv[2];
-		break;
-	case 1:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		break;
-	case 2:
-		veval = argv[2];
-		gsl_eigen_genherm_free(w);
-		break;
-	case 3:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		gsl_eigen_genherm_free(w);
-		break;
-	}
-
-	return veval;
+  gsl_matrix_complex_free(Btmp);
+  switch (flag) {
+  case 0:
+    veval = argv[2];
+    break;
+  case 1:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    break;
+  case 2:
+    veval = argv[2];
+    gsl_eigen_genherm_free(w);
+    break;
+  case 3:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    gsl_eigen_genherm_free(w);
+    break;
+  }
+
+  return veval;
 }
 
 static VALUE rb_gsl_eigen_genhermv(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix_complex *A = NULL, *B = NULL;
-	gsl_matrix_complex *Atmp = NULL, *Btmp = NULL;		
-	gsl_vector *eval = NULL;
-	gsl_matrix_complex *evec = NULL;
-	gsl_eigen_genhermv_workspace *w = NULL;
-	int flag;
-	VALUE veval = Qnil, vevec = Qnil;
-	flag = check_argv_genhermv(argc, argv, obj, &A, &B, &eval, &evec, &w);
+  gsl_matrix_complex *A = NULL, *B = NULL;
+  gsl_matrix_complex *Atmp = NULL, *Btmp = NULL;
+  gsl_vector *eval = NULL;
+  gsl_matrix_complex *evec = NULL;
+  gsl_eigen_genhermv_workspace *w = NULL;
+  int flag;
+  VALUE veval = Qnil, vevec = Qnil;
+  flag = check_argv_genhermv(argc, argv, obj, &A, &B, &eval, &evec, &w);
   Atmp = make_matrix_complex_clone(A);
-  Btmp = make_matrix_complex_clone(B);  	
-	gsl_eigen_genhermv(Atmp, Btmp, eval, evec, w);
+  Btmp = make_matrix_complex_clone(B);
+  gsl_eigen_genhermv(Atmp, Btmp, eval, evec, w);
   gsl_matrix_complex_free(Atmp);
-  gsl_matrix_complex_free(Btmp);  
-    
-	switch (flag) {
-	case 0:
-		veval = argv[2];
-		vevec = argv[3];		
-		break;
-	case 1:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);		
-		break;
-	case 2:
-		veval = argv[2];
-		vevec = argv[3];
-		gsl_eigen_genhermv_free(w);
-	  break;
-	case 3:
-		veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
-		vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);	
-		gsl_eigen_genhermv_free(w);
-		break;
-	}
-
-	return rb_ary_new3(2, veval, vevec);
+  gsl_matrix_complex_free(Btmp);
+
+  switch (flag) {
+  case 0:
+    veval = argv[2];
+    vevec = argv[3];
+    break;
+  case 1:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
+    break;
+  case 2:
+    veval = argv[2];
+    vevec = argv[3];
+    gsl_eigen_genhermv_free(w);
+    break;
+  case 3:
+    veval = Data_Wrap_Struct(cgsl_eigen_values, 0, gsl_vector_free, eval);
+    vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
+    gsl_eigen_genhermv_free(w);
+    break;
+  }
+
+  return rb_ary_new3(2, veval, vevec);
 }
 
 static VALUE rb_gsl_eigen_gensymmv_sort(int argc, VALUE *argv, VALUE obj)
@@ -1718,7 +1677,7 @@ static VALUE rb_gsl_eigen_gensymmv_sort(int argc, VALUE *argv, VALUE obj)
 }
 static VALUE rb_gsl_eigen_genhermv_sort(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_eigen_complex_sort(argc, argv, obj, gsl_eigen_genhermv_sort);  
+  return rb_gsl_eigen_complex_sort(argc, argv, obj, gsl_eigen_genhermv_sort);
 }
 
 static VALUE rb_gsl_eigen_gen_alloc(VALUE klass, VALUE n)
@@ -1744,9 +1703,9 @@ static VALUE rb_gsl_eigen_gen_params(int argc, VALUE *argv, VALUE obj)
     istart = 0;
   } else {
     if (argc != 4) rb_raise(rb_eArgError, "too few arguments (%d for 3)\n", argc);
-    if (CLASS_OF(argv[3]) != cgenw) 
+    if (CLASS_OF(argv[3]) != cgenw)
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigen::Gen::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[3])));
+               rb_class2name(CLASS_OF(argv[3])));
     Data_Get_Struct(argv[3], gsl_eigen_gen_workspace, w);
     istart = 1;
   }
@@ -1761,318 +1720,316 @@ static VALUE rb_gsl_eigen_gen_params(int argc, VALUE *argv, VALUE obj)
 }
 
 static int check_argv_gen(int argc, VALUE *argv, VALUE obj, gsl_matrix **A, gsl_matrix **B,
-	gsl_vector_complex **alpha, gsl_vector **beta, gsl_eigen_gen_workspace **w)
+                          gsl_vector_complex **alpha, gsl_vector **beta, gsl_eigen_gen_workspace **w)
 {
-	int argc2 = argc;
-	int flag = 0;
-	if (CLASS_OF(obj) == cgenw) {
-		Data_Get_Struct(obj, gsl_eigen_gen_workspace, *w);
-	} else {
-		if (rb_obj_is_kind_of(argv[argc-1], cgenw)) {
-			Data_Get_Struct(argv[argc-1], gsl_eigen_gen_workspace, *w);
-			argc2 = argc-1;
-		} else {
-
-			/* workspace is not given */
-		}
-	}
-
-	switch (argc2) {
-	case 2:
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;
-	case 3:
-		if (rb_obj_is_kind_of(argv[2], cgenw)) {
-			Data_Get_Struct(argv[2], gsl_eigen_gen_workspace, *w);
-		} else {
+  int argc2 = argc;
+  int flag = 0;
+  if (CLASS_OF(obj) == cgenw) {
+    Data_Get_Struct(obj, gsl_eigen_gen_workspace, *w);
+  } else {
+    if (rb_obj_is_kind_of(argv[argc-1], cgenw)) {
+      Data_Get_Struct(argv[argc-1], gsl_eigen_gen_workspace, *w);
+      argc2 = argc-1;
+    } else {
+
+      /* workspace is not given */
+    }
+  }
+  switch (argc2) {
+  case 2:
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  case 3:
+    if (rb_obj_is_kind_of(argv[2], cgenw)) {
+      Data_Get_Struct(argv[2], gsl_eigen_gen_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigen::Gen::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[2])));
-		}
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;
-	case 5:
-		if (rb_obj_is_kind_of(argv[4], cgenw)) {
-			Data_Get_Struct(argv[4], gsl_eigen_gen_workspace, *w);
-		} else {
+               rb_class2name(CLASS_OF(argv[2])));
+    }
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  case 5:
+    if (rb_obj_is_kind_of(argv[4], cgenw)) {
+      Data_Get_Struct(argv[4], gsl_eigen_gen_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigen::Gen::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[4])));      
+               rb_class2name(CLASS_OF(argv[4])));
     }
-		CHECK_VECTOR_COMPLEX(argv[2]);
-		Data_Get_Struct(argv[2], gsl_vector_complex, *alpha);
-		CHECK_VECTOR(argv[3]);
-		Data_Get_Struct(argv[3], gsl_vector, *beta);			
-		
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;		
-	default:
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 5)", argc);
-  }
-	if (*alpha == NULL && *beta == NULL) {
-		*alpha = gsl_vector_complex_alloc((*A)->size1);
-		*beta = gsl_vector_alloc((*A)->size1);
-		flag += 1;
-	}
-	if (*w == NULL) {
-		*w = gsl_eigen_gen_alloc((*A)->size1);
-		flag += 2;
-	}
-	return flag;
+    CHECK_VECTOR_COMPLEX(argv[2]);
+    Data_Get_Struct(argv[2], gsl_vector_complex, *alpha);
+    CHECK_VECTOR(argv[3]);
+    Data_Get_Struct(argv[3], gsl_vector, *beta);
+
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  default:
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 5)", argc);
+  }
+  if (*alpha == NULL && *beta == NULL) {
+    *alpha = gsl_vector_complex_alloc((*A)->size1);
+    *beta = gsl_vector_alloc((*A)->size1);
+    flag += 1;
+  }
+  if (*w == NULL) {
+    *w = gsl_eigen_gen_alloc((*A)->size1);
+    flag += 2;
+  }
+  return flag;
 }
 
 static VALUE rb_gsl_eigen_gen(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix *A = NULL, *B = NULL;
-//	gsl_matrix *Atmp = NULL, *Btmp = NULL;		
-	gsl_vector_complex *alpha = NULL;
-	gsl_vector *beta = NULL;
-	gsl_eigen_gen_workspace *w = NULL;
-	int flag;
-	VALUE valpha = Qnil, vbeta = Qnil;
-	flag = check_argv_gen(argc, argv, obj, &A, &B, &alpha, &beta, &w);
+  gsl_matrix *A = NULL, *B = NULL;
+//  gsl_matrix *Atmp = NULL, *Btmp = NULL;
+  gsl_vector_complex *alpha = NULL;
+  gsl_vector *beta = NULL;
+  gsl_eigen_gen_workspace *w = NULL;
+  int flag;
+  VALUE valpha = Qnil, vbeta = Qnil;
+  flag = check_argv_gen(argc, argv, obj, &A, &B, &alpha, &beta, &w);
 //  Atmp = make_matrix_clone(A);
-//  Btmp = make_matrix_clone(B);  	
-	gsl_eigen_gen(A, B, alpha, beta, w);
+//  Btmp = make_matrix_clone(B);
+  gsl_eigen_gen(A, B, alpha, beta, w);
 //  gsl_matrix_free(Atmp);
-//  gsl_matrix_free(Btmp);  
-    
-	switch (flag) {
-	case 0:
-		valpha = argv[2];
-		vbeta = argv[3];		
-		break;
-	case 1:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);		
-		break;
-	case 2:
-		valpha = argv[2];
-		vbeta = argv[3];
-		gsl_eigen_gen_free(w);
-	  break;
-	case 3:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);	
-		gsl_eigen_gen_free(w);
-		break;
-	}
-
-	return rb_ary_new3(2, valpha, vbeta);
+//  gsl_matrix_free(Btmp);
+
+  switch (flag) {
+  case 0:
+    valpha = argv[2];
+    vbeta = argv[3];
+    break;
+  case 1:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    break;
+  case 2:
+    valpha = argv[2];
+    vbeta = argv[3];
+    gsl_eigen_gen_free(w);
+    break;
+  case 3:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    gsl_eigen_gen_free(w);
+    break;
+  }
+
+  return rb_ary_new3(2, valpha, vbeta);
 }
 
 static VALUE rb_gsl_eigen_gen_QZ(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix *A = NULL, *B = NULL;
-//	gsl_matrix *Atmp = NULL, *Btmp = NULL;		
-	gsl_vector_complex *alpha = NULL;
-	gsl_vector *beta = NULL;
-	gsl_matrix *Q, *Z;
-	gsl_eigen_gen_workspace *w = NULL;
-	int flag;
-	VALUE valpha = Qnil, vbeta = Qnil, vQ, vZ;
-	flag = check_argv_gen(argc, argv, obj, &A, &B, &alpha, &beta, &w);
+  gsl_matrix *A = NULL, *B = NULL;
+//  gsl_matrix *Atmp = NULL, *Btmp = NULL;
+  gsl_vector_complex *alpha = NULL;
+  gsl_vector *beta = NULL;
+  gsl_matrix *Q, *Z;
+  gsl_eigen_gen_workspace *w = NULL;
+  int flag;
+  VALUE valpha = Qnil, vbeta = Qnil, vQ, vZ;
+  flag = check_argv_gen(argc, argv, obj, &A, &B, &alpha, &beta, &w);
 /*  Atmp = make_matrix_clone(A);
-  Btmp = make_matrix_clone(B);  	*/
+  Btmp = make_matrix_clone(B);    */
   Q = gsl_matrix_alloc(A->size1, A->size2);
-  Z = gsl_matrix_alloc(A->size1, A->size2);  
-//	gsl_eigen_gen_QZ(Atmp, Btmp, alpha, beta, Q, Z, w);
-	gsl_eigen_gen_QZ(A, B, alpha, beta, Q, Z, w);	
+  Z = gsl_matrix_alloc(A->size1, A->size2);
+//  gsl_eigen_gen_QZ(Atmp, Btmp, alpha, beta, Q, Z, w);
+  gsl_eigen_gen_QZ(A, B, alpha, beta, Q, Z, w);
 /*  gsl_matrix_free(Atmp);
   gsl_matrix_free(Btmp);  */
-    
-	switch (flag) {
-	case 0:
-		valpha = argv[2];
-		vbeta = argv[3];		
-		break;
-	case 1:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);		
-		break;
-	case 2:
-		valpha = argv[2];
-		vbeta = argv[3];
-		gsl_eigen_gen_free(w);
-	  break;
-	case 3:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);	
-		gsl_eigen_gen_free(w);
-		break;
-	}
+
+  switch (flag) {
+  case 0:
+    valpha = argv[2];
+    vbeta = argv[3];
+    break;
+  case 1:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    break;
+  case 2:
+    valpha = argv[2];
+    vbeta = argv[3];
+    gsl_eigen_gen_free(w);
+    break;
+  case 3:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    gsl_eigen_gen_free(w);
+    break;
+  }
   vQ = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Q);
-  vZ = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Z);  
-	return rb_ary_new3(4, valpha, vbeta, vQ, vZ);
+  vZ = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Z);
+  return rb_ary_new3(4, valpha, vbeta, vQ, vZ);
 }
 
 static int check_argv_genv(int argc, VALUE *argv, VALUE obj, gsl_matrix **A, gsl_matrix **B,
-	gsl_vector_complex **alpha, gsl_vector **beta, gsl_matrix_complex **evec, gsl_eigen_genv_workspace **w)
+                           gsl_vector_complex **alpha, gsl_vector **beta, gsl_matrix_complex **evec, gsl_eigen_genv_workspace **w)
 {
-	int argc2 = argc;
-	int flag = 0;
-	if (CLASS_OF(obj) == cgenvw) {
-		Data_Get_Struct(obj, gsl_eigen_genv_workspace, *w);
-	} else {
-		if (rb_obj_is_kind_of(argv[argc-1], cgenvw)) {
-			Data_Get_Struct(argv[argc-1], gsl_eigen_genv_workspace, *w);
-			argc2 = argc-1;
-		} else {
-
-			/* workspace is not given */
-		}
-	}
-
-	switch (argc2) {
-	case 2:
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;
-	case 3:
-		if (rb_obj_is_kind_of(argv[2], cgenvw)) {
-			Data_Get_Struct(argv[2], gsl_eigen_genv_workspace, *w);
-		} else {
+  int argc2 = argc;
+  int flag = 0;
+  if (CLASS_OF(obj) == cgenvw) {
+    Data_Get_Struct(obj, gsl_eigen_genv_workspace, *w);
+  } else {
+    if (rb_obj_is_kind_of(argv[argc-1], cgenvw)) {
+      Data_Get_Struct(argv[argc-1], gsl_eigen_genv_workspace, *w);
+      argc2 = argc-1;
+    } else {
+
+      /* workspace is not given */
+    }
+  }
+  switch (argc2) {
+  case 2:
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  case 3:
+    if (rb_obj_is_kind_of(argv[2], cgenvw)) {
+      Data_Get_Struct(argv[2], gsl_eigen_genv_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigenv::Gen::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[2])));
-		}
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;
-	case 6:
-		if (rb_obj_is_kind_of(argv[4], cgenvw)) {
-			Data_Get_Struct(argv[4], gsl_eigen_genv_workspace, *w);
-		} else {
+               rb_class2name(CLASS_OF(argv[2])));
+    }
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  case 6:
+    if (rb_obj_is_kind_of(argv[4], cgenvw)) {
+      Data_Get_Struct(argv[4], gsl_eigen_genv_workspace, *w);
+    } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::Eigenv::Gen::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[4])));      
+               rb_class2name(CLASS_OF(argv[4])));
     }
-		CHECK_VECTOR_COMPLEX(argv[2]);
-		Data_Get_Struct(argv[2], gsl_vector_complex, *alpha);
-		CHECK_VECTOR(argv[3]);
-		Data_Get_Struct(argv[3], gsl_vector, *beta);			
-		CHECK_MATRIX_COMPLEX(argv[3]);
-		Data_Get_Struct(argv[4], gsl_matrix_complex, *evec);					
-		
-		CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
-		Data_Get_Struct(argv[0], gsl_matrix, *A);
-		Data_Get_Struct(argv[1], gsl_matrix, *B);
-		break;		
-	default:
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 6)", argc);
-  }
-	if (*alpha == NULL && *beta == NULL) {
-		*alpha = gsl_vector_complex_alloc((*A)->size1);
-		*beta = gsl_vector_alloc((*A)->size1);
-		*evec = gsl_matrix_complex_alloc((*A)->size1, (*A)->size2);		
-		flag += 1;
-	}
-	if (*w == NULL) {
-		*w = gsl_eigen_genv_alloc((*A)->size1);
-		flag += 2;
-	}
-	return flag;
+    CHECK_VECTOR_COMPLEX(argv[2]);
+    Data_Get_Struct(argv[2], gsl_vector_complex, *alpha);
+    CHECK_VECTOR(argv[3]);
+    Data_Get_Struct(argv[3], gsl_vector, *beta);
+    CHECK_MATRIX_COMPLEX(argv[3]);
+    Data_Get_Struct(argv[4], gsl_matrix_complex, *evec);
+
+    CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, *A);
+    Data_Get_Struct(argv[1], gsl_matrix, *B);
+    break;
+  default:
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 6)", argc);
+  }
+  if (*alpha == NULL && *beta == NULL) {
+    *alpha = gsl_vector_complex_alloc((*A)->size1);
+    *beta = gsl_vector_alloc((*A)->size1);
+    *evec = gsl_matrix_complex_alloc((*A)->size1, (*A)->size2);
+    flag += 1;
+  }
+  if (*w == NULL) {
+    *w = gsl_eigen_genv_alloc((*A)->size1);
+    flag += 2;
+  }
+  return flag;
 }
 
 static VALUE rb_gsl_eigen_genv(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix *A = NULL, *B = NULL;
-//	gsl_matrix *Atmp = NULL, *Btmp = NULL;		
-	gsl_vector_complex *alpha = NULL;
-	gsl_vector *beta = NULL;
-	gsl_matrix_complex *evec = NULL;
-	gsl_eigen_genv_workspace *w = NULL;
-	int flag;
-	VALUE valpha = Qnil, vbeta = Qnil, vevec = Qnil;
-	flag = check_argv_genv(argc, argv, obj, &A, &B, &alpha, &beta, &evec, &w);
+  gsl_matrix *A = NULL, *B = NULL;
+//  gsl_matrix *Atmp = NULL, *Btmp = NULL;
+  gsl_vector_complex *alpha = NULL;
+  gsl_vector *beta = NULL;
+  gsl_matrix_complex *evec = NULL;
+  gsl_eigen_genv_workspace *w = NULL;
+  int flag;
+  VALUE valpha = Qnil, vbeta = Qnil, vevec = Qnil;
+  flag = check_argv_genv(argc, argv, obj, &A, &B, &alpha, &beta, &evec, &w);
 //  Atmp = make_matrix_clone(A);
-//  Btmp = make_matrix_clone(B);  	
-//	gsl_eigen_genv(Atmp, Btmp, alpha, beta, evec, w);
-	gsl_eigen_genv(A, B, alpha, beta, evec, w);	
+//  Btmp = make_matrix_clone(B);
+//  gsl_eigen_genv(Atmp, Btmp, alpha, beta, evec, w);
+  gsl_eigen_genv(A, B, alpha, beta, evec, w);
 //  gsl_matrix_free(Atmp);
-//  gsl_matrix_free(Btmp);  
-    
-	switch (flag) {
-	case 0:
-		valpha = argv[2];
-		vbeta = argv[3];
-		vevec = argv[4];
-		break;
-	case 1:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
-		vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);		
-		break;
-	case 2:
-		valpha = argv[2];
-		vbeta = argv[3];
-		vevec = argv[4];		
-		gsl_eigen_genv_free(w);
-	  break;
-	case 3:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
-		vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
-		gsl_eigen_genv_free(w);
-		break;
-	}
-
-	return rb_ary_new3(3, valpha, vbeta, vevec);
+//  gsl_matrix_free(Btmp);
+
+  switch (flag) {
+  case 0:
+    valpha = argv[2];
+    vbeta = argv[3];
+    vevec = argv[4];
+    break;
+  case 1:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
+    break;
+  case 2:
+    valpha = argv[2];
+    vbeta = argv[3];
+    vevec = argv[4];
+    gsl_eigen_genv_free(w);
+    break;
+  case 3:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
+    gsl_eigen_genv_free(w);
+    break;
+  }
+
+  return rb_ary_new3(3, valpha, vbeta, vevec);
 }
 
 
 static VALUE rb_gsl_eigen_genv_QZ(int argc, VALUE *argv, VALUE obj)
 {
-	gsl_matrix *A = NULL, *B = NULL;
-//	gsl_matrix *Atmp = NULL, *Btmp = NULL;		
-	gsl_vector_complex *alpha = NULL;
-	gsl_vector *beta = NULL;
-	gsl_matrix_complex *evec = NULL;
-	gsl_matrix *Q, *Z;
-	gsl_eigen_genv_workspace *w = NULL;
-	int flag;
-	VALUE valpha = Qnil, vbeta = Qnil, vevec = Qnil, vQ, vZ;
-	flag = check_argv_genv(argc, argv, obj, &A, &B, &alpha, &beta, &evec, &w);
+  gsl_matrix *A = NULL, *B = NULL;
+//  gsl_matrix *Atmp = NULL, *Btmp = NULL;
+  gsl_vector_complex *alpha = NULL;
+  gsl_vector *beta = NULL;
+  gsl_matrix_complex *evec = NULL;
+  gsl_matrix *Q, *Z;
+  gsl_eigen_genv_workspace *w = NULL;
+  int flag;
+  VALUE valpha = Qnil, vbeta = Qnil, vevec = Qnil, vQ, vZ;
+  flag = check_argv_genv(argc, argv, obj, &A, &B, &alpha, &beta, &evec, &w);
 /*  Atmp = make_matrix_clone(A);
-  Btmp = make_matrix_clone(B);  	*/
+  Btmp = make_matrix_clone(B);    */
   Q = gsl_matrix_alloc(A->size1, A->size2);
-  Z = gsl_matrix_alloc(A->size1, A->size2);  
-//	gsl_eigen_genv_QZ(Atmp, Btmp, alpha, beta, evec, Q, Z, w);
-	gsl_eigen_genv_QZ(A, B, alpha, beta, evec, Q, Z, w);	
+  Z = gsl_matrix_alloc(A->size1, A->size2);
+//  gsl_eigen_genv_QZ(Atmp, Btmp, alpha, beta, evec, Q, Z, w);
+  gsl_eigen_genv_QZ(A, B, alpha, beta, evec, Q, Z, w);
 /*  gsl_matrix_free(Atmp);
   gsl_matrix_free(Btmp);  */
-    
-	switch (flag) {
-	case 0:
-		valpha = argv[2];
-		vbeta = argv[3];
-		vevec = argv[4];
-		break;
-	case 1:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
-		vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);		
-		break;
-	case 2:
-		valpha = argv[2];
-		vbeta = argv[3];
-		vevec = argv[4];		
-		gsl_eigen_genv_free(w);
-	  break;
-	case 3:
-		valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
-		vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
-		vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
-		gsl_eigen_genv_free(w);
-		break;
-	}
+
+  switch (flag) {
+  case 0:
+    valpha = argv[2];
+    vbeta = argv[3];
+    vevec = argv[4];
+    break;
+  case 1:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
+    break;
+  case 2:
+    valpha = argv[2];
+    vbeta = argv[3];
+    vevec = argv[4];
+    gsl_eigen_genv_free(w);
+    break;
+  case 3:
+    valpha = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, alpha);
+    vbeta = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, beta);
+    vevec = Data_Wrap_Struct(cgsl_eigen_herm_vectors, 0, gsl_matrix_complex_free, evec);
+    gsl_eigen_genv_free(w);
+    break;
+  }
   vQ = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Q);
-  vZ = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Z);  
-	return rb_ary_new3(5, valpha, vbeta, vevec, vQ, vZ);
+  vZ = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Z);
+  return rb_ary_new3(5, valpha, vbeta, vevec, vQ, vZ);
 }
 
 static VALUE rb_gsl_eigen_genv_sort(int argc, VALUE *argv, VALUE obj)
@@ -2086,7 +2043,7 @@ static VALUE rb_gsl_eigen_genv_sort(int argc, VALUE *argv, VALUE obj)
   case 4:
     CHECK_FIXNUM(argv[3]);
     type = FIX2INT(argv[3]);
-    /* no break, do next */
+  /* no break, do next */
   case 3:
     if (argv[0] == Qnil) {
       alpha = NULL;
@@ -2098,21 +2055,20 @@ static VALUE rb_gsl_eigen_genv_sort(int argc, VALUE *argv, VALUE obj)
       beta = NULL;
     } else {
       CHECK_VECTOR(argv[1]);
-      Data_Get_Struct(argv[1], gsl_vector, beta);        
+      Data_Get_Struct(argv[1], gsl_vector, beta);
     }
-   if (argv[2] == Qnil) {
+    if (argv[2] == Qnil) {
       evec = NULL;
     } else {
       CHECK_MATRIX_COMPLEX(argv[2]);
-      Data_Get_Struct(argv[2], gsl_matrix_complex, evec);        
-    }    
+      Data_Get_Struct(argv[2], gsl_matrix_complex, evec);
+    }
     break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
   }
   return INT2FIX(gsl_eigen_genv_sort(alpha, beta, evec, type));
 }
-#endif
 
 void Init_gsl_eigen(VALUE module)
 {
@@ -2124,10 +2080,8 @@ void Init_gsl_eigen(VALUE module)
 #ifdef HAVE_GSL_EIGEN_FRANCIS
   VALUE mgsl_eigen_francis;
 #endif
-#ifdef GSL_1_9_LATER
   VALUE mgsl_eigen_nonsymmv;
   VALUE mgsl_eigen_nonsymm;
-#endif
 
   mgsl_eigen = rb_define_module_under(module, "Eigen");
   mgsl_eigen_symm = rb_define_module_under(mgsl_eigen, "Symm");
@@ -2137,60 +2091,60 @@ void Init_gsl_eigen(VALUE module)
   mgsl_eigen_hermv = rb_define_module_under(mgsl_eigen, "Hermv");
 
   cgsl_eigen_values = rb_define_class_under(mgsl_eigen, "EigenValues",
-					    cgsl_vector);
+                                            cgsl_vector);
   cgsl_eigen_vectors = rb_define_class_under(mgsl_eigen, "EigenVectors",
-					    cgsl_matrix);
+                                             cgsl_matrix);
   cgsl_eigen_vector = rb_define_class_under(mgsl_eigen, "EigenVector",
-					    cgsl_vector);
+                                            cgsl_vector);
   cgsl_eigen_herm_vectors = rb_define_class_under(mgsl_eigen, "ComplexEigenVectors",
-						  cgsl_matrix_complex);
+                                                  cgsl_matrix_complex);
   cgsl_eigen_vector_complex = rb_define_class_under(mgsl_eigen, "ComplexEigenVector",
-						  cgsl_vector_complex);
-  cgsl_eigen_symm_workspace = rb_define_class_under(mgsl_eigen_symm, 
-						     "Workspace", cGSL_Object);
-  cgsl_eigen_symmv_workspace = rb_define_class_under(mgsl_eigen_symmv, 
-						     "Workspace", cGSL_Object);
-  cgsl_eigen_herm_workspace = rb_define_class_under(mgsl_eigen_herm, 
-						     "Workspace", cGSL_Object);
-
-  cgsl_eigen_hermv_workspace = rb_define_class_under(mgsl_eigen_hermv, 
-						     "Workspace", cGSL_Object);
-
-  rb_define_singleton_method(cgsl_eigen_symm_workspace, "alloc", 
-			     rb_gsl_eigen_symm_alloc, 1);
-  rb_define_singleton_method(cgsl_eigen_symmv_workspace, "alloc", 
-			     rb_gsl_eigen_symmv_alloc, 1);
-  rb_define_singleton_method(cgsl_eigen_herm_workspace, "alloc", 
-			     rb_gsl_eigen_herm_alloc, 1);
-  rb_define_singleton_method(cgsl_eigen_hermv_workspace, "alloc", 
-			     rb_gsl_eigen_hermv_alloc, 1);
-
-  rb_define_singleton_method(mgsl_eigen_symm, "alloc", 
-			     rb_gsl_eigen_symm_alloc, 1);
-  rb_define_singleton_method(mgsl_eigen_symmv, "alloc", 
-			     rb_gsl_eigen_symmv_alloc, 1);
-  rb_define_singleton_method(mgsl_eigen_herm, "alloc", 
-			     rb_gsl_eigen_herm_alloc, 1);
-  rb_define_singleton_method(mgsl_eigen_hermv, "alloc", 
-			     rb_gsl_eigen_hermv_alloc, 1);
-			     
+                                                    cgsl_vector_complex);
+  cgsl_eigen_symm_workspace = rb_define_class_under(mgsl_eigen_symm,
+                                                    "Workspace", cGSL_Object);
+  cgsl_eigen_symmv_workspace = rb_define_class_under(mgsl_eigen_symmv,
+                                                     "Workspace", cGSL_Object);
+  cgsl_eigen_herm_workspace = rb_define_class_under(mgsl_eigen_herm,
+                                                    "Workspace", cGSL_Object);
+
+  cgsl_eigen_hermv_workspace = rb_define_class_under(mgsl_eigen_hermv,
+                                                     "Workspace", cGSL_Object);
+
+  rb_define_singleton_method(cgsl_eigen_symm_workspace, "alloc",
+                             rb_gsl_eigen_symm_alloc, 1);
+  rb_define_singleton_method(cgsl_eigen_symmv_workspace, "alloc",
+                             rb_gsl_eigen_symmv_alloc, 1);
+  rb_define_singleton_method(cgsl_eigen_herm_workspace, "alloc",
+                             rb_gsl_eigen_herm_alloc, 1);
+  rb_define_singleton_method(cgsl_eigen_hermv_workspace, "alloc",
+                             rb_gsl_eigen_hermv_alloc, 1);
+
+  rb_define_singleton_method(mgsl_eigen_symm, "alloc",
+                             rb_gsl_eigen_symm_alloc, 1);
+  rb_define_singleton_method(mgsl_eigen_symmv, "alloc",
+                             rb_gsl_eigen_symmv_alloc, 1);
+  rb_define_singleton_method(mgsl_eigen_herm, "alloc",
+                             rb_gsl_eigen_herm_alloc, 1);
+  rb_define_singleton_method(mgsl_eigen_hermv, "alloc",
+                             rb_gsl_eigen_hermv_alloc, 1);
+
   rb_define_module_function(mgsl_eigen, "symm",
-			     rb_gsl_eigen_symm, -1);
+                            rb_gsl_eigen_symm, -1);
   rb_define_module_function(mgsl_eigen, "symmv",
-			     rb_gsl_eigen_symmv, -1);
+                            rb_gsl_eigen_symmv, -1);
   rb_define_module_function(mgsl_eigen, "herm",
-			     rb_gsl_eigen_herm, -1);
+                            rb_gsl_eigen_herm, -1);
   rb_define_module_function(mgsl_eigen, "hermv",
-			     rb_gsl_eigen_hermv, -1);
+                            rb_gsl_eigen_hermv, -1);
 
   rb_define_module_function(module, "eigen_symm",
-			     rb_gsl_eigen_symm, -1);
+                            rb_gsl_eigen_symm, -1);
   rb_define_module_function(module, "eigen_symmv",
-			     rb_gsl_eigen_symmv, -1);
+                            rb_gsl_eigen_symmv, -1);
   rb_define_module_function(module, "eigen_herm",
-			     rb_gsl_eigen_herm, -1);
+                            rb_gsl_eigen_herm, -1);
   rb_define_module_function(module, "eigen_hermv",
-			     rb_gsl_eigen_hermv, -1);
+                            rb_gsl_eigen_hermv, -1);
 
   rb_define_method(cgsl_matrix, "eigen_symm", rb_gsl_eigen_symm, -1);
   rb_define_method(cgsl_matrix, "eigen_symmv", rb_gsl_eigen_symmv, -1);
@@ -2202,21 +2156,21 @@ void Init_gsl_eigen(VALUE module)
 
   rb_gsl_eigen_define_const(module, mgsl_eigen);
 
-  rb_define_module_function(mgsl_eigen, "symmv_sort", 
-			     rb_gsl_eigen_symmv_sort, -1);
-  rb_define_module_function(mgsl_eigen, "hermv_sort", 
-			     rb_gsl_eigen_hermv_sort, -1);
-  rb_define_module_function(mgsl_eigen_symmv, "sort", 
-			     rb_gsl_eigen_symmv_sort, -1);
-  rb_define_module_function(mgsl_eigen_hermv, "sort", 
-			     rb_gsl_eigen_hermv_sort, -1);
+  rb_define_module_function(mgsl_eigen, "symmv_sort",
+                            rb_gsl_eigen_symmv_sort, -1);
+  rb_define_module_function(mgsl_eigen, "hermv_sort",
+                            rb_gsl_eigen_hermv_sort, -1);
+  rb_define_module_function(mgsl_eigen_symmv, "sort",
+                            rb_gsl_eigen_symmv_sort, -1);
+  rb_define_module_function(mgsl_eigen_hermv, "sort",
+                            rb_gsl_eigen_hermv_sort, -1);
 
 #ifdef HAVE_GSL_EIGEN_FRANCIS
   mgsl_eigen_francis = rb_define_module_under(mgsl_eigen, "francis");
-  cgsl_eigen_francis_workspace = rb_define_class_under(mgsl_eigen_francis, 
-						    "Workspace", cGSL_Object);
+  cgsl_eigen_francis_workspace = rb_define_class_under(mgsl_eigen_francis,
+                                                       "Workspace", cGSL_Object);
   rb_define_singleton_method(cgsl_eigen_francis_workspace, "alloc",
-			     rb_gsl_eigen_francis_alloc, 0);
+                             rb_gsl_eigen_francis_alloc, 0);
 
   rb_define_method(cgsl_matrix, "eigen_francis", rb_gsl_eigen_francis, -1);
   rb_define_module_function(mgsl_eigen, "francis", rb_gsl_eigen_francis, -1);
@@ -2230,16 +2184,15 @@ void Init_gsl_eigen(VALUE module)
 
 #endif
 
-#ifdef GSL_1_9_LATER
   mgsl_eigen_nonsymm = rb_define_module_under(mgsl_eigen, "Nonsymm");
   mgsl_eigen_nonsymmv = rb_define_module_under(mgsl_eigen, "Nonsymmv");
-  cgsl_eigen_nonsymm_workspace = rb_define_class_under(mgsl_eigen_nonsymm, 
-						    "Workspace", cGSL_Object);
+  cgsl_eigen_nonsymm_workspace = rb_define_class_under(mgsl_eigen_nonsymm,
+                                                       "Workspace", cGSL_Object);
   rb_define_singleton_method(cgsl_eigen_nonsymm_workspace, "alloc",
-			     rb_gsl_eigen_nonsymm_alloc, 1);
+                             rb_gsl_eigen_nonsymm_alloc, 1);
   rb_define_singleton_method(mgsl_eigen_nonsymm, "alloc",
-			     rb_gsl_eigen_nonsymm_alloc, 1);
-			     
+                             rb_gsl_eigen_nonsymm_alloc, 1);
+
   rb_define_method(cgsl_matrix, "eigen_nonsymm", rb_gsl_eigen_nonsymm, -1);
   rb_define_module_function(mgsl_eigen, "nonsymm", rb_gsl_eigen_nonsymm, -1);
   rb_define_module_function(module, "eigen_nonsymm", rb_gsl_eigen_nonsymm, -1);
@@ -2250,12 +2203,12 @@ void Init_gsl_eigen(VALUE module)
   rb_define_method(cgsl_eigen_nonsymm_workspace, "params", rb_gsl_eigen_nonsymm_params, -1);
   rb_define_module_function(mgsl_eigen_nonsymm, "params", rb_gsl_eigen_nonsymm_params, -1);
 
-  cgsl_eigen_nonsymmv_workspace = rb_define_class_under(mgsl_eigen_nonsymmv, 
-						    "Workspace", cGSL_Object);
+  cgsl_eigen_nonsymmv_workspace = rb_define_class_under(mgsl_eigen_nonsymmv,
+                                                        "Workspace", cGSL_Object);
   rb_define_singleton_method(cgsl_eigen_nonsymmv_workspace, "alloc",
-			     rb_gsl_eigen_nonsymmv_alloc, 1);
+                             rb_gsl_eigen_nonsymmv_alloc, 1);
   rb_define_singleton_method(mgsl_eigen_nonsymmv, "alloc",
-			     rb_gsl_eigen_nonsymmv_alloc, 1);
+                             rb_gsl_eigen_nonsymmv_alloc, 1);
   rb_define_method(cgsl_matrix, "eigen_nonsymmv", rb_gsl_eigen_nonsymmv, -1);
   rb_define_module_function(mgsl_eigen, "nonsymmv", rb_gsl_eigen_nonsymmv, -1);
   rb_define_module_function(module, "eigen_nonsymmv", rb_gsl_eigen_nonsymmv, -1);
@@ -2265,15 +2218,13 @@ void Init_gsl_eigen(VALUE module)
   rb_define_module_function(mgsl_eigen, "nonsymmv_Z", rb_gsl_eigen_nonsymmv_Z, -1);
   rb_define_module_function(module, "eigen_nonsymmv_Z", rb_gsl_eigen_nonsymmv_Z, -1);
 
-  rb_define_module_function(mgsl_eigen, "nonsymmv_sort", 
-			     rb_gsl_eigen_nonsymmv_sort, -1);
-  rb_define_module_function(mgsl_eigen_nonsymmv, "sort", 
-			     rb_gsl_eigen_nonsymmv_sort, -1);
-  rb_define_module_function(module, "eigen_nonsymmv_sort", 
-			     rb_gsl_eigen_nonsymmv_sort, -1);
-#endif
+  rb_define_module_function(mgsl_eigen, "nonsymmv_sort",
+                            rb_gsl_eigen_nonsymmv_sort, -1);
+  rb_define_module_function(mgsl_eigen_nonsymmv, "sort",
+                            rb_gsl_eigen_nonsymmv_sort, -1);
+  rb_define_module_function(module, "eigen_nonsymmv_sort",
+                            rb_gsl_eigen_nonsymmv_sort, -1);
 
-#ifdef GSL_1_10_LATER
   /** gensymm, gensymmv **/
   mgensymm = rb_define_module_under(mgsl_eigen, "Gensymm");
   cgensymm = rb_define_class_under(mgensymm, "Workspace", cGSL_Object);
@@ -2287,27 +2238,27 @@ void Init_gsl_eigen(VALUE module)
 
   rb_define_method(cgensymm, "gensymm", rb_gsl_eigen_gensymm, -1);
   rb_define_module_function(module, "eigen_gensymm", rb_gsl_eigen_gensymm, -1);
-  rb_define_module_function(mgsl_eigen, "gensymm", rb_gsl_eigen_gensymm, -1);	
-  rb_define_module_function(mgensymm, "gensymm", rb_gsl_eigen_gensymm, -1);	
+  rb_define_module_function(mgsl_eigen, "gensymm", rb_gsl_eigen_gensymm, -1);
+  rb_define_module_function(mgensymm, "gensymm", rb_gsl_eigen_gensymm, -1);
 
   rb_define_method(cgensymmv, "gensymmv", rb_gsl_eigen_gensymmv, -1);
   rb_define_module_function(module, "eigen_gensymmv", rb_gsl_eigen_gensymmv, -1);
-  rb_define_module_function(mgsl_eigen, "gensymmv", rb_gsl_eigen_gensymmv, -1);	
+  rb_define_module_function(mgsl_eigen, "gensymmv", rb_gsl_eigen_gensymmv, -1);
   rb_define_module_function(mgensymmv, "gensymmv", rb_gsl_eigen_gensymmv, -1);
 
-  rb_define_module_function(mgsl_eigen, "gensymmv_sort", 
-         rb_gsl_eigen_gensymmv_sort, -1);
-  rb_define_module_function(mgensymmv, "sort", 
-         rb_gsl_eigen_gensymmv_sort, -1);
-  rb_define_module_function(module, "eigen_gensymmv_sort", 
-         rb_gsl_eigen_gensymmv_sort, -1);
+  rb_define_module_function(mgsl_eigen, "gensymmv_sort",
+                            rb_gsl_eigen_gensymmv_sort, -1);
+  rb_define_module_function(mgensymmv, "sort",
+                            rb_gsl_eigen_gensymmv_sort, -1);
+  rb_define_module_function(module, "eigen_gensymmv_sort",
+                            rb_gsl_eigen_gensymmv_sort, -1);
 
   /** genherm, genhermv **/
   mgenherm = rb_define_module_under(mgsl_eigen, "Genherm");
   cgenherm = rb_define_class_under(mgenherm, "Workspace", cGSL_Object);
   mgenhermv = rb_define_module_under(mgsl_eigen, "Genhermv");
   cgenhermv = rb_define_class_under(mgenhermv, "Workspace", cGSL_Object);
-  
+
   rb_define_singleton_method(cgenherm, "alloc", rb_gsl_eigen_genherm_alloc, 1);
   rb_define_singleton_method(cgenhermv, "alloc", rb_gsl_eigen_genhermv_alloc, 1);
   rb_define_singleton_method(mgenherm, "alloc", rb_gsl_eigen_genherm_alloc, 1);
@@ -2315,59 +2266,57 @@ void Init_gsl_eigen(VALUE module)
 
   rb_define_method(cgenherm, "genherm", rb_gsl_eigen_genherm, -1);
   rb_define_module_function(module, "eigen_genherm", rb_gsl_eigen_genherm, -1);
-  rb_define_module_function(mgsl_eigen, "genherm", rb_gsl_eigen_genherm, -1);	
-  rb_define_module_function(mgenherm, "genherm", rb_gsl_eigen_genherm, -1);	
+  rb_define_module_function(mgsl_eigen, "genherm", rb_gsl_eigen_genherm, -1);
+  rb_define_module_function(mgenherm, "genherm", rb_gsl_eigen_genherm, -1);
 
   rb_define_method(cgenhermv, "genhermv", rb_gsl_eigen_genhermv, -1);
   rb_define_module_function(module, "eigen_genhermv", rb_gsl_eigen_genhermv, -1);
-  rb_define_module_function(mgsl_eigen, "genhermv", rb_gsl_eigen_genhermv, -1);	
+  rb_define_module_function(mgsl_eigen, "genhermv", rb_gsl_eigen_genhermv, -1);
   rb_define_module_function(mgenhermv, "genhermv", rb_gsl_eigen_genhermv, -1);
-  
-  rb_define_module_function(mgsl_eigen, "genhermv_sort", 
-         rb_gsl_eigen_genhermv_sort, -1);
-  rb_define_module_function(mgenhermv, "sort", 
-         rb_gsl_eigen_genhermv_sort, -1);
-  rb_define_module_function(module, "eigen_genhermv_sort", 
-         rb_gsl_eigen_genhermv_sort, -1); 
-         
+
+  rb_define_module_function(mgsl_eigen, "genhermv_sort",
+                            rb_gsl_eigen_genhermv_sort, -1);
+  rb_define_module_function(mgenhermv, "sort",
+                            rb_gsl_eigen_genhermv_sort, -1);
+  rb_define_module_function(module, "eigen_genhermv_sort",
+                            rb_gsl_eigen_genhermv_sort, -1);
+
   /* gen */
   mgen = rb_define_module_under(mgsl_eigen, "Gen");
-  mgenv = rb_define_module_under(mgsl_eigen, "Genv");  
+  mgenv = rb_define_module_under(mgsl_eigen, "Genv");
   cgenw = rb_define_class_under(mgen, "Workspace", cGSL_Object);
   cgenvw = rb_define_class_under(mgenv, "Workspace", cGSL_Object);
   rb_define_singleton_method(mgen, "alloc", rb_gsl_eigen_gen_alloc, 1);
-  rb_define_singleton_method(cgenw, "alloc", rb_gsl_eigen_gen_alloc, 1);  
+  rb_define_singleton_method(cgenw, "alloc", rb_gsl_eigen_gen_alloc, 1);
   rb_define_singleton_method(mgenv, "alloc", rb_gsl_eigen_genv_alloc, 1);
   rb_define_singleton_method(cgenvw, "alloc", rb_gsl_eigen_genv_alloc, 1);
-  
+
   rb_define_module_function(mgen, "params", rb_gsl_eigen_gen_params, -1);
   rb_define_method(cgenw, "params", rb_gsl_eigen_gen_params, -1);
   rb_define_module_function(mgsl_eigen, "gen_params", rb_gsl_eigen_gen_params, -1);
-  
-    
+
+
   rb_define_module_function(mgen, "gen", rb_gsl_eigen_gen, -1);
-  rb_define_module_function(mgsl_eigen, "gen", rb_gsl_eigen_gen, -1);  
+  rb_define_module_function(mgsl_eigen, "gen", rb_gsl_eigen_gen, -1);
   rb_define_method(cgenw, "gen", rb_gsl_eigen_gen, -1);
-  
+
   rb_define_module_function(mgenv, "genv", rb_gsl_eigen_genv, -1);
-  rb_define_module_function(mgsl_eigen, "genv", rb_gsl_eigen_genv, -1);  
+  rb_define_module_function(mgsl_eigen, "genv", rb_gsl_eigen_genv, -1);
   rb_define_method(cgenvw, "genv", rb_gsl_eigen_genv, -1);
-  
+
   rb_define_module_function(mgen, "gen_QZ", rb_gsl_eigen_gen_QZ, -1);
-  rb_define_module_function(mgsl_eigen, "gen_QZ", rb_gsl_eigen_gen_QZ, -1);  
+  rb_define_module_function(mgsl_eigen, "gen_QZ", rb_gsl_eigen_gen_QZ, -1);
   rb_define_method(cgenw, "gen_QZ", rb_gsl_eigen_gen_QZ, -1);
-  
-   rb_define_module_function(mgenv, "genv_QZ", rb_gsl_eigen_genv_QZ, -1);
-  rb_define_module_function(mgsl_eigen, "genv_QZ", rb_gsl_eigen_genv_QZ, -1);  
-  rb_define_method(cgenvw, "genv_QZ", rb_gsl_eigen_genv_QZ, -1);  
-  
-  rb_define_module_function(mgsl_eigen, "genv_sort", 
-         rb_gsl_eigen_genv_sort, -1);
-  rb_define_module_function(mgenv, "sort", 
-         rb_gsl_eigen_genv_sort, -1);
-  rb_define_module_function(module, "eigen_genv_sort", 
-         rb_gsl_eigen_genv_sort, -1);   
-#endif
 
+  rb_define_module_function(mgenv, "genv_QZ", rb_gsl_eigen_genv_QZ, -1);
+  rb_define_module_function(mgsl_eigen, "genv_QZ", rb_gsl_eigen_genv_QZ, -1);
+  rb_define_method(cgenvw, "genv_QZ", rb_gsl_eigen_genv_QZ, -1);
+
+  rb_define_module_function(mgsl_eigen, "genv_sort",
+                            rb_gsl_eigen_genv_sort, -1);
+  rb_define_module_function(mgenv, "sort",
+                            rb_gsl_eigen_genv_sort, -1);
+  rb_define_module_function(module, "eigen_genv_sort",
+                            rb_gsl_eigen_genv_sort, -1);
 }
 
diff --git a/ext/gsl/error.c b/ext/gsl_native/error.c
similarity index 91%
rename from ext/gsl/error.c
rename to ext/gsl_native/error.c
index 996e7ae..39a92a2 100644
--- a/ext/gsl/error.c
+++ b/ext/gsl_native/error.c
@@ -20,21 +20,21 @@ static VALUE *pgsl_error;
 
 static void Init_rb_gsl_define_GSL_CONST(VALUE module);
 void rb_gsl_error_handler(const char *reason, const char *file,
-			  int line, int gsl_errno);
+                          int line, int gsl_errno);
 static void rb_gsl_my_error_handler(const char *reason, const char *file,
-				    int line, int gsl_errno);
+                                    int line, int gsl_errno);
 
 void rb_gsl_error_handler(const char *reason, const char *file,
-			  int line, int gsl_errno)
+                          int line, int gsl_errno)
 {
   const char *emessage = gsl_strerror(gsl_errno);
-  rb_raise(pgsl_error[gsl_errno], 
-	   "Ruby/GSL error code %d, %s (file %s, line %d), %s",
-	   gsl_errno, reason, file, line, emessage);
+  rb_raise(pgsl_error[gsl_errno],
+           "Ruby/GSL error code %d, %s (file %s, line %d), %s",
+           gsl_errno, reason, file, line, emessage);
 }
 
 static void rb_gsl_my_error_handler(const char *reason, const char *file,
-				    int line, int gsl_errno)
+                                    int line, int gsl_errno)
 {
   VALUE vreason, vfile;
   VALUE vline, verrno;
@@ -166,14 +166,14 @@ static void define_module_functions(VALUE module);
 static VALUE rb_gsl_strerror(VALUE obj, VALUE errn);
 static void define_module_functions(VALUE module)
 {
-  rb_define_module_function(module, "set_error_handler_off", 
-			    rb_gsl_set_error_handler_off, 0);
-  rb_define_module_function(module, "strerror", 
-			    rb_gsl_strerror, 1);
+  rb_define_module_function(module, "set_error_handler_off",
+                            rb_gsl_set_error_handler_off, 0);
+  rb_define_module_function(module, "strerror",
+                            rb_gsl_strerror, 1);
   rb_define_module_function(module, "set_error_handler",
-			    rb_gsl_set_error_handler, -1);
+                            rb_gsl_set_error_handler, -1);
   rb_define_module_function(module, "set_default_error_handler",
-			    rb_gsl_set_default_error_handler, 0);
+                            rb_gsl_set_default_error_handler, 0);
 }
 
 static VALUE rb_gsl_strerror(VALUE obj, VALUE errn)
diff --git a/ext/gsl/extconf.rb b/ext/gsl_native/extconf.rb
similarity index 85%
rename from ext/gsl/extconf.rb
rename to ext/gsl_native/extconf.rb
index 6b11f4d..a966a45 100644
--- a/ext/gsl/extconf.rb
+++ b/ext/gsl_native/extconf.rb
@@ -10,7 +10,8 @@ rescue => err
 end
 
 def gsl_def(const, value = nil)
-  $defs << "-D#{const}#{"=#{value}" if value}"
+  value = "=#{value}" if value
+  $defs << "-D#{const}#{value}"
 end
 
 def gsl_have_header(library, header)
@@ -63,14 +64,9 @@ gsl_config_arg(:version) { |version, check|
     gte && gsl_def("GSL_#{ary.join('_')}_LATER")
   }
 
-  raise 'Ruby/GSL requires gsl-0.9.4 or later.' unless later['0.9.4']
+  raise 'Ruby/GSL requires gsl-1.15 or later.' unless later['1.15']
 
-  gsl_def(:GSL_1_4_9_LATER) if later['1.4.90']
-
-  %w[
-    1.0 1.1 1.1.1 1.2 1.3 1.4 1.5.90 1.7.90
-    1.8.90 1.9.90 1.11 1.12.90 1.14 1.15
-  ].each { |v| later[v] }
+  %w[1.15 1.16].each { |v| later[v] }
 }
 
 gsl_config_arg(:cflags) { |cflags, check|
@@ -92,7 +88,6 @@ gsl_config_arg(:libs) { |libs, check|
   $LOCAL_LIBS += ' ' + check[libs]
 }
 
-have_header('ruby/io.h')
 have_func('round')
 
 %w[alf qrngextra rngextra tensor].each { |library|
@@ -120,7 +115,4 @@ unless arg_config('--disable-tamu-anova')
   gsl_have_header('tamuanova', 'tamu_anova/tamu_anova.h')
 end
 
-$objs = Dir["#{File.dirname(__FILE__)}/*.c"].map { |f| File.basename(f, '.c') << '.o' }.
-  sort - %w[block matrix poly tensor vector].map { |f| "#{f}_source.o" }
-
-create_makefile('gsl/gsl_native')
+create_makefile('gsl_native')
diff --git a/ext/gsl/fft.c b/ext/gsl_native/fft.c
similarity index 72%
rename from ext/gsl/fft.c
rename to ext/gsl_native/fft.c
index 1f3d7ef..95a3f1f 100644
--- a/ext/gsl/fft.c
+++ b/ext/gsl_native/fft.c
@@ -25,24 +25,24 @@ static void GSL_FFT_Workspace_free(GSL_FFT_Workspace *space);
 static VALUE rb_gsl_fft_complex_wavetable_new(VALUE klass, VALUE n)
 {
   CHECK_FIXNUM(n);
-  return Data_Wrap_Struct(cgsl_fft_complex_wavetable, 0, 
-			  gsl_fft_complex_wavetable_free,
-			  gsl_fft_complex_wavetable_alloc(FIX2INT(n)));
+  return Data_Wrap_Struct(cgsl_fft_complex_wavetable, 0,
+                          gsl_fft_complex_wavetable_free,
+                          gsl_fft_complex_wavetable_alloc(FIX2INT(n)));
 }
 
 static VALUE rb_gsl_fft_real_wavetable_new(VALUE klass, VALUE n)
 {
   CHECK_FIXNUM(n);
   return Data_Wrap_Struct(klass, 0, gsl_fft_real_wavetable_free,
-			  gsl_fft_real_wavetable_alloc(FIX2INT(n)));
+                          gsl_fft_real_wavetable_alloc(FIX2INT(n)));
 }
 
 static VALUE rb_gsl_fft_halfcomplex_wavetable_new(VALUE klass, VALUE n)
 {
   CHECK_FIXNUM(n);
   return Data_Wrap_Struct(klass, 0, gsl_fft_halfcomplex_wavetable_free,
-			  gsl_fft_halfcomplex_wavetable_alloc(FIX2INT(n)));
-  
+                          gsl_fft_halfcomplex_wavetable_alloc(FIX2INT(n)));
+
 }
 
 static void GSL_FFT_Wavetable_free(GSL_FFT_Wavetable *table)
@@ -54,21 +54,21 @@ static VALUE rb_gsl_fft_complex_workspace_new(VALUE klass, VALUE n)
 {
   CHECK_FIXNUM(n);
   return Data_Wrap_Struct(klass, 0, gsl_fft_complex_workspace_free,
-			  gsl_fft_complex_workspace_alloc(FIX2INT(n)));
+                          gsl_fft_complex_workspace_alloc(FIX2INT(n)));
 }
 
 static VALUE rb_gsl_fft_real_workspace_new(VALUE klass, VALUE n)
 {
   CHECK_FIXNUM(n);
   return Data_Wrap_Struct(klass, 0, gsl_fft_real_workspace_free,
-			  gsl_fft_real_workspace_alloc(FIX2INT(n)));
+                          gsl_fft_real_workspace_alloc(FIX2INT(n)));
 }
 
 static void GSL_FFT_Workspace_free(GSL_FFT_Workspace *space)
 {
   gsl_fft_complex_workspace_free((gsl_fft_complex_workspace *) space);
 }
-  
+
 // The FFT methods used to allow passing stride and n values as optional
 // parameters to control which elements get transformed.  This created problems
 // for Views which can have their own stride, so support for stride and n
@@ -79,8 +79,8 @@ static void GSL_FFT_Workspace_free(GSL_FFT_Workspace *space)
 // refactoring, it has been left in place for the time being.  Eventually it
 // can be refactored away completely.
 static VALUE get_complex_stride_n(VALUE obj,
-			       gsl_vector_complex **vin,
-			       gsl_complex_packed_array *data, size_t *stride, size_t *n)
+                                  gsl_vector_complex **vin,
+                                  gsl_complex_packed_array *data, size_t *stride, size_t *n)
 {
   gsl_vector_complex *v = NULL;
 
@@ -96,8 +96,8 @@ static VALUE get_complex_stride_n(VALUE obj,
 }
 
 static VALUE rb_fft_complex_radix2(VALUE obj,
-				   int (*trans)(gsl_complex_packed_array, 
-						size_t, size_t), int flag)
+                                   int (*trans)(gsl_complex_packed_array,
+                                                size_t, size_t), int flag)
 {
   size_t stride, n;
   gsl_complex_packed_array data;
@@ -106,7 +106,7 @@ static VALUE rb_fft_complex_radix2(VALUE obj,
   ary = get_complex_stride_n(obj, &vin, &data, &stride, &n);
   if (flag == RB_GSL_FFT_COPY) {
     vout = gsl_vector_complex_alloc(n);
-    gsl_vector_complex_memcpy(vout, vin); 
+    gsl_vector_complex_memcpy(vout, vin);
     (*trans)(vout->data, vout->stride /*1*/, vout->size /*n*/);
     return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vout);
   } else { /* in-place */
@@ -118,13 +118,13 @@ static VALUE rb_fft_complex_radix2(VALUE obj,
 static VALUE rb_gsl_fft_complex_radix2_forward(VALUE obj)
 {
   return rb_fft_complex_radix2(obj, gsl_fft_complex_radix2_forward,
-			       RB_GSL_FFT_COPY);
+                               RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_forward2(VALUE obj)
 {
   return rb_fft_complex_radix2(obj, gsl_fft_complex_radix2_forward,
-			       RB_GSL_FFT_INPLACE);
+                               RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_transform(VALUE obj, VALUE val_sign)
@@ -136,7 +136,7 @@ static VALUE rb_gsl_fft_complex_radix2_transform(VALUE obj, VALUE val_sign)
   sign = NUM2INT(val_sign);
   get_complex_stride_n(obj, &vin, &data, &stride, &n);
   vout = gsl_vector_complex_alloc(n);
-  gsl_vector_complex_memcpy(vout, vin); 
+  gsl_vector_complex_memcpy(vout, vin);
   gsl_fft_complex_radix2_transform(vout->data, vout->stride /*1*/, vout->size /*n*/, sign);
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vout);
 }
@@ -156,40 +156,40 @@ static VALUE rb_gsl_fft_complex_radix2_transform2(VALUE obj, VALUE val_sign)
 static VALUE rb_gsl_fft_complex_radix2_backward(VALUE obj)
 {
   return rb_fft_complex_radix2(obj, gsl_fft_complex_radix2_backward,
-			       RB_GSL_FFT_COPY);
+                               RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_inverse(VALUE obj)
 {
   return rb_fft_complex_radix2(obj, gsl_fft_complex_radix2_inverse,
-			       RB_GSL_FFT_COPY);
+                               RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_dif_forward(VALUE obj)
 {
-  return rb_fft_complex_radix2(obj, 
-			       gsl_fft_complex_radix2_dif_forward,
-			       RB_GSL_FFT_COPY);
+  return rb_fft_complex_radix2(obj,
+                               gsl_fft_complex_radix2_dif_forward,
+                               RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_backward2(VALUE obj)
 {
   return rb_fft_complex_radix2(obj, gsl_fft_complex_radix2_backward,
-			       RB_GSL_FFT_INPLACE);
+                               RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_inverse2(VALUE obj)
 {
   return rb_fft_complex_radix2(obj, gsl_fft_complex_radix2_inverse,
-			       RB_GSL_FFT_INPLACE);
+                               RB_GSL_FFT_INPLACE);
 }
 
 
 static VALUE rb_gsl_fft_complex_radix2_dif_forward2(VALUE obj)
 {
-  return rb_fft_complex_radix2(obj, 
-			       gsl_fft_complex_radix2_dif_forward,
-			       RB_GSL_FFT_INPLACE);
+  return rb_fft_complex_radix2(obj,
+                               gsl_fft_complex_radix2_dif_forward,
+                               RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_dif_transform(VALUE obj, VALUE val_sign)
@@ -201,7 +201,7 @@ static VALUE rb_gsl_fft_complex_radix2_dif_transform(VALUE obj, VALUE val_sign)
   sign = NUM2INT(val_sign);
   get_complex_stride_n(obj, &vin, &data, &stride, &n);
   vout = gsl_vector_complex_alloc(n);
-  gsl_vector_complex_memcpy(vout, vin); 
+  gsl_vector_complex_memcpy(vout, vin);
   gsl_fft_complex_radix2_dif_transform(vout->data, vout->stride /*1*/, vout->size /*n*/, sign);
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vout);
 }
@@ -221,28 +221,28 @@ static VALUE rb_gsl_fft_complex_radix2_dif_transform2(VALUE obj, VALUE val_sign)
 
 static VALUE rb_gsl_fft_complex_radix2_dif_backward(VALUE obj)
 {
-  return rb_fft_complex_radix2(obj, 
-			       gsl_fft_complex_radix2_dif_backward,
-			       RB_GSL_FFT_COPY);
+  return rb_fft_complex_radix2(obj,
+                               gsl_fft_complex_radix2_dif_backward,
+                               RB_GSL_FFT_COPY);
 }
 static VALUE rb_gsl_fft_complex_radix2_dif_inverse(VALUE obj)
 {
-  return rb_fft_complex_radix2(obj, 
-			       gsl_fft_complex_radix2_dif_inverse,
-			       RB_GSL_FFT_COPY);
+  return rb_fft_complex_radix2(obj,
+                               gsl_fft_complex_radix2_dif_inverse,
+                               RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_radix2_dif_backward2(VALUE obj)
 {
-  return rb_fft_complex_radix2(obj, 
-			       gsl_fft_complex_radix2_dif_backward,
-			       RB_GSL_FFT_INPLACE);
+  return rb_fft_complex_radix2(obj,
+                               gsl_fft_complex_radix2_dif_backward,
+                               RB_GSL_FFT_INPLACE);
 }
 static VALUE rb_gsl_fft_complex_radix2_dif_inverse2(VALUE obj)
 {
-  return rb_fft_complex_radix2(obj, 
-			       gsl_fft_complex_radix2_dif_inverse,
-			       RB_GSL_FFT_INPLACE);
+  return rb_fft_complex_radix2(obj,
+                               gsl_fft_complex_radix2_dif_inverse,
+                               RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_GSL_FFT_Wavetable_n(VALUE obj)
@@ -278,16 +278,16 @@ enum {
 } FFTComplexStructAllocFlag;
 
 static void gsl_fft_free(int flag, GSL_FFT_Wavetable *table,
-			 GSL_FFT_Workspace *space);
+                         GSL_FFT_Workspace *space);
 
 // Parse argc, argv.  obj must be GSL::Vector::Complex.
 // This can be simplified at some point.
 // See comments preceding get_complex_stride_n()
 static int gsl_fft_get_argv_complex(int argc, VALUE *argv, VALUE obj,
-			    gsl_vector_complex ** vin,
-			    gsl_complex_packed_array *data, size_t *stride,
-			    size_t *n, gsl_fft_complex_wavetable **table,
-			    gsl_fft_complex_workspace **space)
+                                    gsl_vector_complex ** vin,
+                                    gsl_complex_packed_array *data, size_t *stride,
+                                    size_t *n, gsl_fft_complex_wavetable **table,
+                                    gsl_fft_complex_workspace **space)
 {
   int flag = NONE_OF_TWO, flagtmp, i, itmp = argc, itmp2 = 0, ccc;
   int flagw = 0;
@@ -336,9 +336,9 @@ static int gsl_fft_get_argv_complex(int argc, VALUE *argv, VALUE obj,
 
 // Parse argc, argv.  obj must be GSL::Vector of real data
 static int gsl_fft_get_argv_real(int argc, VALUE *argv, VALUE obj,
-			     double **ptr, size_t *stride,
-			     size_t *n, gsl_fft_real_wavetable **table,
-			     gsl_fft_real_workspace **space, int *naflag)
+                                 double **ptr, size_t *stride,
+                                 size_t *n, gsl_fft_real_wavetable **table,
+                                 gsl_fft_real_workspace **space, int *naflag)
 {
   int flag = NONE_OF_TWO, flagtmp, i, itmp = argc, itmp2 = 0, ccc;
   int flagw = 0;
@@ -387,9 +387,9 @@ static int gsl_fft_get_argv_real(int argc, VALUE *argv, VALUE obj,
 
 // Parse argc, argv.  obj must be GSL::Vector of halfcomplex data
 static int gsl_fft_get_argv_halfcomplex(int argc, VALUE *argv, VALUE obj,
-			   double **ptr, size_t *stride,
-			    size_t *n, gsl_fft_halfcomplex_wavetable **table,
-			    gsl_fft_real_workspace **space, int *naflag)
+                                        double **ptr, size_t *stride,
+                                        size_t *n, gsl_fft_halfcomplex_wavetable **table,
+                                        gsl_fft_real_workspace **space, int *naflag)
 {
   int flag = NONE_OF_TWO, flagtmp, i, itmp = argc, itmp2 = 0, ccc;
   int flagw = 0;
@@ -436,7 +436,7 @@ static int gsl_fft_get_argv_halfcomplex(int argc, VALUE *argv, VALUE obj,
 }
 
 static void gsl_fft_free(int flag, GSL_FFT_Wavetable *table,
-			 GSL_FFT_Workspace *space)
+                         GSL_FFT_Workspace *space)
 {
   switch (flag) {
   case ALLOC_TABLE:
@@ -456,11 +456,11 @@ static void gsl_fft_free(int flag, GSL_FFT_Wavetable *table,
 }
 
 static VALUE rb_fft_complex_trans(int argc, VALUE *argv, VALUE obj,
-				  int (*transform)(gsl_complex_packed_array, 
-						   size_t, size_t, 
-						   const gsl_fft_complex_wavetable *,
-						   gsl_fft_complex_workspace *),
-				  int sss)
+                                  int (*transform)(gsl_complex_packed_array,
+                                                   size_t, size_t,
+                                                   const gsl_fft_complex_wavetable *,
+                                                   gsl_fft_complex_workspace *),
+                                  int sss)
 {
   int flag = 0;
   // local variable "status" was defined and set, but never used
@@ -487,13 +487,13 @@ static VALUE rb_fft_complex_trans(int argc, VALUE *argv, VALUE obj,
 static VALUE rb_gsl_fft_complex_forward(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_complex_trans(argc, argv, obj, gsl_fft_complex_forward,
-			      RB_GSL_FFT_COPY);
+                              RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_forward2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_complex_trans(argc, argv, obj, gsl_fft_complex_forward,
-			      RB_GSL_FFT_INPLACE);
+                              RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_complex_transform(int argc, VALUE *argv, VALUE obj)
@@ -539,25 +539,25 @@ static VALUE rb_gsl_fft_complex_transform2(int argc, VALUE *argv, VALUE obj)
 static VALUE rb_gsl_fft_complex_backward(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_complex_trans(argc, argv, obj, gsl_fft_complex_backward,
-			      RB_GSL_FFT_COPY);
+                              RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_backward2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_complex_trans(argc, argv, obj, gsl_fft_complex_backward,
-			      RB_GSL_FFT_INPLACE);
+                              RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_complex_inverse(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_complex_trans(argc, argv, obj, gsl_fft_complex_inverse,
-			      RB_GSL_FFT_COPY);
+                              RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_complex_inverse2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_complex_trans(argc, argv, obj, gsl_fft_complex_inverse,
-			      RB_GSL_FFT_INPLACE);
+                              RB_GSL_FFT_INPLACE);
 }
 
 // The FFT methods used to allow passing stride and n values as optional
@@ -572,7 +572,7 @@ static VALUE rb_gsl_fft_complex_inverse2(int argc, VALUE *argv, VALUE obj)
 //
 // obj must be GSL::Vector of real or halfcomplex data
 static VALUE get_ptr_stride_n(VALUE obj,
-			     double **ptr, size_t *stride, size_t *n, int *flag)
+                              double **ptr, size_t *stride, size_t *n, int *flag)
 {
   *flag = 0;
   *ptr = get_ptr_double3(obj, n, stride, flag);
@@ -580,17 +580,14 @@ static VALUE get_ptr_stride_n(VALUE obj,
 }
 
 static VALUE rb_fft_radix2(VALUE obj,
-			   int (*trans)(double [], size_t, size_t),
-			   int sss)
+                           int (*trans)(double [], size_t, size_t),
+                           int sss)
 {
   size_t stride, n;
   gsl_vector *vnew;
   gsl_vector_view vv;
   double *ptr1, *ptr2;
   int flag;
-#ifdef HAVE_NARRAY_H
-  int shape[1];
-#endif
   VALUE ary;
   get_ptr_stride_n(obj, &ptr1, &stride, &n, &flag);
   if (flag == 0) {
@@ -610,6 +607,7 @@ static VALUE rb_fft_radix2(VALUE obj,
 #ifdef HAVE_NARRAY_H
   } else if (flag == 1) {
     if (sss == RB_GSL_FFT_COPY) {
+      int shape[1];
       shape[0] = n;
       ary = na_make_object(NA_DFLOAT, 1, shape, cNArray);
       ptr2 = NA_PTR_TYPE(ary, double*);
@@ -630,46 +628,46 @@ static VALUE rb_fft_radix2(VALUE obj,
 static VALUE rb_gsl_fft_real_radix2_transform(VALUE obj)
 {
   return rb_fft_radix2(obj, gsl_fft_real_radix2_transform,
-		       RB_GSL_FFT_COPY);
+                       RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_real_radix2_transform2(VALUE obj)
 {
   return rb_fft_radix2(obj, gsl_fft_real_radix2_transform,
-		       RB_GSL_FFT_INPLACE);
+                       RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_radix2_inverse(VALUE obj)
 {
   return rb_fft_radix2(obj, gsl_fft_halfcomplex_radix2_inverse,
-		       RB_GSL_FFT_COPY);
+                       RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_radix2_inverse2(VALUE obj)
 {
   return rb_fft_radix2(obj, gsl_fft_halfcomplex_radix2_inverse,
-		       RB_GSL_FFT_INPLACE);
+                       RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_radix2_backward(VALUE obj)
 {
   return rb_fft_radix2(obj, gsl_fft_halfcomplex_radix2_backward,
-		       RB_GSL_FFT_COPY);
+                       RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_radix2_backward2(VALUE obj)
 {
   return rb_fft_radix2(obj, gsl_fft_halfcomplex_radix2_backward,
-		       RB_GSL_FFT_INPLACE);
+                       RB_GSL_FFT_INPLACE);
 }
 
 /*****/
 
 static VALUE rb_fft_real_trans(int argc, VALUE *argv, VALUE obj,
-			       int (*trans)(double [], size_t, size_t, 
-					    const gsl_fft_real_wavetable *, 
-					    gsl_fft_real_workspace *),
-			       int sss)
+                               int (*trans)(double [], size_t, size_t,
+                                            const gsl_fft_real_wavetable *,
+                                            gsl_fft_real_workspace *),
+                               int sss)
 {
   int flag = 0, naflag = 0;
   // local variable "status" was defined and set, but never used
@@ -678,9 +676,6 @@ static VALUE rb_fft_real_trans(int argc, VALUE *argv, VALUE obj,
   gsl_vector *vnew;
   gsl_vector_view vv;
   double *ptr1, *ptr2;
-#ifdef HAVE_NARRAY_H
-  int shape[1];
-#endif
   gsl_fft_real_wavetable *table = NULL;
   gsl_fft_real_workspace *space = NULL;
   VALUE ary;
@@ -702,6 +697,7 @@ static VALUE rb_fft_real_trans(int argc, VALUE *argv, VALUE obj,
 #ifdef HAVE_NARRAY_H
   } else if (naflag == 1) {
     if (sss == RB_GSL_FFT_COPY) {
+      int shape[1];
       shape[0] = n;
       ary = na_make_object(NA_DFLOAT, 1, shape, cNArray);
       ptr2 = NA_PTR_TYPE(ary, double*);
@@ -723,19 +719,19 @@ static VALUE rb_fft_real_trans(int argc, VALUE *argv, VALUE obj,
 static VALUE rb_gsl_fft_real_transform(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_real_trans(argc, argv, obj, gsl_fft_real_transform,
-			   RB_GSL_FFT_COPY);
+                           RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_real_transform2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_fft_real_trans(argc, argv, obj, gsl_fft_real_transform,
-			   RB_GSL_FFT_INPLACE);
+                           RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_fft_halfcomplex_trans(int argc, VALUE *argv, VALUE obj,
-				      int (*trans)(double [], size_t, size_t, 
-						   const gsl_fft_halfcomplex_wavetable *, gsl_fft_real_workspace *),
-				      int sss)
+                                      int (*trans)(double [], size_t, size_t,
+                                                   const gsl_fft_halfcomplex_wavetable *, gsl_fft_real_workspace *),
+                                      int sss)
 {
   int flag = 0, naflag = 0;
   // local variable "status" was defined and set, but never used
@@ -744,14 +740,11 @@ static VALUE rb_fft_halfcomplex_trans(int argc, VALUE *argv, VALUE obj,
   gsl_vector *vnew;
   gsl_vector_view vv;
   double *ptr1, *ptr2;
-#ifdef HAVE_NARRAY_H
-  int shape[1];
-#endif
   gsl_fft_halfcomplex_wavetable *table = NULL;
   gsl_fft_real_workspace *space = NULL;
   VALUE ary;
-  flag = gsl_fft_get_argv_halfcomplex(argc, argv, obj, &ptr1, &stride, &n, 
-			   &table, &space, &naflag);
+  flag = gsl_fft_get_argv_halfcomplex(argc, argv, obj, &ptr1, &stride, &n,
+                                      &table, &space, &naflag);
   if (naflag == 0) {
     if (sss == RB_GSL_FFT_COPY) {
       vnew = gsl_vector_alloc(n);
@@ -769,6 +762,7 @@ static VALUE rb_fft_halfcomplex_trans(int argc, VALUE *argv, VALUE obj,
 #ifdef HAVE_NARRAY_H
   } else if (naflag == 1) {
     if (sss == RB_GSL_FFT_COPY) {
+      int shape[1];
       shape[0] = n;
       ary = na_make_object(NA_DFLOAT, 1, shape, cNArray);
       ptr2 = NA_PTR_TYPE(ary, double*);
@@ -789,44 +783,44 @@ static VALUE rb_fft_halfcomplex_trans(int argc, VALUE *argv, VALUE obj,
 
 static VALUE rb_gsl_fft_halfcomplex_transform(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_fft_halfcomplex_trans(argc, argv, obj, 
-				  gsl_fft_halfcomplex_transform,
-				  RB_GSL_FFT_COPY);
+  return rb_fft_halfcomplex_trans(argc, argv, obj,
+                                  gsl_fft_halfcomplex_transform,
+                                  RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_transform2(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_fft_halfcomplex_trans(argc, argv, obj, 
-				  gsl_fft_halfcomplex_transform,
-				  RB_GSL_FFT_INPLACE);
+  return rb_fft_halfcomplex_trans(argc, argv, obj,
+                                  gsl_fft_halfcomplex_transform,
+                                  RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_backward(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_fft_halfcomplex_trans(argc, argv, obj, 
-				  gsl_fft_halfcomplex_backward,
-				  RB_GSL_FFT_COPY);
+  return rb_fft_halfcomplex_trans(argc, argv, obj,
+                                  gsl_fft_halfcomplex_backward,
+                                  RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_backward2(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_fft_halfcomplex_trans(argc, argv, obj, 
-				  gsl_fft_halfcomplex_backward,
-				  RB_GSL_FFT_INPLACE);
+  return rb_fft_halfcomplex_trans(argc, argv, obj,
+                                  gsl_fft_halfcomplex_backward,
+                                  RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_inverse(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_fft_halfcomplex_trans(argc, argv, obj, 
-				  gsl_fft_halfcomplex_inverse,
-				  RB_GSL_FFT_COPY);
+  return rb_fft_halfcomplex_trans(argc, argv, obj,
+                                  gsl_fft_halfcomplex_inverse,
+                                  RB_GSL_FFT_COPY);
 }
 
 static VALUE rb_gsl_fft_halfcomplex_inverse2(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_fft_halfcomplex_trans(argc, argv, obj, 
-				  gsl_fft_halfcomplex_inverse,
-				  RB_GSL_FFT_INPLACE);
+  return rb_fft_halfcomplex_trans(argc, argv, obj,
+                                  gsl_fft_halfcomplex_inverse,
+                                  RB_GSL_FFT_INPLACE);
 }
 
 static VALUE rb_gsl_fft_real_unpack(VALUE obj)
@@ -867,7 +861,7 @@ static VALUE rb_gsl_fft_halfcomplex_to_nrc(VALUE obj)
   vnew = gsl_vector_alloc(v->size);
   gsl_vector_set(vnew, 0, gsl_vector_get(v, 0));  /* DC */
   gsl_vector_set(vnew, 1, gsl_vector_get(v, v->size/2));  /* Nyquist freq */
-  for (i = 2, k = 1; i < vnew->size; i+=2, k++) {
+  for (i = 2, k = 1; i < vnew->size; i += 2, k++) {
     gsl_vector_set(vnew, i, gsl_vector_get(v, k));
     gsl_vector_set(vnew, i+1, -gsl_vector_get(v, v->size-k));
   }
@@ -886,12 +880,12 @@ static VALUE rb_gsl_fft_halfcomplex_amp_phase(VALUE obj)
   amp = gsl_vector_alloc(v->size/2);
   phase = gsl_vector_alloc(v->size/2);
   gsl_vector_set(amp, 0, gsl_vector_get(v, 0));
-  gsl_vector_set(phase, 0, 0);  
+  gsl_vector_set(phase, 0, 0);
   gsl_vector_set(amp, amp->size-1, gsl_vector_get(v, v->size-1));
-  gsl_vector_set(phase, phase->size-1, 0);    
-  for (i = 1; i < v->size-1; i+=2) {
+  gsl_vector_set(phase, phase->size-1, 0);
+  for (i = 1; i < v->size-1; i += 2) {
     re = gsl_vector_get(v, i);
-    im = gsl_vector_get(v, i+1);    
+    im = gsl_vector_get(v, i+1);
     gsl_vector_set(amp, i/2+1, sqrt(re*re + im*im));
     gsl_vector_set(phase, i/2+1, atan2(im, re));
   }
@@ -912,40 +906,40 @@ void Init_gsl_fft(VALUE module)
   rb_define_const(mgsl_fft, "BACKWARD", INT2FIX(gsl_fft_backward));
 
   /* Transforms for complex vectors */
-  rb_define_method(cgsl_vector_complex, "radix2_forward", 
-		   rb_gsl_fft_complex_radix2_forward, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_transform", 
-		   rb_gsl_fft_complex_radix2_transform, 1);
-  rb_define_method(cgsl_vector_complex, "radix2_backward", 
-		   rb_gsl_fft_complex_radix2_backward, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_inverse", 
-		   rb_gsl_fft_complex_radix2_inverse, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_dif_forward", 
-		   rb_gsl_fft_complex_radix2_dif_forward, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_dif_transform", 
-		   rb_gsl_fft_complex_radix2_dif_transform, 1);
-  rb_define_method(cgsl_vector_complex, "radix2_dif_backward", 
-		   rb_gsl_fft_complex_radix2_dif_backward, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_dif_inverse", 
-		   rb_gsl_fft_complex_radix2_dif_inverse, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_forward",
+                   rb_gsl_fft_complex_radix2_forward, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_transform",
+                   rb_gsl_fft_complex_radix2_transform, 1);
+  rb_define_method(cgsl_vector_complex, "radix2_backward",
+                   rb_gsl_fft_complex_radix2_backward, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_inverse",
+                   rb_gsl_fft_complex_radix2_inverse, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_dif_forward",
+                   rb_gsl_fft_complex_radix2_dif_forward, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_dif_transform",
+                   rb_gsl_fft_complex_radix2_dif_transform, 1);
+  rb_define_method(cgsl_vector_complex, "radix2_dif_backward",
+                   rb_gsl_fft_complex_radix2_dif_backward, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_dif_inverse",
+                   rb_gsl_fft_complex_radix2_dif_inverse, 0);
 
   /* In-place radix-2 transforms for complex vectors */
-  rb_define_method(cgsl_vector_complex, "radix2_forward!", 
-		   rb_gsl_fft_complex_radix2_forward2, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_forward!",
+                   rb_gsl_fft_complex_radix2_forward2, 0);
   rb_define_method(cgsl_vector_complex, "radix2_transform!",
-		   rb_gsl_fft_complex_radix2_transform2, 1);
-  rb_define_method(cgsl_vector_complex, "radix2_backward!", 
-		   rb_gsl_fft_complex_radix2_backward2, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_inverse!", 
-		   rb_gsl_fft_complex_radix2_inverse2, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_dif_forward!", 
-		   rb_gsl_fft_complex_radix2_dif_forward2, 0);
+                   rb_gsl_fft_complex_radix2_transform2, 1);
+  rb_define_method(cgsl_vector_complex, "radix2_backward!",
+                   rb_gsl_fft_complex_radix2_backward2, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_inverse!",
+                   rb_gsl_fft_complex_radix2_inverse2, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_dif_forward!",
+                   rb_gsl_fft_complex_radix2_dif_forward2, 0);
   rb_define_method(cgsl_vector_complex, "radix2_dif_transform!",
-		   rb_gsl_fft_complex_radix2_dif_transform2, 1);
-  rb_define_method(cgsl_vector_complex, "radix2_dif_backward!", 
-		   rb_gsl_fft_complex_radix2_dif_backward2, 0);
-  rb_define_method(cgsl_vector_complex, "radix2_dif_inverse!", 
-		   rb_gsl_fft_complex_radix2_dif_inverse2, 0);
+                   rb_gsl_fft_complex_radix2_dif_transform2, 1);
+  rb_define_method(cgsl_vector_complex, "radix2_dif_backward!",
+                   rb_gsl_fft_complex_radix2_dif_backward2, 0);
+  rb_define_method(cgsl_vector_complex, "radix2_dif_inverse!",
+                   rb_gsl_fft_complex_radix2_dif_inverse2, 0);
 
   // class GSL::FFT::Wavetable < GSL::Object
   //
@@ -957,23 +951,23 @@ void Init_gsl_fft(VALUE module)
   // No alloc
   // TODO Make GSL::FFT::Wavetable#initialize private?
   rb_define_method(cgsl_fft_wavetable, "n",
-			     rb_GSL_FFT_Wavetable_n, 0);
+                   rb_GSL_FFT_Wavetable_n, 0);
   rb_define_method(cgsl_fft_wavetable, "nf",
-			     rb_GSL_FFT_Wavetable_nf, 0);
+                   rb_GSL_FFT_Wavetable_nf, 0);
   rb_define_method(cgsl_fft_wavetable, "factor",
-		   rb_GSL_FFT_Wavetable_factor, 0);
+                   rb_GSL_FFT_Wavetable_factor, 0);
 
   // class GSL::FFT::ComplexWavetable < GSL::FFT::Wavetable
   cgsl_fft_complex_wavetable = rb_define_class_under(mgsl_fft, "ComplexWavetable",
-						     cgsl_fft_wavetable);
+                                                     cgsl_fft_wavetable);
   rb_define_singleton_method(cgsl_fft_complex_wavetable, "alloc",
-			     rb_gsl_fft_complex_wavetable_new, 1);
+                             rb_gsl_fft_complex_wavetable_new, 1);
 
   // class GSL::FFT::ComplexWorkspace < GSL::Object
-  cgsl_fft_complex_workspace = rb_define_class_under(mgsl_fft, "ComplexWorkspace", 
-						     cGSL_Object);
+  cgsl_fft_complex_workspace = rb_define_class_under(mgsl_fft, "ComplexWorkspace",
+                                                     cGSL_Object);
   rb_define_singleton_method(cgsl_fft_complex_workspace, "alloc",
-			     rb_gsl_fft_complex_workspace_new, 1);
+                             rb_gsl_fft_complex_workspace_new, 1);
 
   rb_define_method(cgsl_vector_complex, "forward", rb_gsl_fft_complex_forward, -1);
   rb_define_method(cgsl_vector_complex, "transform", rb_gsl_fft_complex_transform, -1);
@@ -988,58 +982,58 @@ void Init_gsl_fft(VALUE module)
   /*****/
 
   // TODO Do these method names need the "real_" and "halfcomplex_" prefixes?
-  rb_define_method(cgsl_vector, "real_radix2_transform", 
-		   rb_gsl_fft_real_radix2_transform, 0);
+  rb_define_method(cgsl_vector, "real_radix2_transform",
+                   rb_gsl_fft_real_radix2_transform, 0);
   rb_define_alias(cgsl_vector, "radix2_transform", "real_radix2_transform");
   rb_define_alias(cgsl_vector, "radix2_forward", "real_radix2_transform");
-  rb_define_method(cgsl_vector, "real_radix2_inverse", 
-		   rb_gsl_fft_halfcomplex_radix2_inverse, 0);
+  rb_define_method(cgsl_vector, "real_radix2_inverse",
+                   rb_gsl_fft_halfcomplex_radix2_inverse, 0);
   rb_define_alias(cgsl_vector, "radix2_inverse", "real_radix2_inverse");
-  rb_define_alias(cgsl_vector, "halfcomplex_radix2_inverse", 
-		  "real_radix2_inverse");
-  rb_define_method(cgsl_vector, "real_radix2_backward", 
-		   rb_gsl_fft_halfcomplex_radix2_backward, 0);
+  rb_define_alias(cgsl_vector, "halfcomplex_radix2_inverse",
+                  "real_radix2_inverse");
+  rb_define_method(cgsl_vector, "real_radix2_backward",
+                   rb_gsl_fft_halfcomplex_radix2_backward, 0);
   rb_define_alias(cgsl_vector, "radix2_backward", "real_radix2_backward");
-  rb_define_alias(cgsl_vector, "halfcomplex_radix2_backward", 
-		  "real_radix2_backward");
+  rb_define_alias(cgsl_vector, "halfcomplex_radix2_backward",
+                  "real_radix2_backward");
 
   // TODO Do these method names need the "real_" and "halfcomplex_" prefixes?
-  rb_define_method(cgsl_vector, "real_radix2_transform!", 
-		   rb_gsl_fft_real_radix2_transform2, 0);
+  rb_define_method(cgsl_vector, "real_radix2_transform!",
+                   rb_gsl_fft_real_radix2_transform2, 0);
   rb_define_alias(cgsl_vector, "radix2_transform!", "real_radix2_transform!");
   rb_define_alias(cgsl_vector, "radix2_forward!", "real_radix2_transform!");
-  rb_define_method(cgsl_vector, "real_radix2_inverse!", 
-		   rb_gsl_fft_halfcomplex_radix2_inverse2, 0);
+  rb_define_method(cgsl_vector, "real_radix2_inverse!",
+                   rb_gsl_fft_halfcomplex_radix2_inverse2, 0);
   rb_define_alias(cgsl_vector, "radix2_inverse!", "real_radix2_inverse!");
-  rb_define_alias(cgsl_vector, "halfcomplex_radix2_inverse!", 
-		  "real_radix2_inverse!");
-  rb_define_method(cgsl_vector, "real_radix2_backward!", 
-		   rb_gsl_fft_halfcomplex_radix2_backward2, 0);
+  rb_define_alias(cgsl_vector, "halfcomplex_radix2_inverse!",
+                  "real_radix2_inverse!");
+  rb_define_method(cgsl_vector, "real_radix2_backward!",
+                   rb_gsl_fft_halfcomplex_radix2_backward2, 0);
   rb_define_alias(cgsl_vector, "radix2_backward!", "real_radix2_backward!");
-  rb_define_alias(cgsl_vector, "halfcomplex_radix2_backward!", 
-		  "real_radix2_backward!");
+  rb_define_alias(cgsl_vector, "halfcomplex_radix2_backward!",
+                  "real_radix2_backward!");
 
   /*****/
 
   // class GSL::FFT::RealWavetable < GSL::FFT::Wavetable
-  cgsl_fft_real_wavetable = rb_define_class_under(mgsl_fft, "RealWavetable", 
-						  cgsl_fft_wavetable);
+  cgsl_fft_real_wavetable = rb_define_class_under(mgsl_fft, "RealWavetable",
+                                                  cgsl_fft_wavetable);
   rb_define_singleton_method(cgsl_fft_real_wavetable, "alloc",
-			     rb_gsl_fft_real_wavetable_new, 1);
+                             rb_gsl_fft_real_wavetable_new, 1);
 
   // class GSL::FFT::HalfComplexWavetable < GSL::FFT::Wavetable
-  cgsl_fft_halfcomplex_wavetable = rb_define_class_under(mgsl_fft, 
-							 "HalfComplexWavetable", cgsl_fft_wavetable);
+  cgsl_fft_halfcomplex_wavetable = rb_define_class_under(mgsl_fft,
+                                                         "HalfComplexWavetable", cgsl_fft_wavetable);
   rb_define_singleton_method(cgsl_fft_halfcomplex_wavetable, "alloc",
-			     rb_gsl_fft_halfcomplex_wavetable_new, 1);
+                             rb_gsl_fft_halfcomplex_wavetable_new, 1);
 
   /*****/
 
   // class GSL::FFT::RealWorkspace < GSL::Object
-  cgsl_fft_real_workspace = rb_define_class_under(mgsl_fft, "RealWorkspace", 
-						  cGSL_Object);
+  cgsl_fft_real_workspace = rb_define_class_under(mgsl_fft, "RealWorkspace",
+                                                  cGSL_Object);
   rb_define_singleton_method(cgsl_fft_real_workspace, "alloc",
-			     rb_gsl_fft_real_workspace_new, 1);
+                             rb_gsl_fft_real_workspace_new, 1);
 
   /*****/
 
@@ -1049,14 +1043,14 @@ void Init_gsl_fft(VALUE module)
   rb_define_alias(cgsl_vector, "forward", "real_transform");
   rb_define_alias(cgsl_vector, "fft_forward", "real_transform");
   rb_define_alias(cgsl_vector, "fft", "real_transform");
-  rb_define_method(cgsl_vector, "halfcomplex_transform", 
-		   rb_gsl_fft_halfcomplex_transform, -1);
-  rb_define_method(cgsl_vector, "halfcomplex_backward", 
-		   rb_gsl_fft_halfcomplex_backward, -1);
+  rb_define_method(cgsl_vector, "halfcomplex_transform",
+                   rb_gsl_fft_halfcomplex_transform, -1);
+  rb_define_method(cgsl_vector, "halfcomplex_backward",
+                   rb_gsl_fft_halfcomplex_backward, -1);
   rb_define_alias(cgsl_vector, "backward", "halfcomplex_backward");
   rb_define_alias(cgsl_vector, "fft_backward", "halfcomplex_backward");
-  rb_define_method(cgsl_vector, "halfcomplex_inverse", 
-		   rb_gsl_fft_halfcomplex_inverse, -1); 
+  rb_define_method(cgsl_vector, "halfcomplex_inverse",
+                   rb_gsl_fft_halfcomplex_inverse, -1);
   rb_define_alias(cgsl_vector, "fft_inverse", "halfcomplex_inverse");
   rb_define_alias(cgsl_vector, "ifft", "halfcomplex_inverse");
   rb_define_alias(cgsl_vector, "inverse", "halfcomplex_inverse");
@@ -1066,14 +1060,14 @@ void Init_gsl_fft(VALUE module)
   rb_define_alias(cgsl_vector, "forward!", "real_transform!");
   rb_define_alias(cgsl_vector, "fft_forward!", "real_transform!");
   rb_define_alias(cgsl_vector, "fft!", "real_transform!");
-  rb_define_method(cgsl_vector, "halfcomplex_transform!", 
-		   rb_gsl_fft_halfcomplex_transform2, -1);
+  rb_define_method(cgsl_vector, "halfcomplex_transform!",
+                   rb_gsl_fft_halfcomplex_transform2, -1);
   rb_define_method(cgsl_vector, "halfcomplex_backward!",
-		   rb_gsl_fft_halfcomplex_backward2, -1);
+                   rb_gsl_fft_halfcomplex_backward2, -1);
   rb_define_alias(cgsl_vector, "backward!", "halfcomplex_backward!");
   rb_define_alias(cgsl_vector, "fft_backward!", "halfcomplex_backward!");
-  rb_define_method(cgsl_vector, "halfcomplex_inverse!", 
-		   rb_gsl_fft_halfcomplex_inverse2, -1); 
+  rb_define_method(cgsl_vector, "halfcomplex_inverse!",
+                   rb_gsl_fft_halfcomplex_inverse2, -1);
   rb_define_alias(cgsl_vector, "fft_inverse!", "halfcomplex_inverse!");
   rb_define_alias(cgsl_vector, "ifft!", "halfcomplex_inverse!");
   rb_define_alias(cgsl_vector, "inverse!", "halfcomplex_inverse!");
@@ -1084,8 +1078,8 @@ void Init_gsl_fft(VALUE module)
   rb_define_alias(cgsl_vector, "real_to_complex", "fft_real_unpack");
   rb_define_alias(cgsl_vector, "r_to_c", "fft_real_unpack");
 
-  rb_define_method(cgsl_vector, "fft_halfcomplex_unpack", 
-		   rb_gsl_fft_halfcomplex_unpack, 0);
+  rb_define_method(cgsl_vector, "fft_halfcomplex_unpack",
+                   rb_gsl_fft_halfcomplex_unpack, 0);
   rb_define_alias(cgsl_vector, "halfcomplex_unpack", "fft_halfcomplex_unpack");
   rb_define_alias(cgsl_vector, "halfcomplex_to_complex", "fft_halfcomplex_unpack");
   rb_define_alias(cgsl_vector, "hc_to_c", "fft_halfcomplex_unpack");
@@ -1093,9 +1087,9 @@ void Init_gsl_fft(VALUE module)
   /*****/
 
   rb_define_method(cgsl_vector, "to_nrc_order",
-			     rb_gsl_fft_halfcomplex_to_nrc, 0);
-			     
+                   rb_gsl_fft_halfcomplex_to_nrc, 0);
+
   rb_define_method(cgsl_vector, "halfcomplex_amp_phase",
-			     rb_gsl_fft_halfcomplex_amp_phase, 0);
+                   rb_gsl_fft_halfcomplex_amp_phase, 0);
   rb_define_alias(cgsl_vector, "hc_amp_phase", "halfcomplex_amp_phase");
 }
diff --git a/ext/gsl/fit.c b/ext/gsl_native/fit.c
similarity index 88%
rename from ext/gsl/fit.c
rename to ext/gsl_native/fit.c
index e5c86b8..26d6d6a 100644
--- a/ext/gsl/fit.c
+++ b/ext/gsl_native/fit.c
@@ -35,10 +35,10 @@ static VALUE rb_gsl_fit_linear(int argc, VALUE *argv, VALUE obj)
     break;
   }
   status = gsl_fit_linear(ptrx, stridex, ptry, stridey, n, &c0, &c1, &cov00,
-			  &cov01, &cov11, &sumsq);
+                          &cov01, &cov11, &sumsq);
   return rb_ary_new3(7, rb_float_new(c0), rb_float_new(c1), rb_float_new(cov00),
-		     rb_float_new(cov01), rb_float_new(cov11), rb_float_new(sumsq),
-		     INT2FIX(status));
+                     rb_float_new(cov01), rb_float_new(cov11), rb_float_new(sumsq),
+                     INT2FIX(status));
 }
 
 /* linear fit with weights: y = c0 + c1 x */
@@ -54,7 +54,7 @@ static VALUE rb_gsl_fit_wlinear(int argc, VALUE *argv, VALUE obj)
     ptrw = get_vector_ptr(argv[1], &stridew, &n);
     ptry = get_vector_ptr(argv[2], &stridey, &n);
     break;
-  case 4:   
+  case 4:
     CHECK_FIXNUM(argv[3]);
     ptrx = get_vector_ptr(argv[0], &stridex, &n);
     ptrw = get_vector_ptr(argv[1], &stridew, &n);
@@ -66,11 +66,11 @@ static VALUE rb_gsl_fit_wlinear(int argc, VALUE *argv, VALUE obj)
     break;
   }
   status = gsl_fit_wlinear(ptrx, stridex, ptrw, stridew, ptry, stridey,
-			   n,
-			   &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
+                           n,
+                           &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
   return rb_ary_new3(7, rb_float_new(c0), rb_float_new(c1), rb_float_new(cov00),
-		     rb_float_new(cov01), rb_float_new(cov11), rb_float_new(sumsq),
-		     INT2FIX(status));
+                     rb_float_new(cov01), rb_float_new(cov11), rb_float_new(sumsq),
+                     INT2FIX(status));
 }
 
 static VALUE rb_gsl_fit_linear_est(int argc, VALUE *argv, VALUE obj)
@@ -129,8 +129,8 @@ static VALUE rb_gsl_fit_mul(int argc, VALUE *argv, VALUE obj)
     break;
   }
   status = gsl_fit_mul(ptrx, stridex, ptry, stridey, n, &c1, &cov11, &sumsq);
-  return rb_ary_new3(4, rb_float_new(c1), 
-		     rb_float_new(cov11), rb_float_new(sumsq), INT2FIX(status));
+  return rb_ary_new3(4, rb_float_new(c1),
+                     rb_float_new(cov11), rb_float_new(sumsq), INT2FIX(status));
 }
 
 static VALUE rb_gsl_fit_wmul(int argc, VALUE *argv, VALUE obj)
@@ -145,7 +145,7 @@ static VALUE rb_gsl_fit_wmul(int argc, VALUE *argv, VALUE obj)
     ptrw = get_vector_ptr(argv[1], &stridew, &n);
     ptry = get_vector_ptr(argv[2], &stridey, &n);
     break;
-  case 4:   
+  case 4:
     CHECK_FIXNUM(argv[3]);
     ptrx = get_vector_ptr(argv[0], &stridex, &n);
     ptrw = get_vector_ptr(argv[1], &stridew, &n);
@@ -156,10 +156,10 @@ static VALUE rb_gsl_fit_wmul(int argc, VALUE *argv, VALUE obj)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
     break;
   }
-  status = gsl_fit_wmul(ptrx, stridex, ptrw, stridew, ptry, stridey, 
-			n, &c1, &cov11, &sumsq);
-  return rb_ary_new3(4, rb_float_new(c1), 
-		     rb_float_new(cov11), rb_float_new(sumsq), INT2FIX(status));
+  status = gsl_fit_wmul(ptrx, stridex, ptrw, stridew, ptry, stridey,
+                        n, &c1, &cov11, &sumsq);
+  return rb_ary_new3(4, rb_float_new(c1),
+                     rb_float_new(cov11), rb_float_new(sumsq), INT2FIX(status));
 }
 
 static VALUE rb_gsl_fit_mul_est(int argc, VALUE *argv, VALUE obj)
@@ -194,7 +194,7 @@ static VALUE rb_gsl_fit_mul_est(int argc, VALUE *argv, VALUE obj)
 void Init_gsl_fit(VALUE module)
 {
   VALUE mgsl_fit;
-  mgsl_fit = rb_define_module_under(module, "Fit"); 
+  mgsl_fit = rb_define_module_under(module, "Fit");
   rb_define_module_function(mgsl_fit, "linear", rb_gsl_fit_linear, -1);
   rb_define_module_function(mgsl_fit, "wlinear", rb_gsl_fit_wlinear, -1);
   rb_define_module_function(mgsl_fit, "linear_est", rb_gsl_fit_linear_est, -1);
diff --git a/ext/gsl_native/fresnel.c b/ext/gsl_native/fresnel.c
new file mode 100644
index 0000000..a785194
--- /dev/null
+++ b/ext/gsl_native/fresnel.c
@@ -0,0 +1,312 @@
+/****************************************************************************
+ *              fresnel.c -
+ *  Calculation of Fresnel integrals by expansion to Chebyshev series
+ *  Expansions are taken from the book
+ *  Y.L. Luke. Mathematical functions and their approximations.
+ *  Moscow, "Mir", 1980. PP. 145-149 (Russian edition)
+ ****************************************************************************
+ */
+/*
+  Modified for Ruby bindings
+          2006/Dec/24 Y. TSUNESADA
+*/
+#include <math.h>
+#include "include/rb_gsl.h"
+#include "include/rb_gsl_sf.h"
+
+static const double sqrt_pi_2   = 1.2533141373155002512078826424; /* sqrt(pi/2) */
+static const double sqrt_2_pi   = 0.7978845608028653558798921199; /* sqrt(2/pi) */
+static const double _1_sqrt_2pi = 0.3989422804014326779399460599; /* 1/sqrt(2*pi) */
+static const double pi_2        = 1.5707963267948966192313216916; /* pi/2 */
+
+static double f_data_a[18] =
+{
+  0.76435138664186000189,
+  -0.43135547547660179313,
+  0.43288199979726653054,
+  -0.26973310338387111029,
+  0.08416045320876935378,
+  -0.01546524484461381958,
+  0.00187855423439822018,
+  -0.00016264977618887547,
+  0.00001057397656383260,
+  -0.00000053609339889243,
+  0.00000002181658454933,
+  -0.00000000072901621186,
+  0.00000000002037332546,
+  -0.00000000000048344033,
+  0.00000000000000986533,
+  -0.00000000000000017502,
+  0.00000000000000000272,
+  -0.00000000000000000004
+};
+
+static double f_data_b[17] =
+{
+  0.63041404314570539241,
+  -0.42344511405705333544,
+  0.37617172643343656625,
+  -0.16249489154509567415,
+  0.03822255778633008694,
+  -0.00564563477132190899,
+  0.00057454951976897367,
+  -0.00004287071532102004,
+  0.00000245120749923299,
+  -0.00000011098841840868,
+  0.00000000408249731696,
+  -0.00000000012449830219,
+  0.00000000000320048425,
+  -0.00000000000007032416,
+  0.00000000000000133638,
+  -0.00000000000000002219,
+  0.00000000000000000032
+};
+
+static double fresnel_cos_0_8(double x)
+{
+  double x_8 = x/8.0;
+  double xx = 2.0*x_8*x_8 - 1.0;
+
+  double t0 = 1.0;
+  double t1 = xx;
+  double sumC = f_data_a[0] + f_data_a[1]*t1;
+  double t2;
+  int n;
+  for (n = 2; n < 18; n++)
+  {
+    t2 = 2.0*xx*t1 - t0;
+    sumC += f_data_a[n]*t2;
+    t0 = t1; t1 = t2;
+  }
+  return _1_sqrt_2pi*sqrt(x)*sumC;
+}
+
+static double fresnel_sin_0_8(double x)
+{
+  double x_8 = x/8.0;
+  double xx = 2.0*x_8*x_8 - 1.0;
+  double t0 = 1.;
+  double t1 = xx;
+  double ot1 = x_8;
+  double ot2 = 2.0*x_8*t1 - ot1;
+  double sumS = f_data_b[0]*ot1 + f_data_b[1]*ot2;
+  int n;
+  double t2;
+  for (n = 2; n < 17; n++)
+  {
+    t2 = 2.0*xx*t1 - t0;
+    ot1 = ot2;
+    ot2 = 2.0*x_8*t2 - ot1;
+    sumS += f_data_b[n]*ot2;
+    t0 = t1; t1 = t2;
+  }
+  return _1_sqrt_2pi*sqrt(x)*sumS;
+}
+
+static double f_data_e[41] =
+{
+  0.97462779093296822410,
+  -0.02424701873969321371,
+  0.00103400906842977317,
+  -0.00008052450246908016,
+  0.00000905962481966582,
+  -0.00000131016996757743,
+  0.00000022770820391497,
+  -0.00000004558623552026,
+  0.00000001021567537083,
+  -0.00000000251114508133,
+  0.00000000066704761275,
+  -0.00000000018931512852,
+  0.00000000005689898935,
+  -0.00000000001798219359,
+  0.00000000000594162963,
+  -0.00000000000204285065,
+  0.00000000000072797580,
+  -0.00000000000026797428,
+  0.00000000000010160694,
+  -0.00000000000003958559,
+  0.00000000000001581262,
+  -0.00000000000000646411,
+  0.00000000000000269981,
+  -0.00000000000000115038,
+  0.00000000000000049942,
+  -0.00000000000000022064,
+  0.00000000000000009910,
+  -0.00000000000000004520,
+  0.00000000000000002092,
+  -0.00000000000000000982,
+  0.00000000000000000467,
+  -0.00000000000000000225,
+  0.00000000000000000110,
+  -0.00000000000000000054,
+  0.00000000000000000027,
+  -0.00000000000000000014,
+  0.00000000000000000007,
+  -0.00000000000000000004,
+  0.00000000000000000002,
+  -0.00000000000000000001,
+  0.00000000000000000001
+};
+
+static double f_data_f[35] =
+{
+  0.99461545179407928910,
+  -0.00524276766084297210,
+  0.00013325864229883909,
+  -0.00000770856452642713,
+  0.00000070848077032045,
+  -0.00000008812517411602,
+  0.00000001359784717148,
+  -0.00000000246858295747,
+  0.00000000050925789921,
+  -0.00000000011653400634,
+  0.00000000002906578309,
+  -0.00000000000779847361,
+  0.00000000000222802542,
+  -0.00000000000067239338,
+  0.00000000000021296411,
+  -0.00000000000007041482,
+  0.00000000000002419805,
+  -0.00000000000000861080,
+  0.00000000000000316287,
+  -0.00000000000000119596,
+  0.00000000000000046444,
+  -0.00000000000000018485,
+  0.00000000000000007527,
+  -0.00000000000000003131,
+  0.00000000000000001328,
+  -0.00000000000000000574,
+  0.00000000000000000252,
+  -0.00000000000000000113,
+  0.00000000000000000051,
+  -0.00000000000000000024,
+  0.00000000000000000011,
+  -0.00000000000000000005,
+  0.00000000000000000002,
+  -0.00000000000000000001,
+  0.00000000000000000001
+};
+
+static double fresnel_cos_8_inf(double x)
+{
+  double xx = 128.0/(x*x) - 1.0;  /* 2.0*(8/x)^2 - 1 */
+  double t0 = 1.0;
+  double t1 = xx;
+  double sumP = f_data_e[0] + f_data_e[1]*t1;
+  double sumQ = f_data_f[0] + f_data_f[1]*t1;
+  double t2;
+  int n;
+  for(n = 2; n < 35; n++)
+  {
+    t2 = 2.0*xx*t1 - t0;
+    sumP += f_data_e[n]*t2; /*  sumP += f_data_e[n]*ChebyshevT(n,xx) */
+    sumQ += f_data_f[n]*t2; /*  sumQ += f_data_f[n]*ChebyshevT(n,xx) */
+    t0 = t1; t1 = t2;
+  }
+  for(n = 35; n < 41; n++)
+  {
+    t2 = 2.0*xx*t1 - t0;
+    sumP += f_data_e[n]*t2; /*  sumP += f_data_e[n]*ChebyshevT(n,xx) */
+    t0 = t1; t1 = t2;
+  }
+  return 0.5 - _1_sqrt_2pi*(0.5*sumP*cos(x)/x - sumQ*sin(x))/sqrt(x);
+}
+
+static double fresnel_sin_8_inf(double x)
+{
+  double xx = 128.0/(x*x) - 1.0;  /* 2.0*(8/x)^2 - 1 */
+  double t0 = 1.0;
+  double t1 = xx;
+  double sumP = f_data_e[0] + f_data_e[1]*t1;
+  double sumQ = f_data_f[0] + f_data_f[1]*t1;
+  double t2;
+  int n;
+  for(n = 2; n < 35; n++)
+  {
+    t2 = 2.0*xx*t1 - t0;
+    sumP += f_data_e[n]*t2; /*  sumP += f_data_e[n]*ChebyshevT(n,xx) */
+    sumQ += f_data_f[n]*t2; /*  sumQ += f_data_f[n]*ChebyshevT(n,xx) */
+    t0 = t1; t1 = t2;
+  }
+  for(n = 35; n < 41; n++)
+  {
+    t2 = 2.0*xx*t1 - t0;
+    sumP += f_data_e[n]*t2; /*  sumQ += f_data_f[n]*ChebyshevT(n,xx) */
+    t0 = t1; t1 = t2;
+  }
+  return 0.5 - _1_sqrt_2pi*(0.5*sumP*sin(x)/x + sumQ*cos(x))/sqrt(x);
+}
+
+
+double fresnel_c(double x)
+{
+  double xx = x*x*pi_2;
+  double ret_val;
+  if(xx<=8.0)
+    ret_val = fresnel_cos_0_8(xx);
+  else
+    ret_val = fresnel_cos_8_inf(xx);
+  return (x<0.0) ? -ret_val : ret_val;
+}
+
+double fresnel_s(double x)
+{
+  double xx = x*x*pi_2;
+  double ret_val;
+  if(xx<=8.0)
+    ret_val = fresnel_sin_0_8(xx);
+  else
+    ret_val = fresnel_sin_8_inf(xx);
+  return (x<0.0) ? -ret_val : ret_val;
+}
+
+double fresnel_c1(double x)
+{
+  return fresnel_c(x*sqrt_2_pi);
+}
+
+double fresnel_s1(double x)
+{
+  return fresnel_s(x*sqrt_2_pi);
+}
+
+static VALUE rb_fresnel_c(VALUE obj, VALUE x)
+{
+  return rb_gsl_sf_eval1(fresnel_c, x);
+}
+static VALUE rb_fresnel_s(VALUE obj, VALUE x)
+{
+  return rb_gsl_sf_eval1(fresnel_s, x);
+}
+static VALUE rb_fresnel_c1(VALUE obj, VALUE x)
+{
+  return rb_gsl_sf_eval1(fresnel_c1, x);
+}
+static VALUE rb_fresnel_s1(VALUE obj, VALUE x)
+{
+  return rb_gsl_sf_eval1(fresnel_s1, x);
+}
+void Init_fresnel(VALUE module)
+{
+  VALUE mfresnel;
+  mfresnel = rb_define_module_under(module, "Fresnel");
+  rb_define_module_function(module, "fresnel_c", rb_fresnel_c, 1);
+  rb_define_module_function(module, "fresnel_s", rb_fresnel_s, 1);
+  rb_define_module_function(module, "fresnel_c1", rb_fresnel_c1, 1);
+  rb_define_module_function(module, "fresnel_s1", rb_fresnel_s1, 1);
+  rb_define_module_function(mfresnel, "c", rb_fresnel_c, 1);
+  rb_define_module_function(mfresnel, "s", rb_fresnel_s, 1);
+  rb_define_module_function(mfresnel, "c1", rb_fresnel_c1, 1);
+  rb_define_module_function(mfresnel, "s1", rb_fresnel_s1, 1);
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ext/gsl/function.c b/ext/gsl_native/function.c
similarity index 91%
rename from ext/gsl/function.c
rename to ext/gsl_native/function.c
index 1c9dd4f..7f52a36 100644
--- a/ext/gsl/function.c
+++ b/ext/gsl_native/function.c
@@ -10,15 +10,12 @@
 */
 
 #include "include/rb_gsl_function.h"
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 VALUE cgsl_function;
 VALUE cgsl_function_fdf;
 
 void gsl_function_free(gsl_function *f);
-double rb_gsl_function_f(double x, void *p); 
+double rb_gsl_function_f(double x, void *p);
 ID RBGSL_ID_call, RBGSL_ID_arity;
 
 static VALUE rb_gsl_function_set_f(int argc, VALUE *argv, VALUE obj)
@@ -85,7 +82,7 @@ static VALUE rb_gsl_function_alloc(int argc, VALUE *argv, VALUE klass)
   obj = Data_Wrap_Struct(klass, gsl_function_mark, gsl_function_free, f);
   rb_gsl_function_set_f(argc, argv, obj);
   return obj;
-}			    
+}
 
 double rb_gsl_function_f(double x, void *p)
 {
@@ -108,10 +105,6 @@ static VALUE rb_gsl_function_eval(VALUE obj, VALUE x)
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
   size_t i, j, n;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   Data_Get_Struct(obj, gsl_function, F);
   ary = (VALUE) F->params;
   proc = rb_ary_entry(ary, 0);
@@ -141,16 +134,18 @@ static VALUE rb_gsl_function_eval(VALUE obj, VALUE x)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(x)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       GetNArray(x, na);
       ptr1 = (double *) na->ptr;
       n = na->total;
       ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(x));
       ptr2 = NA_PTR_TYPE(ary, double*);
       for (i = 0; i < n; i++) {
-	x2 = rb_float_new(ptr1[i]);
-	if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, x2);
-	else result = rb_funcall(proc, RBGSL_ID_call, 2, x2, params);
-	ptr2[i] = NUM2DBL(result);
+        x2 = rb_float_new(ptr1[i]);
+        if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, x2);
+        else result = rb_funcall(proc, RBGSL_ID_call, 2, x2, params);
+        ptr2[i] = NUM2DBL(result);
       }
       return ary;
     }
@@ -159,22 +154,22 @@ static VALUE rb_gsl_function_eval(VALUE obj, VALUE x)
       Data_Get_Struct(x, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	x2 = rb_float_new(gsl_vector_get(v, i));
-	if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, x2);
-	else result = rb_funcall(proc, RBGSL_ID_call, 2, x2, params);
-	gsl_vector_set(vnew, i, NUM2DBL(result));
+        x2 = rb_float_new(gsl_vector_get(v, i));
+        if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, x2);
+        else result = rb_funcall(proc, RBGSL_ID_call, 2, x2, params);
+        gsl_vector_set(vnew, i, NUM2DBL(result));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(x)) {
       Data_Get_Struct(x, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  x2 = rb_float_new(gsl_matrix_get(m, i, j));
-	  if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, x2);
-	  else result = rb_funcall(proc, RBGSL_ID_call, 2, x2, params);
-	  gsl_matrix_set(mnew, i, j, NUM2DBL(result));
-	}
+        for (j = 0; j < m->size2; j++) {
+          x2 = rb_float_new(gsl_matrix_get(m, i, j));
+          if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, x2);
+          else result = rb_funcall(proc, RBGSL_ID_call, 2, x2, params);
+          gsl_matrix_set(mnew, i, j, NUM2DBL(result));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -242,7 +237,7 @@ static VALUE rb_gsl_function_graph(int argc, VALUE *argv, VALUE obj)
   case 2:
     Check_Type(argv[1], T_STRING);
     strcpy(opt, STR2CSTR(argv[1]));
-    /* no break, do next */
+  /* no break, do next */
   case 1:
     if (CLASS_OF(argv[0]) == rb_cRange) argv[0] = rb_gsl_range2ary(argv[0]);
     if (TYPE(argv[0]) == T_ARRAY) {
@@ -250,16 +245,16 @@ static VALUE rb_gsl_function_graph(int argc, VALUE *argv, VALUE obj)
       n = RARRAY_LEN(argv[0]);
       v = gsl_vector_alloc(n);
       flag = 1;
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, NUM2DBL(rb_ary_entry(argv[0], i)));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, NUM2DBL(rb_ary_entry(argv[0], i)));
     } else if (rb_obj_is_kind_of(argv[0], cgsl_vector)) {
       Data_Get_Struct(argv[0], gsl_vector, v);
       n = v->size;
       flag = 0;
     } else {
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s (Array or GSL::Vector expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s (Array or GSL::Vector expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   default:
@@ -281,7 +276,7 @@ static VALUE rb_gsl_function_graph(int argc, VALUE *argv, VALUE obj)
     fprintf(fp, "%e %e\n", x, y);
   }
   fflush(fp);
- pclose(fp);
+  pclose(fp);
   fp = NULL;
   if (flag == 1) gsl_vector_free(v);
   return Qtrue;
@@ -310,15 +305,14 @@ static void setfunc(int i, VALUE *argv, gsl_function_fdf *F)
   } else {
     ary = (VALUE) F->params;
   }
-
   if (rb_obj_is_kind_of(argv[i], rb_cProc)) {
     rb_ary_store(ary, i, argv[i]);
-  } else if (TYPE(argv[i]) == T_ARRAY || rb_obj_is_kind_of(argv[i], cgsl_vector) 
-	     || TYPE(argv[i]) == T_FIXNUM || TYPE(argv[i]) == T_FLOAT) {
+  } else if (TYPE(argv[i]) == T_ARRAY || rb_obj_is_kind_of(argv[i], cgsl_vector)
+             || TYPE(argv[i]) == T_FIXNUM || TYPE(argv[i]) == T_FLOAT) {
     rb_ary_store(ary, 3, argv[i]);
   } else {
-    rb_raise(rb_eArgError, 
-	     "wrong type argument (Proc, Array, GSL::Vector or a number)");
+    rb_raise(rb_eArgError,
+             "wrong type argument (Proc, Array, GSL::Vector or a number)");
   }
 }
 
diff --git a/ext/gsl/geometry.c b/ext/gsl_native/geometry.c
similarity index 80%
rename from ext/gsl/geometry.c
rename to ext/gsl_native/geometry.c
index 3d9b4cf..0996a7e 100644
--- a/ext/gsl/geometry.c
+++ b/ext/gsl_native/geometry.c
@@ -1,20 +1,20 @@
 #include "include/rb_gsl.h"
 
 /*!
-  Counter-clockwise rotation around the X-axis 
+  Counter-clockwise rotation around the X-axis
 
   / x' \    /  1     0      0    \ / x \
   | y' |  = |  0  cos_th -sin_th | | y |
   \ z' /    \  0  sin_th  cos_th / \ z /
 
  */
-void vector3_rotateX(const double x[3] /*!< Input */, 
-                        double theta /*!< Rotation angle */, 
-                        double xout[3]  /*!< Output */)
+void vector3_rotateX(const double x[3] /*!< Input */,
+                     double theta /*!< Rotation angle */,
+                     double xout[3] /*!< Output */)
 {
   double a, b, c;
   double costheta, sintheta;
-  
+
   costheta = cos(theta);
   sintheta = sin(theta);
 
@@ -28,7 +28,7 @@ void vector3_rotateX(const double x[3] /*!< Input */,
 }
 
 /*!
-  Counter-clockwise rotation around the Y-axis 
+  Counter-clockwise rotation around the Y-axis
   (Note the sign of the matrix element.)
 
   / x' \    /  cos_th     0   sin_th \ / x \
@@ -36,9 +36,9 @@ void vector3_rotateX(const double x[3] /*!< Input */,
   \ z' /    \ -sin_th     0   cos_th / \ z /
 
  */
-void vector3_rotateY(const double x[3] /*!< Input */, 
-                        double theta /*!< Rotation angle */,
-                        double xout[3] /*!< Output */)
+void vector3_rotateY(const double x[3] /*!< Input */,
+                     double theta /*!< Rotation angle */,
+                     double xout[3] /*!< Output */)
 {
   double a, b, c;
   double costheta, sintheta;
@@ -56,16 +56,16 @@ void vector3_rotateY(const double x[3] /*!< Input */,
 }
 
 /*!
-  Counter-clockwise rotation around the Z-axis 
+  Counter-clockwise rotation around the Z-axis
 
   / x' \    /  cos_th  -sin_th  0 \ / x \
   | y' |  = |  sin_th   cos_th  0 | | y |
   \ z' /    \    0        0     1 / \ z /
 
  */
-void vector3_rotateZ(const double x[3] /*!< Input */, 
-                        double theta  /*!< Rotation angle */, 
-                        double xout[3] /*!< Output */)
+void vector3_rotateZ(const double x[3] /*!< Input */,
+                     double theta /*!< Rotation angle */,
+                     double xout[3] /*!< Output */)
 {
   double a, b, c;
   double costheta, sintheta;
@@ -85,7 +85,7 @@ void vector3_rotateZ(const double x[3] /*!< Input */,
 /*!
   Rotate a 3-vector.
 
-  If flag != 1, cos/sin values stored in the static variables are used 
+  If flag != 1, cos/sin values stored in the static variables are used
   for efficiency.
   The input and the output vectors (x, xout) can be the same pointer.
 
@@ -95,7 +95,7 @@ void vector3_rotateZ(const double x[3] /*!< Input */,
 
  */
 void vector3_rotate(const double x[3], double theta, double phi,
- double xout[3])
+                    double xout[3])
 {
   vector3_rotateY(x, theta,xout);
   vector3_rotateZ(xout, phi, xout);
diff --git a/ext/gsl/graph.c b/ext/gsl_native/graph.c
similarity index 96%
rename from ext/gsl/graph.c
rename to ext/gsl_native/graph.c
index 328b636..b014a70 100644
--- a/ext/gsl/graph.c
+++ b/ext/gsl_native/graph.c
@@ -18,25 +18,21 @@ void make_graphcommand(char *command, VALUE hash)
     sprintf(command, "graph -T X -g 3 %s", STR2CSTR(hash));
     return;
   }
-    
   strcpy(command, "graph");
-  if (TYPE(hash) != T_HASH) rb_raise(rb_eTypeError, 
-				     "wrong argument type %s (Hash expected)",
-				     rb_class2name(CLASS_OF(hash)));
+  if (TYPE(hash) != T_HASH) rb_raise(rb_eTypeError,
+                                     "wrong argument type %s (Hash expected)",
+                                     rb_class2name(CLASS_OF(hash)));
   if ((val = rb_hash_aref(hash, rb_str_new2("T"))) != Qnil)
     sprintf(command, "%s -T %s", command, STR2CSTR(val));
   else
     sprintf(command, "%s -T X", command);
-
   val = rb_hash_aref(hash, rb_str_new2("C"));
   if (val == Qtrue)
     sprintf(command, "%s -C", command);
-
   if ((val = rb_hash_aref(hash, rb_str_new2("g"))) != Qnil)
     sprintf(command, "%s -g %d", command, (int) FIX2INT(val));
   else
     sprintf(command, "%s -g 3", command);
-
   if ((val = rb_hash_aref(hash, rb_str_new2("B"))) == Qtrue)
     sprintf(command, "%s -B", command);
   if ((val = rb_hash_aref(hash, rb_str_new2("E"))) != Qnil)
@@ -45,7 +41,6 @@ void make_graphcommand(char *command, VALUE hash)
     sprintf(command, "%s -f %f", command, NUM2DBL(val));
   if ((val = rb_hash_aref(hash, rb_str_new2("F"))) != Qnil)
     sprintf(command, "%s -F %s", command, STR2CSTR(val));
-
   if ((val = rb_hash_aref(hash, rb_str_new2("h"))) != Qnil)
     sprintf(command, "%s -h %f", command, NUM2DBL(val));
   if ((val = rb_hash_aref(hash, rb_str_new2("k"))) != Qnil)
@@ -58,7 +53,6 @@ void make_graphcommand(char *command, VALUE hash)
     else
       sprintf(command, "%s -l %s", command, STR2CSTR(val));
   }
-
   if ((val = rb_hash_aref(hash, rb_str_new2("L"))) != Qnil)
     sprintf(command, "%s -L \"%s\"", command, STR2CSTR(val));
   if ((val = rb_hash_aref(hash, rb_str_new2("N"))) != Qnil)
@@ -103,10 +97,8 @@ void make_graphcommand(char *command, VALUE hash)
     sprintf(command, "%s --title-font-name %s", command, STR2CSTR(val));
   if ((val = rb_hash_aref(hash, rb_str_new2("title-font-size"))) != Qnil)
     sprintf(command, "%s --title-font-size %f", command, NUM2DBL(val));
-
   if ((val = rb_hash_aref(hash, rb_str_new2("toggle-rotate-y-label"))) == Qtrue)
     sprintf(command, "%s --toggle-rotate-y-label", command);
-
   if ((val = rb_hash_aref(hash, rb_str_new2("m"))) != Qnil)
     sprintf(command, "%s -m %d", command, (int) FIX2INT(val));
   if ((val = rb_hash_aref(hash, rb_str_new2("S"))) != Qnil)
@@ -115,15 +107,12 @@ void make_graphcommand(char *command, VALUE hash)
     sprintf(command, "%s -W %f", command, NUM2DBL(val));
   if ((val = rb_hash_aref(hash, rb_str_new2("q"))) != Qnil)
     sprintf(command, "%s -q %f", command, NUM2DBL(val));
-
   if ((val = rb_hash_aref(hash, rb_str_new2("symbol-font-name"))) != Qnil)
     sprintf(command, "%s --symbol-font-name %s", command, STR2CSTR(val));
-
   if ((val = rb_hash_aref(hash, rb_str_new2("reposition"))) != Qnil)
     sprintf(command, "%s --reposition %s", command, STR2CSTR(val));
   if ((val = rb_hash_aref(hash, rb_str_new2("blankout"))) != Qnil)
     sprintf(command, "%s --blankout %s", command, STR2CSTR(val));
-
   if ((val = rb_hash_aref(hash, rb_str_new2("O"))) == Qtrue)
     sprintf(command, "%s -O", command);
 }
@@ -982,7 +971,6 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
     sprintf(command, "%s -T X", command);
   else
     sprintf(command, "%s -T %s", command, STR2CSTR(g->T));
-
   if (TYPE(g->E) == T_STRING) {
     strcpy(str, STR2CSTR(g->E));
     if (strcmp(str, "x") == 0)
@@ -991,28 +979,21 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
       sprintf(command, "%s -E y", command);
     else if (strcmp(str, "xy")*strcmp(str, "x/y") == 0)
       sprintf(command, "%s -E x -E y", command);
-    else 
+    else
       rb_raise(rb_eRuntimeError, "unrecognized -E option %s", str);
   }
-
   if (g->f != Qnil)
     sprintf(command, "%s -f %f", command, NUM2DBL(g->f));
-
   if (TYPE(g->F) == T_STRING)
     sprintf(command, "%s -F %s", command, STR2CSTR(g->F));
-
   if (TYPE(g->g) == T_FIXNUM)
     sprintf(command, "%s -g %d", command, (int) FIX2INT(g->g));
-
   if (g->h != Qnil)
     sprintf(command, "%s -h %f", command, NUM2DBL(g->h));
-
   if (g->k != Qnil)
     sprintf(command, "%s -k %f", command, NUM2DBL(g->k));
-
   if (TYPE(g->K) == T_FIXNUM)
     sprintf(command, "%s -K %d", command, (int) FIX2INT(g->K));
-
   if (TYPE(g->l) == T_STRING) {
     strcpy(str, STR2CSTR(g->l));
     if (strcmp(str, "x") == 0)
@@ -1021,13 +1002,11 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
       sprintf(command, "%s -l y", command);
     else if (strcmp(str, "xy")*strcmp(str, "x/y") == 0)
       sprintf(command, "%s -l x -l y", command);
-    else 
+    else
       rb_raise(rb_eRuntimeError, "unrecognized -l option %s", str);
   }
-
   if (TYPE(g->L) == T_STRING)
     sprintf(command, "%s -L \"%s\"", command, STR2CSTR(g->L));
-
   if (TYPE(g->N) == T_STRING) {
     strcpy(str, STR2CSTR(g->N));
     if (strcmp(str, "x") == 0)
@@ -1036,13 +1015,11 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
       sprintf(command, "%s -N y", command);
     else if (strcmp(str, "xy")*strcmp(str, "x/y") == 0)
       sprintf(command, "%s -N x -N y", command);
-    else 
+    else
       rb_raise(rb_eRuntimeError, "unrecognized -N option %s", str);
   }
-
   if (g->r != Qnil)
     sprintf(command, "%s -r %f", command, NUM2DBL(g->r));
-
   if (TYPE(g->R) == T_STRING) {
     strcpy(str, STR2CSTR(g->R));
     if (strcmp(str, "x") == 0)
@@ -1051,16 +1028,13 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
       sprintf(command, "%s -R y", command);
     else if (strcmp(str, "xy")*strcmp(str, "x/y") == 0)
       sprintf(command, "%s -R x -R y", command);
-    else 
+    else
       rb_raise(rb_eRuntimeError, "unrecognized -R option %s", str);
   }
-
   if (g->u != Qnil)
     sprintf(command, "%s -u %f", command, NUM2DBL(g->u));
-
   if (g->w != Qnil)
     sprintf(command, "%s -w %f", command, NUM2DBL(g->w));
-
   switch (TYPE(g->x)) {
   case T_STRING:
     sprintf(command, "%s -x %s", command, STR2CSTR(g->x));
@@ -1103,61 +1077,47 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
     sprintf(command, "%s -X \"%s\"", command, STR2CSTR(g->X));
   if (g->Y != Qnil)
     sprintf(command, "%s -Y \"%s\"", command, STR2CSTR(g->Y));
-
   if (TYPE(g->bg) == T_STRING)
     sprintf(command, "%s --bg-color %s", command, STR2CSTR(g->bg));
-
   if (TYPE(g->bitmap_size) == T_STRING)
     sprintf(command, "%s --bitmap-size %s", command, STR2CSTR(g->bitmap_size));
-
   if (TYPE(g->frame) == T_STRING)
     sprintf(command, "%s --frame-color %s", command, STR2CSTR(g->frame));
-
   if (g->frame_line_width != Qnil)
     sprintf(command, "%s --frame-line-width %f", command, NUM2DBL(g->frame_line_width));
-
- if (g->max_line_length != Qnil)
-   sprintf(command, "%s --max_line_length %d", command, 
-	   (int) FIX2INT(g->max_line_length));
- 
+  if (g->max_line_length != Qnil)
+    sprintf(command, "%s --max_line_length %d", command,
+            (int) FIX2INT(g->max_line_length));
   if (g->page_size != Qnil)
     sprintf(command, "%s --page-size %s", command, STR2CSTR(g->page_size));
-
   if (g->pen_colors != Qnil)
     sprintf(command, "%s --pen-colors %s", command, STR2CSTR(g->pen_colors));
-
   if (g->rotation != Qnil)
     sprintf(command, "%s --rotation %d", command, (int) FIX2INT(g->rotation));
-
   if (g->title_font_name != Qnil)
     sprintf(command, "%s --title-font-name %s", command, STR2CSTR(g->title_font_name));  if (g->title_font_size != Qnil)
     sprintf(command, "%s --title-font-size %f", command, NUM2DBL(g->title_font_size));
-
   if (g->rotate_y_label == Qtrue)
     sprintf(command, "%s --toggle-rotate-y-label", command);
-
   if (g->I != Qnil)
     sprintf(command, "%s -I %s", command, STR2CSTR(g->I));
-
   if (g->s == Qtrue)
     sprintf(command, "%s -s", command);
   if (g->t == Qtrue)
     sprintf(command, "%s -t", command);
   if (g->B == Qtrue)
     sprintf(command, "%s -B", command);
-
   if (g->m != Qnil)
     sprintf(command, "%s -m %d", command, (int) FIX2INT(g->m));
-
   switch (TYPE(g->S)) {
   case T_STRING:
     sprintf(command, "%s -S %s", command, STR2CSTR(g->S));
     break;
   case T_ARRAY:
-    //    if (RARRAY(g->S)->len == 2) 
-    if (RARRAY_LEN(g->S) == 2) 
+    //    if (RARRAY(g->S)->len == 2)
+    if (RARRAY_LEN(g->S) == 2)
       sprintf(command, "%s -S %d %f", command, (int) FIX2INT(rb_ary_entry(g->S, 0)),
-	      NUM2DBL(rb_ary_entry(g->S, 1)));
+              NUM2DBL(rb_ary_entry(g->S, 1)));
     break;
   default:
     /* do nothing */
@@ -1166,16 +1126,12 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
 
   if (g->W != Qnil)
     sprintf(command, "%s -W %f", command, NUM2DBL(g->W));
-
   if (g->q != Qnil)
     sprintf(command, "%s -q %f", command, NUM2DBL(g->q));
-
   if (g->C == Qtrue)
     sprintf(command, "%s -C", command);
-
   if (g->symbol_font_name != Qnil)
     sprintf(command, "%s --symbol_font_name %s", command, STR2CSTR(g->symbol_font_name));
-
   switch (TYPE(g->reposition)) {
   case T_STRING:
     sprintf(command, "%s --reposition %s", command, STR2CSTR(g->reposition));
@@ -1197,7 +1153,6 @@ static void gsl_graph_set_command(gsl_graph *g, char *command)
 
   if (g->blankout != Qnil)
     sprintf(command, "%s --blankout %f", command, NUM2DBL(g->blankout));
-
   if (g->O == Qtrue)
     sprintf(command, "%s -O", command);
 }
@@ -1219,7 +1174,7 @@ static VALUE rb_gsl_graph_graph(int argc, VALUE *argv, VALUE obj)
   case 3:
     Check_Type(argv[2], T_STRING);
     sprintf(command, "%s %s", command, STR2CSTR(argv[2]));
-    /* no break */
+  /* no break */
   case 2:
     if (TYPE(argv[1]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[1]));
@@ -1227,19 +1182,19 @@ static VALUE rb_gsl_graph_graph(int argc, VALUE *argv, VALUE obj)
       g->ydata = argv[1];
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Vector or String expected)",
-	       rb_class2name(CLASS_OF(argv[1])));
+               rb_class2name(CLASS_OF(argv[1])));
     }
-    /* no break */
+  /* no break */
   case 1:
     if (TYPE(argv[0]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[0]));
     } else if (VECTOR_P(argv[0])) {
-      g->xdata = argv[0]; 
+      g->xdata = argv[0];
     } else if (HISTOGRAM_P(argv[0])) {
       Data_Get_Struct(argv[0], gsl_histogram, h);
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Vector or String expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   default:
@@ -1248,19 +1203,16 @@ static VALUE rb_gsl_graph_graph(int argc, VALUE *argv, VALUE obj)
   }
   if (VECTOR_P(g->xdata)) Data_Get_Struct(g->xdata, gsl_vector, x);
   if (VECTOR_P(g->ydata)) Data_Get_Struct(g->ydata, gsl_vector, y);
-
   if (x == NULL && h == NULL)
     rb_raise(rb_eRuntimeError, "data is not given");
-
   if (h) size = h->n;
   else size = x->size;
-
   fp = popen(command, "w");
   if (fp == NULL) rb_raise(rb_eIOError, "GNU graph not found.");
   for (i = 0; i < size; i++) {
-    if (h) 
+    if (h)
       fprintf(fp, "%g %g\n%g %g\n", h->range[i], h->bin[i], h->range[i+1], h->bin[i]);
-    else if (y == NULL) 
+    else if (y == NULL)
       fprintf(fp, "%d %g\n", (int) i, gsl_vector_get(x, i));
     else
       fprintf(fp, "%g %g\n", gsl_vector_get(x, i), gsl_vector_get(y, i));
@@ -1290,7 +1242,7 @@ static VALUE rb_gsl_graph_step(int argc, VALUE *argv, VALUE obj)
   case 3:
     Check_Type(argv[2], T_STRING);
     sprintf(command, "%s %s", command, STR2CSTR(argv[2]));
-    /* no break */
+  /* no break */
   case 2:
     if (TYPE(argv[1]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[1]));
@@ -1298,17 +1250,17 @@ static VALUE rb_gsl_graph_step(int argc, VALUE *argv, VALUE obj)
       g->ydata = argv[1];
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Vector or String expected)",
-	       rb_class2name(CLASS_OF(argv[1])));
+               rb_class2name(CLASS_OF(argv[1])));
     }
-    /* no break */
+  /* no break */
   case 1:
     if (TYPE(argv[0]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[0]));
     } else if (VECTOR_P(argv[0])) {
-      g->xdata = argv[0]; 
+      g->xdata = argv[0];
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Vector or String expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   default:
@@ -1317,10 +1269,8 @@ static VALUE rb_gsl_graph_step(int argc, VALUE *argv, VALUE obj)
   }
   if (VECTOR_P(g->xdata)) Data_Get_Struct(g->xdata, gsl_vector, x);
   if (VECTOR_P(g->ydata)) Data_Get_Struct(g->ydata, gsl_vector, y);
-
   if (x == NULL)
     rb_raise(rb_eRuntimeError, "data is not given");
-
   size = x->size;
 
   fp = popen(command, "w");
@@ -1328,14 +1278,14 @@ static VALUE rb_gsl_graph_step(int argc, VALUE *argv, VALUE obj)
   for (i = 0; i < size; i++) {
     if (y == NULL) {
       fprintf(fp, "%d %g\n%d %g\n", (int) i, gsl_vector_get(x, i),
-	      (int) (i+1), gsl_vector_get(x, i));
+              (int) (i+1), gsl_vector_get(x, i));
     } else {
       if (i != size-1)
-	fprintf(fp, "%g %g\n%g %g\n", gsl_vector_get(x, i), gsl_vector_get(y, i),
-		gsl_vector_get(x, i+1), gsl_vector_get(y, i));
-      else 	
-	fprintf(fp, "%g %g\n%g %g", gsl_vector_get(x, i), gsl_vector_get(y, i),
-		2.0*gsl_vector_get(x, i)-gsl_vector_get(x, i-1), gsl_vector_get(y, i));
+        fprintf(fp, "%g %g\n%g %g\n", gsl_vector_get(x, i), gsl_vector_get(y, i),
+                gsl_vector_get(x, i+1), gsl_vector_get(y, i));
+      else
+        fprintf(fp, "%g %g\n%g %g", gsl_vector_get(x, i), gsl_vector_get(y, i),
+                2.0*gsl_vector_get(x, i)-gsl_vector_get(x, i-1), gsl_vector_get(y, i));
     }
   }
   fflush(fp);
@@ -1617,18 +1567,18 @@ void Init_gsl_graph(VALUE module)
   rb_define_alias(cgsl_graph, "use_color", "C");
   rb_define_alias(cgsl_graph, "toggle_use_color", "C");
 
-  rb_define_method(cgsl_graph, "set_symbol_font_name", 
-		   rb_gsl_graph_set_symbol_font_name, 1);
+  rb_define_method(cgsl_graph, "set_symbol_font_name",
+                   rb_gsl_graph_set_symbol_font_name, 1);
   rb_define_alias(cgsl_graph, "symbol_font_name=", "set_symbol_font_name");
   rb_define_method(cgsl_graph, "symbol_font_name", rb_gsl_graph_symbol_font_name, 0);
 
-  rb_define_method(cgsl_graph, "set_reposition", 
-		   rb_gsl_graph_set_reposition, 1);
+  rb_define_method(cgsl_graph, "set_reposition",
+                   rb_gsl_graph_set_reposition, 1);
   rb_define_alias(cgsl_graph, "reposition=", "set_reposition");
   rb_define_method(cgsl_graph, "reposition", rb_gsl_graph_reposition, 0);
 
-  rb_define_method(cgsl_graph, "set_blankout", 
-		   rb_gsl_graph_set_blankout, 1);
+  rb_define_method(cgsl_graph, "set_blankout",
+                   rb_gsl_graph_set_blankout, 1);
   rb_define_alias(cgsl_graph, "blankout=", "set_blankout");
   rb_define_method(cgsl_graph, "blankout", rb_gsl_graph_blankout, 0);
 
diff --git a/ext/gsl/gsl.c b/ext/gsl_native/gsl.c
similarity index 95%
rename from ext/gsl/gsl.c
rename to ext/gsl_native/gsl.c
index 4ed836a..4c326cd 100644
--- a/ext/gsl/gsl.c
+++ b/ext/gsl_native/gsl.c
@@ -98,16 +98,14 @@ void Init_gsl_native()
   Init_gsl_eigen(mgsl);
 
   Init_gsl_fft(mgsl);
-    Init_gsl_signal(mgsl);
+  Init_gsl_signal(mgsl);
   Init_gsl_function(mgsl);
   Init_gsl_integration(mgsl);
 
   Init_gsl_rng(mgsl);
   Init_gsl_qrng(mgsl);
   Init_gsl_ran(mgsl);
-#ifdef GSL_1_4_LATER
   Init_gsl_cdf(mgsl);
-#endif
   Init_gsl_stats(mgsl);
 
   Init_gsl_histogram(mgsl);
@@ -121,9 +119,7 @@ void Init_gsl_native()
   Init_gsl_interp(mgsl);
   Init_gsl_spline(mgsl);
   Init_gsl_diff(mgsl);
-#ifdef GSL_1_4_9_LATER
   Init_gsl_deriv(mgsl);
-#endif
 
   Init_gsl_cheb(mgsl);
   Init_gsl_sum(mgsl);
@@ -161,32 +157,28 @@ void Init_gsl_native()
 #endif
 
 #ifdef HAVE_OOL_OOL_VERSION_H
-	Init_ool(mgsl);
+  Init_ool(mgsl);
 #endif
 
 #ifdef HAVE_JACOBI_H
-	Init_jacobi(mgsl);
+  Init_jacobi(mgsl);
 #endif
 
 #ifdef HAVE_GSL_GSL_CQP_H
-	Init_cqp(mgsl);
+  Init_cqp(mgsl);
 #endif
 
-	Init_fresnel(mgsl);
-	
-#ifdef GSL_1_9_LATER
-	Init_bspline(mgsl);
-#endif
+  Init_fresnel(mgsl);
+
+  Init_bspline(mgsl);
 
 #ifdef HAVE_ALF_ALF_H
-	Init_alf(mgsl);
+  Init_alf(mgsl);
 #endif
 
-	Init_geometry(mgsl);
+  Init_geometry(mgsl);
 
-#ifdef GSL_1_14_LATER
-	Init_multiset(mgsl);
-#endif
+  Init_multiset(mgsl);
 
   rb_gsl_define_methods(mgsl);
 }
@@ -209,10 +201,8 @@ static void rb_gsl_define_const(VALUE module)
   rb_define_const(module, "PREC_DOUBLE", INT2FIX(GSL_PREC_DOUBLE));
   rb_define_const(module, "PREC_SINGLE", INT2FIX(GSL_PREC_SINGLE));
   rb_define_const(module, "PREC_APPROX", INT2FIX(GSL_PREC_APPROX));
-#ifdef GSL_VERSION
   rb_define_const(module, "VERSION", rb_str_new2(GSL_VERSION));
   rb_define_const(module, "GSL_VERSION", rb_str_new2(GSL_VERSION));
-#endif
 
   rb_define_const(module, "DBL_EPSILON", rb_float_new(GSL_DBL_EPSILON));
   rb_define_const(module, "FLT_EPSILON", rb_float_new(GSL_FLT_EPSILON));
@@ -240,11 +230,8 @@ static void rb_gsl_define_const(VALUE module)
   rb_define_const(module, "ROOT6_DBL_MIN", rb_float_new(GSL_ROOT6_DBL_MIN));
   rb_define_const(module, "LOG_DBL_MIN", rb_float_new(GSL_LOG_DBL_MIN));
 
-#ifdef GSL_1_14_LATER
   rb_define_const(module, "MAJOR_VERSION", INT2FIX(GSL_MAJOR_VERSION));
   rb_define_const(module, "MINOR_VERSION", INT2FIX(GSL_MINOR_VERSION));
-#endif
-
 }
 
 static VALUE rb_gsl_have_tensor(VALUE module)
diff --git a/ext/gsl/gsl_narray.c b/ext/gsl_native/gsl_narray.c
similarity index 97%
rename from ext/gsl/gsl_narray.c
rename to ext/gsl_native/gsl_narray.c
index 4acd8c6..ba895e6 100644
--- a/ext/gsl/gsl_narray.c
+++ b/ext/gsl_native/gsl_narray.c
@@ -7,7 +7,6 @@
 
 #ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_array.h"
-#include "narray.h"
 #include "include/rb_gsl_with_narray.h"
 
 static VALUE rb_gsl_na_to_gsl_matrix_method(VALUE nna);
@@ -30,7 +29,7 @@ static VALUE rb_gsl_vector_to_narray(VALUE obj, VALUE klass)
     memcpy(NA_PTR_TYPE(nary,double*), v->data, shape[0]*sizeof(double));
   } else {
     int i;
-    for(i=0; i < (int) v->size; i++) {
+    for(i = 0; i < (int) v->size; i++) {
       (NA_PTR_TYPE(nary,double*))[i] = gsl_vector_get(v, i);
     }
   }
@@ -49,7 +48,7 @@ static VALUE rb_gsl_vector_complex_to_narray(VALUE obj, VALUE klass)
     memcpy(NA_PTR_TYPE(nary,double*), v->data, shape[0]*2*sizeof(double));
   } else {
     int i;
-    for(i=0; i < (int) (2*v->size); i++) {
+    for(i = 0; i < (int) (2*v->size); i++) {
       (NA_PTR_TYPE(nary,gsl_complex*))[i] = gsl_vector_complex_get(v, i);
     }
   }
@@ -66,8 +65,7 @@ static VALUE rb_gsl_vector_to_na(VALUE obj)
     na = rb_gsl_vector_complex_to_narray(obj, cNArray);
   else
     rb_raise(rb_eRuntimeError, "unexpected type '%s'",
-        rb_obj_classname(obj));
-
+             rb_obj_classname(obj));
   return na;
 }
 
@@ -141,7 +139,7 @@ static VALUE rb_gsl_vector_to_narray_ref(VALUE obj, VALUE klass)
     na->ptr = (char *) vc->data;
   } else {
     rb_raise(rb_eRuntimeError, "cannot convert %s to NArray reference object",
-        rb_obj_classname(obj));
+             rb_obj_classname(obj));
   }
   nary = Data_Wrap_Struct(klass, 0, rb_gsl_na_view_free, na);
   return nary;
@@ -169,7 +167,7 @@ static VALUE rb_gsl_vector_int_to_narray(VALUE obj, VALUE klass)
     memcpy(NA_PTR_TYPE(nary,int*), v->data, shape[0]*sizeof(int));
   } else {
     int i;
-    for(i=0; i < (int) v->size; i++) {
+    for(i = 0; i < (int) v->size; i++) {
       (NA_PTR_TYPE(nary,int*))[i] = gsl_vector_int_get(v, i);
     }
   }
@@ -229,11 +227,10 @@ static VALUE rb_gsl_na_to_gsl_vector_method(VALUE na)
 
   if(NA_TYPE(na) == NA_SCOMPLEX || NA_TYPE(na) == NA_DCOMPLEX)
     v = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free,
-        na_to_gv_complex(na));
+                         na_to_gv_complex(na));
   else
     v = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free,
-        na_to_gv(na));
-
+                         na_to_gv(na));
   return v;
 }
 
@@ -243,11 +240,10 @@ VALUE rb_gsl_na_to_gsl_vector_view_method(VALUE na)
 
   if(NA_TYPE(na) == NA_SCOMPLEX || NA_TYPE(na) == NA_DCOMPLEX)
     v = Data_Wrap_Struct(cgsl_vector_complex_view, 0, gsl_vector_complex_view_free,
-        na_to_gv_complex_view(na));
+                         na_to_gv_complex_view(na));
   else
     v = Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free,
-        na_to_gv_view(na));
-
+                         na_to_gv_view(na));
   return v;
 }
 
@@ -282,7 +278,6 @@ gsl_vector_view* na_to_gv_view(VALUE na)
   // Raise exception if na's type is not NA_DFLOAT.
   if(NA_TYPE(na) != NA_DFLOAT)
     rb_raise(rb_eTypeError, "GSL::Vector::View requires NArray be DFLOAT");
-
   v = gsl_vector_view_alloc();
   v->vector.data = NA_PTR_TYPE(na,double*);
   v->vector.size = NA_TOTAL(na);
@@ -310,7 +305,6 @@ gsl_vector_complex_view* na_to_gv_complex_view(VALUE na)
   // Raise exception if na's type is not NA_DCOMPLEX
   if(NA_TYPE(na) != NA_DCOMPLEX)
     rb_raise(rb_eTypeError, "GSL::Vector::Complex::View requires NArray be DCOMPLEX");
-
   v = gsl_vector_complex_view_alloc();
   v->vector.data = NA_PTR_TYPE(na,double*);
   v->vector.size = NA_TOTAL(na);
@@ -357,7 +351,7 @@ static VALUE rb_gsl_matrix_to_narray(VALUE obj, VALUE klass)
   shape[1] = m->size1;
   nary = na_make_object(NA_DFLOAT, 2, shape, klass);
   for (i = 0; (int) i < shape[1]; i++) {
-    memcpy(NA_PTR_TYPE(nary,double*)+(i*shape[0]), m->data+(i*m->tda), 
+    memcpy(NA_PTR_TYPE(nary,double*)+(i*shape[0]), m->data+(i*m->tda),
            shape[0]*sizeof(double));
   }
   return nary;
@@ -384,7 +378,7 @@ static VALUE rb_gsl_matrix_int_to_narray(VALUE obj, VALUE klass)
   shape[1] = m->size1;
   nary = na_make_object(NA_LINT, 2, shape, klass);
   for (i = 0; (int) i < shape[1]; i++) {
-    memcpy(NA_PTR_TYPE(nary,int*)+(i*shape[0]), m->data+(i*m->tda), 
+    memcpy(NA_PTR_TYPE(nary,int*)+(i*shape[0]), m->data+(i*m->tda),
            shape[0]*sizeof(int));
   }
   return nary;
@@ -538,7 +532,7 @@ gsl_matrix_view* na_to_gm_view(VALUE nna)
   m->matrix.data = NA_PTR_TYPE(ary2,double*);
   m->matrix.size1 = na->shape[1];
   m->matrix.size2 = na->shape[0];
-  m->matrix.tda = m->matrix.size2; 
+  m->matrix.tda = m->matrix.size2;
   m->matrix.owner = 0;
   return m;
 }
@@ -570,13 +564,11 @@ gsl_matrix_int_view* na_to_gm_int_view(VALUE nna)
   m->matrix.data = NA_PTR_TYPE(ary2,int*);
   m->matrix.size1 = na->shape[1];
   m->matrix.size2 = na->shape[0];
-  m->matrix.tda = m->matrix.size2; 
+  m->matrix.tda = m->matrix.size2;
   m->matrix.owner = 0;
   return m;
 }
 
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
 #include <gsl/gsl_histogram.h>
 EXTERN VALUE cgsl_histogram;
 static VALUE rb_gsl_narray_histogram(int argc, VALUE *argv, VALUE obj)
@@ -593,7 +585,7 @@ static VALUE rb_gsl_narray_histogram(int argc, VALUE *argv, VALUE obj)
   v.vector.size = stride;
   switch (argc) {
   case 1:
-    if (rb_obj_is_kind_of(argv[0], rb_cRange)) 
+    if (rb_obj_is_kind_of(argv[0], rb_cRange))
       argv[0] = rb_gsl_range2ary(argv[0]);
     switch (TYPE(argv[0])) {
     case T_FIXNUM:
@@ -652,7 +644,6 @@ static VALUE rb_gsl_narray_histogram(int argc, VALUE *argv, VALUE obj)
     gsl_histogram_increment(h, ptr[i*stride]);
   return Data_Wrap_Struct(cgsl_histogram, 0, gsl_histogram_free, h);
 }
-#endif
 
 /*void rb_gsl_with_narray_define_methods()*/
 void Init_gsl_narray(VALUE module)
@@ -765,7 +756,7 @@ void Init_gsl_narray(VALUE module)
   rb_define_method(cNArray, "to_gslm", rb_gsl_na_to_gsl_matrix_method, 0);
   rb_define_alias(cNArray, "to_gm", "to_gslm");
   rb_define_method(cNArray, "to_gslm_view", rb_gsl_na_to_gsl_matrix_view_method, 0);
-  rb_define_alias(cNArray, "to_gm_view", "to_gslm_view");  
+  rb_define_alias(cNArray, "to_gm_view", "to_gslm_view");
 
   /*****/
   // TODO Complex matrix
diff --git a/ext/gsl/histogram.c b/ext/gsl_native/histogram.c
similarity index 90%
rename from ext/gsl/histogram.c
rename to ext/gsl_native/histogram.c
index 3d4e852..9324bf8 100644
--- a/ext/gsl/histogram.c
+++ b/ext/gsl_native/histogram.c
@@ -21,7 +21,6 @@ VALUE cgsl_histogram_bin;
 static VALUE cgsl_histogram_integ;
 
 static VALUE rb_gsl_histogram_alloc_from_file(VALUE klass, VALUE name);
-#ifdef GSL_0_9_4_LATER
 static VALUE rb_gsl_histogram_alloc(int argc, VALUE *argv, VALUE klass)
 {
   gsl_histogram *h = NULL;
@@ -68,8 +67,8 @@ static VALUE rb_gsl_histogram_alloc(int argc, VALUE *argv, VALUE klass)
     case T_FIXNUM:
       CHECK_FIXNUM(argv[0]);
       if (TYPE(argv[1]) != T_ARRAY) {
-	rb_raise(rb_eTypeError, "wrong argument type %s (Array expected)", 
-		 rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError, "wrong argument type %s (Array expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       }
       n = FIX2INT(argv[0]);
       min = NUM2DBL(rb_ary_entry(argv[1], 0));
@@ -133,7 +132,7 @@ static VALUE rb_gsl_histogram_alloc_from_file(VALUE klass, VALUE name)
   h->range[n] = upper;
   fclose(fp);
   return Data_Wrap_Struct(klass, 0, gsl_histogram_free, h);
-  
+
 }
 
 /* initialization + set uniform ranges (equal spacing from min to max) */
@@ -172,8 +171,8 @@ static VALUE rb_gsl_histogram_alloc_uniform(int argc, VALUE *argv, VALUE klass)
 }
 
 /* initialization + set ranges with a given spacing from min to max */
-static VALUE rb_gsl_histogram_alloc_with_min_max_step(VALUE klass, VALUE vmin, 
-					    VALUE vmax, VALUE ss)
+static VALUE rb_gsl_histogram_alloc_with_min_max_step(VALUE klass, VALUE vmin,
+                                                      VALUE vmax, VALUE ss)
 {
   gsl_histogram *h = NULL;
   gsl_vector *v = NULL;
@@ -196,7 +195,6 @@ static VALUE rb_gsl_histogram_alloc_with_min_max_step(VALUE klass, VALUE vmin,
   gsl_vector_free(v);
   return Data_Wrap_Struct(klass, 0, gsl_histogram_free, h);
 }
-#endif
 
 static VALUE rb_gsl_histogram_calloc(VALUE klass, VALUE nn)
 {
@@ -244,7 +242,7 @@ static VALUE rb_gsl_histogram_set_ranges(int argc, VALUE *argv, VALUE obj)
   gsl_vector *v = NULL;
   size_t size;
   Data_Get_Struct(obj, gsl_histogram, h);
-  if (argc != 1 && argc != 2) 
+  if (argc != 1 && argc != 2)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
   if (TYPE(argv[0]) == T_ARRAY) {
     v = make_cvector_from_rarray(argv[0]);
@@ -336,10 +334,6 @@ static VALUE rb_gsl_histogram_accumulate(int argc, VALUE *argv, VALUE obj)
   gsl_vector_int *vi;
   size_t i;
   double weight = 1;
-#ifdef HAVE_NARRAY_H
-  double *ptr;
-  size_t size, stride;
-#endif
   switch (argc) {
   case 2:
     Need_Float(argv[1]);
@@ -367,8 +361,10 @@ static VALUE rb_gsl_histogram_accumulate(int argc, VALUE *argv, VALUE obj)
       gsl_histogram_accumulate(h, (double)gsl_vector_int_get(vi, i), weight);
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(argv[0])) {
+    double *ptr;
+    size_t size, stride;
     ptr = get_vector_ptr(argv[0], &stride, &size);
-    for (i = 0; i < size; i++) 
+    for (i = 0; i < size; i++)
       gsl_histogram_accumulate(h, ptr[i], weight);
 #endif
   } else {
@@ -386,7 +382,7 @@ static VALUE rb_gsl_histogram_accumulate2(int argc, VALUE *argv, VALUE obj)
   case 2:
     Need_Float(argv[1]);
     weight = NUM2DBL(argv[1]);
-    /* no break; */
+  /* no break; */
   case 1:
     Need_Float(argv[0]);
     x = NUM2DBL(argv[0]);
@@ -494,17 +490,6 @@ static VALUE rb_gsl_histogram_sigma(VALUE obj)
   return rb_float_new(gsl_histogram_sigma(h));
 }
 
-#ifndef GSL_1_1_LATER
-double gsl_histogram_sum(const gsl_histogram * h)
-{  
-  double sum=0;  
-  size_t i=0, n;  
-  n=h->n;  
-  while(i < n) sum += h->bin[i++];  
-  return sum;
-}
-#endif
-
 static VALUE rb_gsl_histogram_sum(VALUE obj)
 {
   gsl_histogram *h = NULL;
@@ -573,7 +558,7 @@ static VALUE rb_gsl_histogram_equal_bins_p(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_HISTOGRAM(argv[0]);
     CHECK_HISTOGRAM(argv[1]);
     Data_Get_Struct(argv[0], gsl_histogram, h1);
@@ -581,7 +566,7 @@ static VALUE rb_gsl_histogram_equal_bins_p(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Data_Get_Struct(obj, gsl_histogram, h1);
     CHECK_HISTOGRAM(argv[0]);
     Data_Get_Struct(argv[0], gsl_histogram, h2);
@@ -598,7 +583,7 @@ static VALUE rb_gsl_histogram_equal_bins_p2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_HISTOGRAM(argv[0]);
     CHECK_HISTOGRAM(argv[1]);
     Data_Get_Struct(argv[0], gsl_histogram, h1);
@@ -606,7 +591,7 @@ static VALUE rb_gsl_histogram_equal_bins_p2(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     Data_Get_Struct(obj, gsl_histogram, h1);
     CHECK_HISTOGRAM(argv[0]);
     Data_Get_Struct(argv[0], gsl_histogram, h2);
@@ -884,24 +869,17 @@ static VALUE rb_gsl_histogram_pdf_alloc(VALUE klass, VALUE nn)
 {
   gsl_histogram_pdf *h = NULL;
   gsl_histogram *h0 = NULL;
-#ifdef GSL_0_9_4_LATER
-	if (rb_obj_is_kind_of(nn, cgsl_histogram)) {
-		Data_Get_Struct(nn, gsl_histogram, h0);
-	  h = gsl_histogram_pdf_alloc(h0->n);
-	  gsl_histogram_pdf_init(h, h0);
-	} else {
-	  CHECK_FIXNUM(nn);
+  if (rb_obj_is_kind_of(nn, cgsl_histogram)) {
+    Data_Get_Struct(nn, gsl_histogram, h0);
+    h = gsl_histogram_pdf_alloc(h0->n);
+    gsl_histogram_pdf_init(h, h0);
+  } else {
+    CHECK_FIXNUM(nn);
     h = gsl_histogram_pdf_alloc(FIX2INT(nn));
   }
-#else
-  gsl_histogram *hh = NULL;
-  Data_Get_Struct(nn, gsl_histogram, hh);
-  h = gsl_histogram_pdf_alloc(hh);
-#endif
   return Data_Wrap_Struct(klass, 0, gsl_histogram_pdf_free, h);
 }
 
-#ifdef GSL_0_9_4_LATER
 static VALUE rb_gsl_histogram_pdf_init(VALUE obj, VALUE hh)
 {
   gsl_histogram_pdf *p = NULL;
@@ -912,7 +890,6 @@ static VALUE rb_gsl_histogram_pdf_init(VALUE obj, VALUE hh)
   gsl_histogram_pdf_init(p, h);
   return obj;
 }
-#endif
 
 static VALUE rb_gsl_histogram_pdf_sample(VALUE obj, VALUE r)
 {
@@ -971,7 +948,7 @@ static VALUE rb_gsl_histogram_graph(int argc, VALUE *argv, VALUE obj)
     fprintf(fp, "%e %e\n%e %e\n", v->range[i], v->bin[i], v->range[i+1], v->bin[i]);
   }
   fflush(fp);
- pclose(fp);
+  pclose(fp);
   fp = NULL;
   return Qtrue;
 #else
@@ -996,8 +973,8 @@ static VALUE rb_gsl_histogram_plot(int argc, VALUE *argv, VALUE obj)
   case 1:
     fp = popen("gnuplot -persist", "w");
     if (fp == NULL) rb_raise(rb_eIOError, "GNU graph not found.");
-    if (TYPE(argv[0]) == T_STRING) 
-      fprintf(fp, "plot '-' %s\n", STR2CSTR(argv[0]));    
+    if (TYPE(argv[0]) == T_STRING)
+      fprintf(fp, "plot '-' %s\n", STR2CSTR(argv[0]));
     else
       fprintf(fp, "plot '-' with fsteps\n");
     break;
@@ -1048,7 +1025,7 @@ static VALUE rb_gsl_histogram_fit_exponential(int argc, VALUE *argv, VALUE obj)
   }
   n = binend - binstart + 1;
   dof = n - p;
-  
+
   x = gsl_vector_alloc(n);
   w = gsl_vector_alloc(n);
   lny = gsl_vector_alloc(n);
@@ -1059,15 +1036,15 @@ static VALUE rb_gsl_histogram_fit_exponential(int argc, VALUE *argv, VALUE obj)
     gsl_vector_set(lny, i, log(h->bin[i+binstart]));
     gsl_vector_set(w, i, h->bin[i+binstart]);
   }
-  gsl_fit_wlinear(x->data, 1, w->data, 1, lny->data, 1, n, 
-		  &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
+  gsl_fit_wlinear(x->data, 1, w->data, 1, lny->data, 1, n,
+                  &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
   gsl_vector_free(lny);
   gsl_vector_free(w);
   gsl_vector_free(x);
   c0 = exp(c0);
-  return rb_ary_new3(6, rb_float_new(c0), rb_float_new(c1), 
-		     rb_float_new(c0*sqrt(cov00)), rb_float_new(sqrt(cov11)),
-		     rb_float_new(sumsq), INT2FIX(dof));
+  return rb_ary_new3(6, rb_float_new(c0), rb_float_new(c1),
+                     rb_float_new(c0*sqrt(cov00)), rb_float_new(sqrt(cov11)),
+                     rb_float_new(sumsq), INT2FIX(dof));
 }
 
 static VALUE rb_gsl_histogram_fit_power(int argc, VALUE *argv, VALUE obj)
@@ -1094,7 +1071,7 @@ static VALUE rb_gsl_histogram_fit_power(int argc, VALUE *argv, VALUE obj)
   }
   n = binend - binstart + 1;
   dof = n - p;
-  
+
   lnx = gsl_vector_alloc(n);
   w = gsl_vector_alloc(n);
   lny = gsl_vector_alloc(n);
@@ -1105,15 +1082,15 @@ static VALUE rb_gsl_histogram_fit_power(int argc, VALUE *argv, VALUE obj)
     gsl_vector_set(lny, i, log(h->bin[i+binstart]));
     gsl_vector_set(w, i, h->bin[i+binstart]);
   }
-  gsl_fit_wlinear(lnx->data, 1, w->data, 1, lny->data, 1, n, 
-		  &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
+  gsl_fit_wlinear(lnx->data, 1, w->data, 1, lny->data, 1, n,
+                  &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
   gsl_vector_free(lny);
   gsl_vector_free(w);
   gsl_vector_free(lnx);
   c0 = exp(c0);
-  return rb_ary_new3(6, rb_float_new(c0), rb_float_new(c1), 
-		     rb_float_new(c0*sqrt(cov00)), rb_float_new(sqrt(cov11)),
-		     rb_float_new(sumsq), INT2FIX(dof));
+  return rb_ary_new3(6, rb_float_new(c0), rb_float_new(c1),
+                     rb_float_new(c0*sqrt(cov00)), rb_float_new(sqrt(cov11)),
+                     rb_float_new(sumsq), INT2FIX(dof));
 }
 
 static int Gaussian_f(const gsl_vector *v, void *params, gsl_vector *f);
@@ -1173,8 +1150,8 @@ static int Gaussian_df(const gsl_vector *v, void *params, gsl_matrix *J)
   return GSL_SUCCESS;
 }
 
-static int Gaussian_fdf(const gsl_vector *v, void *params, gsl_vector *f, 
-			gsl_matrix *J)
+static int Gaussian_fdf(const gsl_vector *v, void *params, gsl_vector *f,
+                        gsl_matrix *J)
 {
   Gaussian_f(v, params, f);
   Gaussian_df(v, params, J);
@@ -1253,9 +1230,9 @@ static VALUE rb_gsl_histogram_fit_gaussian(int argc, VALUE *argv, VALUE obj)
   gsl_vector_free(x);
   gsl_matrix_free(covar);
   return rb_ary_new3(8, rb_float_new(sigma), rb_float_new(mean),
-		     rb_float_new(height), rb_float_new(errs),
-		     rb_float_new(errm), rb_float_new(errh),
-		     rb_float_new(chi2), INT2FIX(dof));
+                     rb_float_new(height), rb_float_new(errs),
+                     rb_float_new(errm), rb_float_new(errh),
+                     rb_float_new(chi2), INT2FIX(dof));
 }
 
 static int Rayleigh_f(const gsl_vector *v, void *params, gsl_vector *f);
@@ -1308,8 +1285,8 @@ static int Rayleigh_df(const gsl_vector *v, void *params, gsl_matrix *J)
   return GSL_SUCCESS;
 }
 
-static int Rayleigh_fdf(const gsl_vector *v, void *params, gsl_vector *f, 
-			gsl_matrix *J)
+static int Rayleigh_fdf(const gsl_vector *v, void *params, gsl_vector *f,
+                        gsl_matrix *J)
 {
   Rayleigh_f(v, params, f);
   Rayleigh_df(v, params, J);
@@ -1349,7 +1326,7 @@ static VALUE rb_gsl_histogram_fit_rayleigh(int argc, VALUE *argv, VALUE obj)
   }
   x = gsl_vector_alloc(p);
   gsl_vector_set(x, 0, gsl_pow_2(gsl_histogram_sigma(h)));   /* initial values, var = 1 */
-  gsl_vector_set(x, 1, gsl_histogram_max_val(h));   
+  gsl_vector_set(x, 1, gsl_histogram_max_val(h));
   hh.h = h;
   hh.binstart = binstart;
   hh.binend = binend;
@@ -1385,10 +1362,10 @@ static VALUE rb_gsl_histogram_fit_rayleigh(int argc, VALUE *argv, VALUE obj)
   gsl_multifit_fdfsolver_free(s);
   gsl_vector_free(x);
   gsl_matrix_free(covar);
-  return rb_ary_new3(6, rb_float_new(sigma), 
-		     rb_float_new(height), rb_float_new(errs),
-		     rb_float_new(errh),
-		     rb_float_new(chi2), INT2FIX(dof));
+  return rb_ary_new3(6, rb_float_new(sigma),
+                     rb_float_new(height), rb_float_new(errs),
+                     rb_float_new(errh),
+                     rb_float_new(chi2), INT2FIX(dof));
 }
 
 /*
@@ -1444,8 +1421,8 @@ static int xExponential_df(const gsl_vector *v, void *params, gsl_matrix *J)
   return GSL_SUCCESS;
 }
 
-static int xExponential_fdf(const gsl_vector *v, void *params, gsl_vector *f, 
-			gsl_matrix *J)
+static int xExponential_fdf(const gsl_vector *v, void *params, gsl_vector *f,
+                            gsl_matrix *J)
 {
   xExponential_f(v, params, f);
   xExponential_df(v, params, J);
@@ -1485,7 +1462,7 @@ static VALUE rb_gsl_histogram_fit_xexponential(int argc, VALUE *argv, VALUE obj)
   }
   x = gsl_vector_alloc(p);
   gsl_vector_set(x, 0, gsl_histogram_sigma(h));   /* initial values, var = 1 */
-  gsl_vector_set(x, 1, gsl_histogram_max_val(h));   
+  gsl_vector_set(x, 1, gsl_histogram_max_val(h));
   hh.h = h;
   hh.binstart = binstart;
   hh.binend = binend;
@@ -1521,10 +1498,10 @@ static VALUE rb_gsl_histogram_fit_xexponential(int argc, VALUE *argv, VALUE obj)
   gsl_multifit_fdfsolver_free(s);
   gsl_vector_free(x);
   gsl_matrix_free(covar);
-  return rb_ary_new3(6, rb_float_new(b), 
-		     rb_float_new(height), rb_float_new(errs),
-		     rb_float_new(errh),
-		     rb_float_new(chi2), INT2FIX(dof));
+  return rb_ary_new3(6, rb_float_new(b),
+                     rb_float_new(height), rb_float_new(errs),
+                     rb_float_new(errh),
+                     rb_float_new(chi2), INT2FIX(dof));
 }
 
 static VALUE rb_gsl_histogram_fit(int argc, VALUE *argv, VALUE obj)
@@ -1539,20 +1516,20 @@ static VALUE rb_gsl_histogram_fit(int argc, VALUE *argv, VALUE obj)
     return rb_gsl_histogram_fit_power(argc-1, argv+1, obj);
   } else if (str_head_grep(fittype, "gaus") == 0) {
     return rb_gsl_histogram_fit_gaussian(argc-1, argv+1, obj);
- } else if (str_head_grep(fittype, "rayleigh") == 0) {
+  } else if (str_head_grep(fittype, "rayleigh") == 0) {
     return rb_gsl_histogram_fit_rayleigh(argc-1, argv+1, obj);
   } else if (str_head_grep(fittype, "xexp") == 0) {
     return rb_gsl_histogram_fit_xexponential(argc-1, argv+1, obj);
   } else {
-    rb_raise(rb_eRuntimeError, 
-	     "unknown fitting type %s (exp, power, gaus expected)", fittype);
+    rb_raise(rb_eRuntimeError,
+             "unknown fitting type %s (exp, power, gaus expected)", fittype);
   }
   return Qnil;
 }
 
 /* Integrate histogram: the two histograms must have the same range and bins. */
 void mygsl_histogram_integrate(const gsl_histogram *h, gsl_histogram *hi,
-			       size_t istart, size_t iend)
+                               size_t istart, size_t iend)
 {
   size_t i;
   if (iend >= istart) {
@@ -1580,7 +1557,7 @@ void mygsl_histogram_differentiate(const gsl_histogram *hi, gsl_histogram *h)
 
 /* Create a histogram integrating the given histogram h */
 gsl_histogram* mygsl_histogram_calloc_integrate(const gsl_histogram *h,
-						size_t istart, size_t iend)
+                                                size_t istart, size_t iend)
 {
   gsl_histogram *hi = NULL;
   hi = gsl_histogram_calloc_range(h->n, h->range);
@@ -1616,16 +1593,16 @@ static VALUE rb_gsl_histogram_integrate(int argc, VALUE *argv, VALUE obj)
     case T_FIXNUM:
       itmp = FIX2INT(argv[0]);
       if (itmp == -1) {
-	istart = h->n - 1;
-	iend = 0;
+        istart = h->n - 1;
+        iend = 0;
       } else {
-	istart = 0;
-	iend = h->n - 1;
+        istart = 0;
+        iend = h->n - 1;
       }
       break;
     default:
       rb_raise(rb_eArgError, "wrong argument type %s (Arran or Fixnum expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
       break;
     }
     break;
@@ -1692,27 +1669,27 @@ static VALUE rb_gsl_histogram_rebin(int argc, VALUE *argv, VALUE obj)
 }
 
 static int mygsl_histogram_fread2(FILE * stream, gsl_histogram * h)
-{  
+{
   double min, max;
   int status;
   status = gsl_block_raw_fread(stream, &min, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fread(stream, &max, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   gsl_histogram_set_ranges_uniform(h, min, max);
-  status = gsl_block_raw_fread (stream, h->bin, h->n, 1);  
-  if (status)    return status;  
+  status = gsl_block_raw_fread (stream, h->bin, h->n, 1);
+  if (status)    return status;
   return status;
 }
 
 static int mygsl_histogram_fwrite2(FILE * stream, const gsl_histogram * h)
-{  
+{
   int status;
   status = gsl_block_raw_fwrite (stream, h->range, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fwrite (stream, h->range+h->n, 1, 1);
-  if (status)    return status;  
-  status = gsl_block_raw_fwrite (stream, h->bin, h->n, 1);  
+  if (status)    return status;
+  status = gsl_block_raw_fwrite (stream, h->bin, h->n, 1);
   return status;
 }
 
@@ -1833,33 +1810,31 @@ void Init_gsl_histogram(VALUE module)
   VALUE cgsl_histogram_pdf;
 
   cgsl_histogram = rb_define_class_under(module, "Histogram", cGSL_Object);
-  cgsl_histogram_range = rb_define_class_under(cgsl_histogram, "Range", 
-					       cgsl_vector_view_ro);
-  cgsl_histogram_bin = rb_define_class_under(cgsl_histogram, "Bin", 
-					     cgsl_vector_view);
-  cgsl_histogram_integ = rb_define_class_under(cgsl_histogram, "Integral", 
-					       cgsl_histogram);
-
-#ifdef GSL_0_9_4_LATER
+  cgsl_histogram_range = rb_define_class_under(cgsl_histogram, "Range",
+                                               cgsl_vector_view_ro);
+  cgsl_histogram_bin = rb_define_class_under(cgsl_histogram, "Bin",
+                                             cgsl_vector_view);
+  cgsl_histogram_integ = rb_define_class_under(cgsl_histogram, "Integral",
+                                               cgsl_histogram);
+
   rb_define_singleton_method(cgsl_histogram, "alloc", rb_gsl_histogram_alloc, -1);
   /*  rb_define_singleton_method(cgsl_histogram, "new", rb_gsl_histogram_alloc, -1);*/
   rb_define_singleton_method(cgsl_histogram, "[]", rb_gsl_histogram_alloc, -1);
 
-  rb_define_singleton_method(cgsl_histogram, "alloc_uniform", 
-			     rb_gsl_histogram_alloc_uniform, -1);
-  rb_define_singleton_method(cgsl_histogram, "new_uniform", 
-			     rb_gsl_histogram_alloc_uniform, -1);
+  rb_define_singleton_method(cgsl_histogram, "alloc_uniform",
+                             rb_gsl_histogram_alloc_uniform, -1);
+  rb_define_singleton_method(cgsl_histogram, "new_uniform",
+                             rb_gsl_histogram_alloc_uniform, -1);
 
-  rb_define_singleton_method(cgsl_histogram, "alloc_with_min_max_step", 
-			     rb_gsl_histogram_alloc_with_min_max_step, 3);
-  rb_define_singleton_method(cgsl_histogram, "new_with_min_max_step", 
-			     rb_gsl_histogram_alloc_with_min_max_step, 3);
-#endif
+  rb_define_singleton_method(cgsl_histogram, "alloc_with_min_max_step",
+                             rb_gsl_histogram_alloc_with_min_max_step, 3);
+  rb_define_singleton_method(cgsl_histogram, "new_with_min_max_step",
+                             rb_gsl_histogram_alloc_with_min_max_step, 3);
 
-  rb_define_singleton_method(cgsl_histogram, "calloc", 
-			     rb_gsl_histogram_calloc, 1);
-  rb_define_singleton_method(cgsl_histogram, "calloc_range", 
-			     rb_gsl_histogram_calloc_range, -1);
+  rb_define_singleton_method(cgsl_histogram, "calloc",
+                             rb_gsl_histogram_calloc, 1);
+  rb_define_singleton_method(cgsl_histogram, "calloc_range",
+                             rb_gsl_histogram_calloc_range, -1);
 
   rb_define_method(cgsl_histogram, "bins", rb_gsl_histogram_bins, 0);
   rb_define_alias(cgsl_histogram, "n", "bins");
@@ -1867,8 +1842,8 @@ void Init_gsl_histogram(VALUE module)
   rb_define_method(cgsl_histogram, "set_ranges", rb_gsl_histogram_set_ranges, -1);
   rb_define_method(cgsl_histogram, "range", rb_gsl_histogram_range, 0);
   rb_define_method(cgsl_histogram, "bin", rb_gsl_histogram_bin, 0);
-  rb_define_method(cgsl_histogram, "set_ranges_uniform", 
-		   rb_gsl_histogram_set_ranges_uniform, -1);
+  rb_define_method(cgsl_histogram, "set_ranges_uniform",
+                   rb_gsl_histogram_set_ranges_uniform, -1);
   rb_define_singleton_method(cgsl_histogram, "memcpy", rb_gsl_histogram_memcpy, 2);
   rb_define_method(cgsl_histogram, "clone", rb_gsl_histogram_clone, 0);
   rb_define_alias(cgsl_histogram, "duplicate", "clone");
@@ -1896,20 +1871,20 @@ void Init_gsl_histogram(VALUE module)
   rb_define_method(cgsl_histogram, "sum", rb_gsl_histogram_integral, -1);
   rb_define_alias(cgsl_histogram, "integral", "sum");
 
-  rb_define_method(cgsl_histogram, "equal_bins_p", 
-		   rb_gsl_histogram_equal_bins_p, -1);
+  rb_define_method(cgsl_histogram, "equal_bins_p",
+                   rb_gsl_histogram_equal_bins_p, -1);
   rb_define_alias(cgsl_histogram, "equal_bins", "equal_bins_p");
-  rb_define_singleton_method(cgsl_histogram, "equal_bins_p", 
-			     rb_gsl_histogram_equal_bins_p, -1);
-  rb_define_singleton_method(cgsl_histogram, "equal_bins", 
-			     rb_gsl_histogram_equal_bins_p, -1);
-  rb_define_method(cgsl_histogram, "equal_bins_p?", 
-		   rb_gsl_histogram_equal_bins_p2, -1);
+  rb_define_singleton_method(cgsl_histogram, "equal_bins_p",
+                             rb_gsl_histogram_equal_bins_p, -1);
+  rb_define_singleton_method(cgsl_histogram, "equal_bins",
+                             rb_gsl_histogram_equal_bins_p, -1);
+  rb_define_method(cgsl_histogram, "equal_bins_p?",
+                   rb_gsl_histogram_equal_bins_p2, -1);
   rb_define_alias(cgsl_histogram, "equal_bins?", "equal_bins_p?");
-  rb_define_singleton_method(cgsl_histogram, "equal_bins_p?", 
-			     rb_gsl_histogram_equal_bins_p2, -1);
-  rb_define_singleton_method(cgsl_histogram, "equal_bins?", 
-			     rb_gsl_histogram_equal_bins_p2, -1);
+  rb_define_singleton_method(cgsl_histogram, "equal_bins_p?",
+                             rb_gsl_histogram_equal_bins_p2, -1);
+  rb_define_singleton_method(cgsl_histogram, "equal_bins?",
+                             rb_gsl_histogram_equal_bins_p2, -1);
 
   rb_define_method(cgsl_histogram, "add", rb_gsl_histogram_add, 1);
   rb_define_alias(cgsl_histogram, "+", "add");
@@ -1940,13 +1915,11 @@ void Init_gsl_histogram(VALUE module)
   rb_define_method(cgsl_histogram, "print", rb_gsl_histogram_print, 0);
 
   cgsl_histogram_pdf = rb_define_class_under(cgsl_histogram, "Pdf", cGSL_Object);
-  rb_define_singleton_method(cgsl_histogram_pdf, "alloc", 
-			     rb_gsl_histogram_pdf_alloc, 1);
-  /*  rb_define_singleton_method(cgsl_histogram_pdf, "new", 
+  rb_define_singleton_method(cgsl_histogram_pdf, "alloc",
+                             rb_gsl_histogram_pdf_alloc, 1);
+  /*  rb_define_singleton_method(cgsl_histogram_pdf, "new",
       rb_gsl_histogram_pdf_alloc, 1);*/
-#ifdef GSL_0_9_4_LATER
   rb_define_method(cgsl_histogram_pdf, "init", rb_gsl_histogram_pdf_init, 1);
-#endif
   rb_define_method(cgsl_histogram_pdf, "sample", rb_gsl_histogram_pdf_sample, 1);
 
   rb_define_method(cgsl_histogram_pdf, "range", rb_gsl_histogram_pdf_range, 0);
@@ -1958,23 +1931,23 @@ void Init_gsl_histogram(VALUE module)
 
   rb_define_method(cgsl_histogram, "plot", rb_gsl_histogram_plot, -1);
 
-  rb_define_method(cgsl_histogram, "fit_gaussian", 
-		   rb_gsl_histogram_fit_gaussian, -1);
-  rb_define_method(cgsl_histogram, "fit_exponential", 
-		   rb_gsl_histogram_fit_exponential, -1);
-  rb_define_method(cgsl_histogram, "fit_xexponential", 
-		   rb_gsl_histogram_fit_xexponential, -1);
-  rb_define_method(cgsl_histogram, "fit_power", 
-		   rb_gsl_histogram_fit_power, -1);
-  rb_define_method(cgsl_histogram, "fit_rayleigh", 
-		   rb_gsl_histogram_fit_rayleigh, -1);
-  rb_define_method(cgsl_histogram, "fit", 
-		   rb_gsl_histogram_fit, -1);
+  rb_define_method(cgsl_histogram, "fit_gaussian",
+                   rb_gsl_histogram_fit_gaussian, -1);
+  rb_define_method(cgsl_histogram, "fit_exponential",
+                   rb_gsl_histogram_fit_exponential, -1);
+  rb_define_method(cgsl_histogram, "fit_xexponential",
+                   rb_gsl_histogram_fit_xexponential, -1);
+  rb_define_method(cgsl_histogram, "fit_power",
+                   rb_gsl_histogram_fit_power, -1);
+  rb_define_method(cgsl_histogram, "fit_rayleigh",
+                   rb_gsl_histogram_fit_rayleigh, -1);
+  rb_define_method(cgsl_histogram, "fit",
+                   rb_gsl_histogram_fit, -1);
 
   rb_define_method(cgsl_histogram, "integrate", rb_gsl_histogram_integrate, -1);
   rb_undef_method(cgsl_histogram_integ, "integrate");
-  rb_define_method(cgsl_histogram_integ, "differentiate", 
-		   rb_gsl_histogram_differentiate, 0);
+  rb_define_method(cgsl_histogram_integ, "differentiate",
+                   rb_gsl_histogram_differentiate, 0);
   rb_define_alias(cgsl_histogram_integ, "diff", "differentiate");
 
   rb_define_method(cgsl_histogram, "normalize", rb_gsl_histogram_normalize, 0);
diff --git a/ext/gsl/histogram2d.c b/ext/gsl_native/histogram2d.c
similarity index 90%
rename from ext/gsl/histogram2d.c
rename to ext/gsl_native/histogram2d.c
index 5e57573..6ad8b35 100644
--- a/ext/gsl/histogram2d.c
+++ b/ext/gsl_native/histogram2d.c
@@ -17,7 +17,6 @@ VALUE cgsl_histogram2d;
 VALUE cgsl_histogram2d_view;
 static VALUE cgsl_histogram2d_integ;
 
-#ifdef GSL_0_9_4_LATER
 static VALUE rb_gsl_histogram2d_alloc_uniform(int argc, VALUE *argv, VALUE klass);
 static VALUE rb_gsl_histogram2d_alloc(int argc, VALUE *argv, VALUE klass)
 {
@@ -78,7 +77,7 @@ static VALUE rb_gsl_histogram2d_alloc_uniform(int argc, VALUE *argv, VALUE klass
   double xmin, xmax, ymin, ymax;
   switch (argc) {
   case 4:
-    CHECK_FIXNUM(argv[0]);     CHECK_FIXNUM(argv[2]); 
+    CHECK_FIXNUM(argv[0]);     CHECK_FIXNUM(argv[2]);
     Check_Type(argv[1], T_ARRAY); Check_Type(argv[3], T_ARRAY);
     //    if (RARRAY(argv[1])->len != 2 || RARRAY(argv[3])->len != 2)
     if (RARRAY_LEN(argv[1]) != 2 || RARRAY_LEN(argv[3]) != 2)
@@ -92,13 +91,13 @@ static VALUE rb_gsl_histogram2d_alloc_uniform(int argc, VALUE *argv, VALUE klass
     return Data_Wrap_Struct(klass, 0, gsl_histogram2d_free, h);
     break;
   case 6:
-    CHECK_FIXNUM(argv[0]); 
+    CHECK_FIXNUM(argv[0]);
     Need_Float(argv[1]); Need_Float(argv[2]);
     CHECK_FIXNUM(argv[3]);
     Need_Float(argv[4]); Need_Float(argv[5]);
     h = gsl_histogram2d_alloc(FIX2INT(argv[0]), FIX2INT(argv[3]));
     gsl_histogram2d_set_ranges_uniform(h, NUM2DBL(argv[1]), NUM2DBL(argv[2]),
-				       NUM2DBL(argv[4]), NUM2DBL(argv[5]));
+                                       NUM2DBL(argv[4]), NUM2DBL(argv[5]));
     return Data_Wrap_Struct(klass, 0, gsl_histogram2d_free, h);
     break;
   default:
@@ -107,7 +106,6 @@ static VALUE rb_gsl_histogram2d_alloc_uniform(int argc, VALUE *argv, VALUE klass
   }
   return Qnil;  /* never reach here */
 }
-#endif
 
 static VALUE rb_gsl_histogram2d_set_ranges(int argc, VALUE *argv, VALUE obj)
 {
@@ -205,7 +203,7 @@ static VALUE rb_gsl_histogram2d_accumulate(int argc, VALUE *argv, VALUE obj)
     n = (size_t) GSL_MIN_INT((int) vx->size, (int) vy->size);
     for (i = 0; i < n; i++)
       gsl_histogram2d_accumulate(h, gsl_vector_get(vx, i), gsl_vector_get(vy, i),
-				 weight);
+                                 weight);
   } else {
     gsl_histogram2d_accumulate(h, NUM2DBL(argv[0]), NUM2DBL(argv[1]), weight);
   }
@@ -215,14 +213,14 @@ static VALUE rb_gsl_histogram2d_accumulate(int argc, VALUE *argv, VALUE obj)
 static VALUE rb_gsl_histogram2d_accumulate2(int argc, VALUE *argv, VALUE obj)
 {
   gsl_histogram2d *h = NULL;
-  double x, y, weight=1;
+  double x, y, weight = 1;
   switch (argc) {
   case 3:
     Need_Float(argv[2]);
     weight = NUM2DBL(argv[2]);
-    /* no break */
+  /* no break */
   case 2:
-    Need_Float(argv[0]); Need_Float(argv[1]); 
+    Need_Float(argv[0]); Need_Float(argv[1]);
     x = NUM2DBL(argv[0]);    y = NUM2DBL(argv[1]);
     break;
   default:
@@ -254,13 +252,13 @@ static VALUE rb_gsl_histogram2d_get(int argc, VALUE *argv, VALUE obj)
     switch (TYPE(argv[0])) {
     case T_ARRAY:
       return rb_float_new(gsl_histogram2d_get(h2, FIX2INT(rb_ary_entry(argv[0], 0)),
-					      FIX2INT(rb_ary_entry(argv[0], 1))));
+                                              FIX2INT(rb_ary_entry(argv[0], 1))));
       break;
     case T_FIXNUM:
-      CHECK_FIXNUM(argv[0]); 
+      CHECK_FIXNUM(argv[0]);
       i = (size_t) FIX2INT(argv[0]);
       if (i >= h2->ny)
-	rb_raise(rb_eIndexError, "wrong index");
+        rb_raise(rb_eIndexError, "wrong index");
       h1 = ALLOC(mygsl_histogram2d_view);
       h1->h.n = h2->ny;
       h1->h.range = h2->yrange;
@@ -269,7 +267,7 @@ static VALUE rb_gsl_histogram2d_get(int argc, VALUE *argv, VALUE obj)
       break;
     default:
       rb_raise(rb_eTypeError, "wrong argument type %s (Array or Fixnum expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
       break;
     }
     break;
@@ -345,7 +343,7 @@ static VALUE rb_gsl_histogram2d_find(VALUE obj, VALUE x, VALUE y)
 {
   gsl_histogram2d *h = NULL;
   size_t i, j;
-  Need_Float(x);Need_Float(y);
+  Need_Float(x); Need_Float(y);
   Data_Get_Struct(obj, gsl_histogram2d, h);
   gsl_histogram2d_find(h, NUM2DBL(x), NUM2DBL(y), &i, &j);
   return rb_ary_new3(2, INT2FIX(i), INT2FIX(j));
@@ -383,7 +381,6 @@ static VALUE rb_gsl_histogram2d_min_bin(VALUE obj)
   return rb_ary_new3(2, INT2FIX(i), INT2FIX(j));
 }
 
-#ifdef GSL_1_1_LATER
 static VALUE rb_gsl_histogram2d_xmean(VALUE obj)
 {
   gsl_histogram2d *h = NULL;
@@ -425,7 +422,6 @@ static VALUE rb_gsl_histogram2d_sum(VALUE obj)
   Data_Get_Struct(obj, gsl_histogram2d, h);
   return rb_float_new(gsl_histogram2d_sum(h));
 }
-#endif
 
 /* singleton */
 static VALUE rb_gsl_histogram2d_equal_bins_p(VALUE obj, VALUE hh1, VALUE hh2)
@@ -611,7 +607,6 @@ static VALUE rb_gsl_histogram2d_reset(VALUE obj)
   return obj;
 }
 
-#ifdef GSL_0_9_4_LATER
 static VALUE rb_gsl_histogram2d_pdf_alloc(VALUE klass, VALUE nx, VALUE ny)
 {
   gsl_histogram2d_pdf *h = NULL;
@@ -630,17 +625,6 @@ static VALUE rb_gsl_histogram2d_pdf_init(VALUE obj, VALUE hh)
   gsl_histogram2d_pdf_init(pdf, h);
   return obj;
 }
-#else
-static VALUE rb_gsl_histogram2d_pdf_alloc(VALUE klass, VALUE hhh)
-{
-  gsl_histogram2d_pdf *h = NULL;
-  gsl_histogram2d *hh;
-  Data_Get_Struct(hhh, gsl_histogram2d, hh);
-  h = gsl_histogram2d_pdf_alloc(hh);
-  return Data_Wrap_Struct(klass, 0, gsl_histogram2d_pdf_free, h);
-}
-
-#endif
 
 static VALUE rb_gsl_histogram2d_pdf_sample(VALUE obj, VALUE r1, VALUE r2)
 {
@@ -689,7 +673,7 @@ static VALUE rb_gsl_histogram2d_bin(VALUE obj)
 }
 
 void mygsl_histogram2d_yproject(const gsl_histogram2d *h2, size_t istart,
-				size_t iend, gsl_histogram *h)
+                                size_t iend, gsl_histogram *h)
 {
   size_t i, j;
   double sum;
@@ -704,7 +688,7 @@ void mygsl_histogram2d_yproject(const gsl_histogram2d *h2, size_t istart,
 }
 
 gsl_histogram* mygsl_histogram2d_calloc_yproject(const gsl_histogram2d *h2,
-						 size_t istart, size_t iend)
+                                                 size_t istart, size_t iend)
 {
   gsl_histogram *h;
   h = gsl_histogram_calloc_range(h2->ny, h2->yrange);
@@ -713,7 +697,7 @@ gsl_histogram* mygsl_histogram2d_calloc_yproject(const gsl_histogram2d *h2,
 }
 
 void mygsl_histogram2d_xproject(const gsl_histogram2d *h2, size_t jstart,
-				size_t jend, gsl_histogram *h)
+                                size_t jend, gsl_histogram *h)
 {
   size_t i, j;
   double sum;
@@ -728,7 +712,7 @@ void mygsl_histogram2d_xproject(const gsl_histogram2d *h2, size_t jstart,
 }
 
 gsl_histogram* mygsl_histogram2d_calloc_xproject(const gsl_histogram2d *h2,
-						 size_t jstart, size_t jend)
+                                                 size_t jstart, size_t jend)
 {
   gsl_histogram *h;
   h = gsl_histogram_calloc_range(h2->nx, h2->xrange);
@@ -789,35 +773,35 @@ static VALUE rb_gsl_histogram2d_yproject(int argc, VALUE *argv, VALUE obj)
 }
 
 static int mygsl_histogram2d_fread2(FILE * stream, gsl_histogram2d * h)
-{  
+{
   double xmin, xmax, ymin, ymax;
   int status;
   status = gsl_block_raw_fread(stream, &xmin, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fread(stream, &xmax, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fread(stream, &ymin, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fread(stream, &ymax, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   gsl_histogram2d_set_ranges_uniform(h, xmin, xmax, ymin, ymax);
-  status = gsl_block_raw_fread (stream, h->bin, h->nx*h->ny, 1);  
-  if (status)    return status;  
+  status = gsl_block_raw_fread (stream, h->bin, h->nx*h->ny, 1);
+  if (status)    return status;
   return status;
 }
 
 static int mygsl_histogram2d_fwrite2(FILE * stream, const gsl_histogram2d * h)
-{  
+{
   int status;
   status = gsl_block_raw_fwrite (stream, h->xrange, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fwrite (stream, h->xrange+h->nx, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fwrite (stream, h->yrange, 1, 1);
-  if (status)    return status;  
+  if (status)    return status;
   status = gsl_block_raw_fwrite (stream, h->yrange+h->ny, 1, 1);
-  if (status)    return status;  
-  status = gsl_block_raw_fwrite (stream, h->bin, h->nx*h->ny, 1);  
+  if (status)    return status;
+  status = gsl_block_raw_fwrite (stream, h->bin, h->nx*h->ny, 1);
   return status;
 }
 
@@ -846,7 +830,7 @@ static VALUE rb_gsl_histogram2d_fread2(VALUE obj, VALUE io)
 }
 
 static gsl_histogram2d* mygsl_histogram2d_calloc_integrate(const gsl_histogram2d *h,
-							   int flag)
+                                                           int flag)
 {
   gsl_histogram2d *hi;
   size_t i, j, k;
@@ -867,26 +851,26 @@ static gsl_histogram2d* mygsl_histogram2d_calloc_integrate(const gsl_histogram2d
     }
     for (i = nx-2;; i--) {
       for (j = ny-2;; j--) {
-	hi->bin[i*ny+j] = ((gsl_histogram2d_get(hi, i+1, j) 
-			    + gsl_histogram2d_get(hi, i, j+1))
-			   - gsl_histogram2d_get(hi, i+1, j+1))
-	  + gsl_histogram2d_get(h, i, j);
-	if (j == 0) break;
+        hi->bin[i*ny+j] = ((gsl_histogram2d_get(hi, i+1, j)
+                            + gsl_histogram2d_get(hi, i, j+1))
+                           - gsl_histogram2d_get(hi, i+1, j+1))
+                          + gsl_histogram2d_get(h, i, j);
+        if (j == 0) break;
       }
       if (i == 0) break;
     }
   } else {
     hi->bin[0] = h->bin[0];
-    for (j = 1; j < ny; j++) hi->bin[j] = gsl_histogram2d_get(hi, 0, j-1) 
-			       + gsl_histogram2d_get(h, 0, j);
+    for (j = 1; j < ny; j++) hi->bin[j] = gsl_histogram2d_get(hi, 0, j-1)
+                                          + gsl_histogram2d_get(h, 0, j);
     for (i = 1; i < nx; i++) hi->bin[i*ny] = gsl_histogram2d_get(hi, i-1, 0)
-			       + gsl_histogram2d_get(h, i, 0);
+                                             + gsl_histogram2d_get(h, i, 0);
     for (i = 1; i < nx; i++) {
       for (j = 1; j < ny; j++) {
-	hi->bin[i*ny+j] = ((gsl_histogram2d_get(hi, i-1, j) 
-			    + gsl_histogram2d_get(hi, i, j-1))
-			   - gsl_histogram2d_get(hi, i-1, j-1))
-	  + gsl_histogram2d_get(h, i, j);
+        hi->bin[i*ny+j] = ((gsl_histogram2d_get(hi, i-1, j)
+                            + gsl_histogram2d_get(hi, i, j-1))
+                           - gsl_histogram2d_get(hi, i-1, j-1))
+                          + gsl_histogram2d_get(h, i, j);
       }
     }
   }
@@ -940,40 +924,39 @@ void Init_gsl_histogram2d(VALUE module)
 
   cgsl_histogram2d = rb_define_class_under(module, "Histogram2d", cGSL_Object);
   cgsl_histogram2d_view = rb_define_class_under(cgsl_histogram2d, "View",
-						cgsl_histogram);
+                                                cgsl_histogram);
+
+  cgsl_histogram2d_integ = rb_define_class_under(cgsl_histogram2d, "Integral",
+                                                 cgsl_histogram2d);
 
-  cgsl_histogram2d_integ = rb_define_class_under(cgsl_histogram2d, "Integral", 
-					       cgsl_histogram2d);
-#ifdef GSL_0_9_4_LATER
   /*  rb_define_singleton_method(cgsl_histogram2d, "new", rb_gsl_histogram2d_alloc, -1);*/
   rb_define_singleton_method(cgsl_histogram2d, "alloc", rb_gsl_histogram2d_alloc, -1);
-  rb_define_singleton_method(cgsl_histogram2d, "new_uniform", 
-			     rb_gsl_histogram2d_alloc_uniform, -1);
-  rb_define_singleton_method(cgsl_histogram2d, "alloc_uniform", 
-			     rb_gsl_histogram2d_alloc_uniform, -1);
-#endif
-
-  rb_define_singleton_method(cgsl_histogram2d, "equal_bins_p", 
-			     rb_gsl_histogram2d_equal_bins_p, 2);
-  rb_define_singleton_method(cgsl_histogram2d, "equal_bins_p?", 
-			     rb_gsl_histogram2d_equal_bins_p2, 2);
-
-  rb_define_method(cgsl_histogram2d, "set_ranges",  
-		   rb_gsl_histogram2d_set_ranges, -1);
-  rb_define_method(cgsl_histogram2d, "set_ranges_uniform", 
-		   rb_gsl_histogram2d_set_ranges_uniform, -1);
-
-  rb_define_singleton_method(cgsl_histogram2d, "memcpy",  
-			     rb_gsl_histogram2d_memcpy, 2);
+  rb_define_singleton_method(cgsl_histogram2d, "new_uniform",
+                             rb_gsl_histogram2d_alloc_uniform, -1);
+  rb_define_singleton_method(cgsl_histogram2d, "alloc_uniform",
+                             rb_gsl_histogram2d_alloc_uniform, -1);
+
+  rb_define_singleton_method(cgsl_histogram2d, "equal_bins_p",
+                             rb_gsl_histogram2d_equal_bins_p, 2);
+  rb_define_singleton_method(cgsl_histogram2d, "equal_bins_p?",
+                             rb_gsl_histogram2d_equal_bins_p2, 2);
+
+  rb_define_method(cgsl_histogram2d, "set_ranges",
+                   rb_gsl_histogram2d_set_ranges, -1);
+  rb_define_method(cgsl_histogram2d, "set_ranges_uniform",
+                   rb_gsl_histogram2d_set_ranges_uniform, -1);
+
+  rb_define_singleton_method(cgsl_histogram2d, "memcpy",
+                             rb_gsl_histogram2d_memcpy, 2);
   rb_define_method(cgsl_histogram2d, "clone",  rb_gsl_histogram2d_clone, 0);
   rb_define_alias(cgsl_histogram2d, "duplicate", "clone");
-  rb_define_method(cgsl_histogram2d, "increment",  
-		   rb_gsl_histogram2d_accumulate, -1);
+  rb_define_method(cgsl_histogram2d, "increment",
+                   rb_gsl_histogram2d_accumulate, -1);
   rb_define_alias(cgsl_histogram2d, "fill", "increment");
   rb_define_alias(cgsl_histogram2d, "accumulate", "increment");
 
-  rb_define_method(cgsl_histogram2d, "increment2",  
-		   rb_gsl_histogram2d_accumulate2, -1);
+  rb_define_method(cgsl_histogram2d, "increment2",
+                   rb_gsl_histogram2d_accumulate2, -1);
   rb_define_alias(cgsl_histogram2d, "accumulate2", "increment2");
   rb_define_alias(cgsl_histogram2d, "fill2", "increment2");
 
@@ -996,7 +979,6 @@ void Init_gsl_histogram2d(VALUE module)
   rb_define_method(cgsl_histogram2d, "min_val",  rb_gsl_histogram2d_min_val, 0);
   rb_define_method(cgsl_histogram2d, "min_bin",  rb_gsl_histogram2d_min_bin, 0);
 
-#ifdef GSL_1_1_LATER
   rb_define_method(cgsl_histogram2d, "xmean",  rb_gsl_histogram2d_xmean, 0);
   rb_define_method(cgsl_histogram2d, "ymean",  rb_gsl_histogram2d_ymean, 0);
   rb_define_method(cgsl_histogram2d, "xsigma",  rb_gsl_histogram2d_xsigma, 0);
@@ -1004,7 +986,6 @@ void Init_gsl_histogram2d(VALUE module)
   rb_define_method(cgsl_histogram2d, "cov",  rb_gsl_histogram2d_cov, 0);
   rb_define_method(cgsl_histogram2d, "sum",  rb_gsl_histogram2d_sum, 0);
   rb_define_alias(cgsl_histogram2d, "integral", "sum");
-#endif
 
   rb_define_method(cgsl_histogram2d, "add",  rb_gsl_histogram2d_add, 1);
   rb_define_alias(cgsl_histogram2d, "+", "add");
@@ -1028,18 +1009,12 @@ void Init_gsl_histogram2d(VALUE module)
   rb_define_method(cgsl_histogram2d, "fscanf",  rb_gsl_histogram2d_fscanf, 3);
 
   cgsl_histogram2d_pdf = rb_define_class_under(cgsl_histogram2d, "Pdf", cGSL_Object);
-#ifdef GSL_0_9_4_LATER
-  /*  rb_define_singleton_method(cgsl_histogram2d_pdf, "new", 
+
+  /*  rb_define_singleton_method(cgsl_histogram2d_pdf, "new",
       rb_gsl_histogram2d_pdf_alloc, 2);*/
-  rb_define_singleton_method(cgsl_histogram2d_pdf, "alloc", 
-			     rb_gsl_histogram2d_pdf_alloc, 2);
+  rb_define_singleton_method(cgsl_histogram2d_pdf, "alloc",
+                             rb_gsl_histogram2d_pdf_alloc, 2);
   rb_define_method(cgsl_histogram2d_pdf, "init",  rb_gsl_histogram2d_pdf_init, 1);
-#else
-  /*  rb_define_singleton_method(cgsl_histogram2d_pdf, "new", 
-      rb_gsl_histogram2d_pdf_alloc, 1);*/
-  rb_define_singleton_method(cgsl_histogram2d_pdf, "alloc", 
-			     rb_gsl_histogram2d_pdf_alloc, 1);
-#endif
 
   rb_define_method(cgsl_histogram2d_pdf, "sample",  rb_gsl_histogram2d_pdf_sample, 2);
 
diff --git a/ext/gsl/histogram3d.c b/ext/gsl_native/histogram3d.c
similarity index 87%
rename from ext/gsl/histogram3d.c
rename to ext/gsl_native/histogram3d.c
index b19d563..5b7bc30 100644
--- a/ext/gsl/histogram3d.c
+++ b/ext/gsl_native/histogram3d.c
@@ -24,27 +24,27 @@ static VALUE rb_gsl_histogram3d_new(int argc, VALUE *argv, VALUE klass)
   size_t nx, ny, nz;
   switch (argc) {
   case 3:
-    if (TYPE(argv[0]) == T_FIXNUM 
-	&& TYPE(argv[1]) == T_FIXNUM && TYPE(argv[2]) == T_FIXNUM) {
-      h = mygsl_histogram3d_alloc(FIX2INT(argv[0]), 
-				  FIX2INT(argv[1]), FIX2INT(argv[2])); 
+    if (TYPE(argv[0]) == T_FIXNUM
+        && TYPE(argv[1]) == T_FIXNUM && TYPE(argv[2]) == T_FIXNUM) {
+      h = mygsl_histogram3d_alloc(FIX2INT(argv[0]),
+                                  FIX2INT(argv[1]), FIX2INT(argv[2]));
     } else if (VECTOR_P(argv[0]) && VECTOR_P(argv[1]) && VECTOR_P(argv[2])) {
       Data_Get_Struct(argv[0], gsl_vector, xrange);
       Data_Get_Struct(argv[1], gsl_vector, yrange);
       Data_Get_Struct(argv[2], gsl_vector, zrange);
       h = mygsl_histogram3d_alloc(xrange->size-1, yrange->size-1, zrange->size-1);
       mygsl_histogram3d_set_ranges(h, xrange->data, xrange->size,
-				   yrange->data, yrange->size,
-				   zrange->data, zrange->size);
-    } else if (TYPE(argv[0]) == T_ARRAY 
-	       && TYPE(argv[1]) == T_ARRAY && TYPE(argv[2]) == T_ARRAY) {
+                                   yrange->data, yrange->size,
+                                   zrange->data, zrange->size);
+    } else if (TYPE(argv[0]) == T_ARRAY
+               && TYPE(argv[1]) == T_ARRAY && TYPE(argv[2]) == T_ARRAY) {
       xrange = make_cvector_from_rarray(argv[0]);
       yrange = make_cvector_from_rarray(argv[1]);
       zrange = make_cvector_from_rarray(argv[2]);
       h = mygsl_histogram3d_alloc(xrange->size-1, yrange->size-1, zrange->size-1);
       mygsl_histogram3d_set_ranges(h, xrange->data, xrange->size,
-				   yrange->data, yrange->size,
-				   zrange->data, zrange->size);
+                                   yrange->data, yrange->size,
+                                   zrange->data, zrange->size);
       gsl_vector_free(zrange);
       gsl_vector_free(yrange);
       gsl_vector_free(xrange);
@@ -54,7 +54,7 @@ static VALUE rb_gsl_histogram3d_new(int argc, VALUE *argv, VALUE klass)
     break;
   case 6:
     CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[2]); CHECK_FIXNUM(argv[4]);
-    Check_Type(argv[1], T_ARRAY); Check_Type(argv[3], T_ARRAY); 
+    Check_Type(argv[1], T_ARRAY); Check_Type(argv[3], T_ARRAY);
     Check_Type(argv[5], T_ARRAY);
     nx = FIX2INT(argv[0]); ny = FIX2INT(argv[2]); nz = FIX2INT(argv[4]);
     xmin = NUM2DBL(rb_ary_entry(argv[1], 0));
@@ -64,7 +64,7 @@ static VALUE rb_gsl_histogram3d_new(int argc, VALUE *argv, VALUE klass)
     zmin = NUM2DBL(rb_ary_entry(argv[5], 0));
     zmax = NUM2DBL(rb_ary_entry(argv[5], 1));
     h = mygsl_histogram3d_calloc_uniform(nx, ny, nz, xmin, xmax, ymin, ymax,
-					 zmin, zmax);
+                                         zmin, zmax);
     break;
   case 9:
     CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[3]); CHECK_FIXNUM(argv[6]);
@@ -73,7 +73,7 @@ static VALUE rb_gsl_histogram3d_new(int argc, VALUE *argv, VALUE klass)
     ymin = NUM2DBL(argv[4]);    ymax = NUM2DBL(argv[5]);
     zmin = NUM2DBL(argv[7]);    zmax = NUM2DBL(argv[8]);
     h = mygsl_histogram3d_calloc_uniform(nx, ny, nz, xmin, xmax, ymin, ymax,
-					 zmin, zmax);
+                                         zmin, zmax);
     break;
   default:
     break;
@@ -189,37 +189,37 @@ static VALUE rb_gsl_histogram3d_get(int argc, VALUE *argv, VALUE obj)
       //      switch (RARRAY(argv[0])->len) {
       switch (RARRAY_LEN(argv[0])) {
       case 1:
-	i = FIX2INT(rb_ary_entry(argv[0], 0));
-	h2 = ALLOC(mygsl_histogram3d_view);
-	h2->h.nx = h->ny;
-	h2->h.ny = h->nz;
-	h2->h.xrange = h->yrange;
-	h2->h.yrange = h->zrange;
-	h2->h.bin = h->bin + i*h->ny*h->nz;
-	return Data_Wrap_Struct(cgsl_histogram3d_view, 0, free, h2);
-	break;
+        i = FIX2INT(rb_ary_entry(argv[0], 0));
+        h2 = ALLOC(mygsl_histogram3d_view);
+        h2->h.nx = h->ny;
+        h2->h.ny = h->nz;
+        h2->h.xrange = h->yrange;
+        h2->h.yrange = h->zrange;
+        h2->h.bin = h->bin + i*h->ny*h->nz;
+        return Data_Wrap_Struct(cgsl_histogram3d_view, 0, free, h2);
+        break;
       case 2:
-	i = FIX2INT(rb_ary_entry(argv[0], 0));
-	j = FIX2INT(rb_ary_entry(argv[0], 1));
-	h1 = ALLOC(mygsl_histogram2d_view);
-	h1->h.n = h->nz;
-	h1->h.range = h->zrange;
-	h1->h.bin = h->bin + i*h->ny*h->nz + j*h->nz;
-	return Data_Wrap_Struct(cgsl_histogram2d_view, 0, free, h1);    
-	break;
+        i = FIX2INT(rb_ary_entry(argv[0], 0));
+        j = FIX2INT(rb_ary_entry(argv[0], 1));
+        h1 = ALLOC(mygsl_histogram2d_view);
+        h1->h.n = h->nz;
+        h1->h.range = h->zrange;
+        h1->h.bin = h->bin + i*h->ny*h->nz + j*h->nz;
+        return Data_Wrap_Struct(cgsl_histogram2d_view, 0, free, h1);
+        break;
       case 3:
-	i = FIX2INT(rb_ary_entry(argv[0], 0));
-	j = FIX2INT(rb_ary_entry(argv[0], 1));
-	k = FIX2INT(rb_ary_entry(argv[0], 2));
-	/* do the last line of this function */
-	break;
+        i = FIX2INT(rb_ary_entry(argv[0], 0));
+        j = FIX2INT(rb_ary_entry(argv[0], 1));
+        k = FIX2INT(rb_ary_entry(argv[0], 2));
+        /* do the last line of this function */
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "wrong array size");
+        rb_raise(rb_eRuntimeError, "wrong array size");
       }
       break;
     default:
       rb_raise(rb_eTypeError, "wrong argument type %s (Fixnum or Array expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
       break;
     }
     break;
@@ -230,7 +230,7 @@ static VALUE rb_gsl_histogram3d_get(int argc, VALUE *argv, VALUE obj)
     h1->h.n = h->nz;
     h1->h.range = h->zrange;
     h1->h.bin = h->bin + i*h->ny*h->nz + j*h->nz;
-    return Data_Wrap_Struct(cgsl_histogram2d_view, 0, free, h1);    
+    return Data_Wrap_Struct(cgsl_histogram2d_view, 0, free, h1);
     break;
   case 3:
     CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
@@ -251,7 +251,7 @@ static VALUE rb_gsl_histogram3d_increment(int argc, VALUE *argv, VALUE obj)
   case 4:
     Need_Float(argv[3]);
     weight = NUM2DBL(argv[3]);
-    /* no break */
+  /* no break */
   case 3:
     Need_Float(argv[0]); Need_Float(argv[1]); Need_Float(argv[2]);
     x = NUM2DBL(argv[0]); y = NUM2DBL(argv[1]); z = NUM2DBL(argv[2]);
@@ -273,7 +273,7 @@ static VALUE rb_gsl_histogram3d_increment2(int argc, VALUE *argv, VALUE obj)
   case 4:
     Need_Float(argv[3]);
     weight = NUM2DBL(argv[3]);
-    /* no break */
+  /* no break */
   case 3:
     Need_Float(argv[0]); Need_Float(argv[1]); Need_Float(argv[2]);
     x = NUM2DBL(argv[0]); y = NUM2DBL(argv[1]); z = NUM2DBL(argv[2]);
@@ -329,7 +329,7 @@ static VALUE rb_gsl_histogram3d_find(VALUE obj, VALUE x, VALUE y, VALUE z)
   size_t i, j, k;
   Data_Get_Struct(obj, mygsl_histogram3d, h);
   mygsl_histogram3d_find(h, NUM2DBL(x), NUM2DBL(y), NUM2DBL(z),
-			 &i, &j, &k);
+                         &i, &j, &k);
   return rb_ary_new3(3, INT2FIX(i), INT2FIX(j), INT2FIX(k));
 }
 
@@ -346,7 +346,7 @@ static VALUE rb_gsl_histogram3d_set_ranges(VALUE obj, VALUE xx, VALUE yy, VALUE
     Data_Get_Struct(xx, gsl_vector, xrange);
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Array or Vector expected)",
-	     rb_class2name(CLASS_OF(xx)));
+             rb_class2name(CLASS_OF(xx)));
   }
   if (xrange->size != h->nx+1)
     rb_raise(rb_eIndexError, "xrange length is different");
@@ -357,7 +357,7 @@ static VALUE rb_gsl_histogram3d_set_ranges(VALUE obj, VALUE xx, VALUE yy, VALUE
     Data_Get_Struct(yy, gsl_vector, yrange);
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Array or Vector expected)",
-	     rb_class2name(CLASS_OF(yy)));
+             rb_class2name(CLASS_OF(yy)));
   }
   if (yrange->size != h->ny+1)
     rb_raise(rb_eIndexError, "yrange length is different");
@@ -368,13 +368,13 @@ static VALUE rb_gsl_histogram3d_set_ranges(VALUE obj, VALUE xx, VALUE yy, VALUE
     Data_Get_Struct(zz, gsl_vector, zrange);
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Array or Vector expected)",
-	     rb_class2name(CLASS_OF(zz)));
+             rb_class2name(CLASS_OF(zz)));
   }
   if (zrange->size != h->nz+1)
     rb_raise(rb_eIndexError, "zrange length is different");
   mygsl_histogram3d_set_ranges(h, xrange->data, xrange->size,
-			       yrange->data, yrange->size, 
-			       zrange->data, zrange->size);
+                               yrange->data, yrange->size,
+                               zrange->data, zrange->size);
   if (flagz == 1) gsl_vector_free(zrange);
   if (flagy == 1) gsl_vector_free(yrange);
   if (flagx == 1) gsl_vector_free(xrange);
@@ -695,7 +695,7 @@ static VALUE rb_gsl_histogram3d_reset(VALUE obj)
 }
 
 static VALUE rb_gsl_histogram3d_oper(VALUE obj, VALUE hh,
-				     int (*func)(mygsl_histogram3d *, const mygsl_histogram3d*))
+                                     int (*func)(mygsl_histogram3d *, const mygsl_histogram3d*))
 {
   mygsl_histogram3d *h1, *h2, *hnew;
   CHECK_HISTOGRAM3D(hh);
@@ -782,18 +782,18 @@ void Init_gsl_histogram3d(VALUE module)
 {
   cgsl_histogram3d = rb_define_class_under(module, "Histogram3d", cGSL_Object);
   cgsl_histogram3d_view = rb_define_class_under(cgsl_histogram3d, "View",
-						cgsl_histogram2d);
+                                                cgsl_histogram2d);
 
   /*  rb_define_singleton_method(cgsl_histogram3d, "new", rb_gsl_histogram3d_new, -1);*/
-  rb_define_singleton_method(cgsl_histogram3d, "alloc", 
-			     rb_gsl_histogram3d_new, -1);
-  rb_define_singleton_method(cgsl_histogram3d, "memcpy", 
-			     rb_gsl_histogram3d_memcpy, 2);
+  rb_define_singleton_method(cgsl_histogram3d, "alloc",
+                             rb_gsl_histogram3d_new, -1);
+  rb_define_singleton_method(cgsl_histogram3d, "memcpy",
+                             rb_gsl_histogram3d_memcpy, 2);
   /******/
-  rb_define_method(cgsl_histogram3d, "set_ranges", 
-		   rb_gsl_histogram3d_set_ranges, 3);
-  rb_define_method(cgsl_histogram3d, "set_ranges_uniform", 
-		   rb_gsl_histogram3d_set_ranges_uniform, -1);
+  rb_define_method(cgsl_histogram3d, "set_ranges",
+                   rb_gsl_histogram3d_set_ranges, 3);
+  rb_define_method(cgsl_histogram3d, "set_ranges_uniform",
+                   rb_gsl_histogram3d_set_ranges_uniform, -1);
 
   rb_define_method(cgsl_histogram3d, "nx", rb_gsl_histogram3d_nx, 0);
   rb_define_method(cgsl_histogram3d, "ny", rb_gsl_histogram3d_ny, 0);
@@ -809,22 +809,22 @@ void Init_gsl_histogram3d(VALUE module)
   rb_define_method(cgsl_histogram3d, "get", rb_gsl_histogram3d_get, -1);
   rb_define_alias(cgsl_histogram3d, "[]", "get");
 
-  rb_define_method(cgsl_histogram3d, "increment", 
-		   rb_gsl_histogram3d_increment, -1);
+  rb_define_method(cgsl_histogram3d, "increment",
+                   rb_gsl_histogram3d_increment, -1);
   rb_define_alias(cgsl_histogram3d, "fill", "increment");
   rb_define_alias(cgsl_histogram3d, "accumulate", "increment");
 
-  rb_define_method(cgsl_histogram3d, "increment2", 
-		   rb_gsl_histogram3d_increment2, -1);
+  rb_define_method(cgsl_histogram3d, "increment2",
+                   rb_gsl_histogram3d_increment2, -1);
   rb_define_alias(cgsl_histogram3d, "fill2", "increment2");
   rb_define_alias(cgsl_histogram3d, "accumulate2", "increment2");
 
-  rb_define_method(cgsl_histogram3d, "get_xrange", 
-		   rb_gsl_histogram3d_get_xrange, 1);
-  rb_define_method(cgsl_histogram3d, "get_yrange", 
-		   rb_gsl_histogram3d_get_yrange, 1);
-  rb_define_method(cgsl_histogram3d, "get_zrange", 
-		   rb_gsl_histogram3d_get_zrange, 1);
+  rb_define_method(cgsl_histogram3d, "get_xrange",
+                   rb_gsl_histogram3d_get_xrange, 1);
+  rb_define_method(cgsl_histogram3d, "get_yrange",
+                   rb_gsl_histogram3d_get_yrange, 1);
+  rb_define_method(cgsl_histogram3d, "get_zrange",
+                   rb_gsl_histogram3d_get_zrange, 1);
 
   rb_define_method(cgsl_histogram3d, "find", rb_gsl_histogram3d_find, 3);
 
@@ -835,12 +835,12 @@ void Init_gsl_histogram3d(VALUE module)
 
   /*****/
 
-  rb_define_method(cgsl_histogram3d, "xyproject", 
-		   rb_gsl_histogram3d_xyproject, -1);
-  rb_define_method(cgsl_histogram3d, "xzproject", 
-		   rb_gsl_histogram3d_xzproject, -1);
-  rb_define_method(cgsl_histogram3d, "yzproject", 
-		   rb_gsl_histogram3d_yzproject, -1);
+  rb_define_method(cgsl_histogram3d, "xyproject",
+                   rb_gsl_histogram3d_xyproject, -1);
+  rb_define_method(cgsl_histogram3d, "xzproject",
+                   rb_gsl_histogram3d_xzproject, -1);
+  rb_define_method(cgsl_histogram3d, "yzproject",
+                   rb_gsl_histogram3d_yzproject, -1);
 
   rb_define_method(cgsl_histogram3d, "scale", rb_gsl_histogram3d_scale, 1);
   rb_define_method(cgsl_histogram3d, "scale!", rb_gsl_histogram3d_scale_bang, 1);
diff --git a/ext/gsl/histogram3d_source.c b/ext/gsl_native/histogram3d_source.c
similarity index 70%
rename from ext/gsl/histogram3d_source.c
rename to ext/gsl_native/histogram3d_source.c
index 69e3ef3..fc04559 100644
--- a/ext/gsl/histogram3d_source.c
+++ b/ext/gsl_native/histogram3d_source.c
@@ -16,30 +16,30 @@
 #include "include/rb_gsl_histogram.h"
 
 mygsl_histogram3d* mygsl_histogram3d_alloc(const size_t nx, const size_t ny,
-					   const size_t nz)
+                                           const size_t nz)
 {
   mygsl_histogram3d *h = NULL;
   if (nx == 0) GSL_ERROR_VAL ("histogram3d length nx must be positive integer",
-			      GSL_EDOM, 0);
+                              GSL_EDOM, 0);
   if (ny == 0) GSL_ERROR_VAL ("histogram3d length ny must be positive integer",
-			      GSL_EDOM, 0);
+                              GSL_EDOM, 0);
   if (nz == 0) GSL_ERROR_VAL ("histogram3d length nz must be positive integer",
-			      GSL_EDOM, 0);
+                              GSL_EDOM, 0);
   h = (mygsl_histogram3d *) malloc(sizeof(mygsl_histogram3d));
   if (h == NULL) GSL_ERROR_VAL ("failed to allocate space for histogram3d struct",
-				GSL_ENOMEM, 0);
+                                GSL_ENOMEM, 0);
   h->xrange = (double *) malloc ((nx + 1) * sizeof (double));
   if (h->xrange == 0) {
     free (h);         /* exception in constructor, avoid memory leak */
     GSL_ERROR_VAL ("failed to allocate space for histogram3d x ranges",
-		   GSL_ENOMEM, 0);
+                   GSL_ENOMEM, 0);
   }
   h->yrange = (double *) malloc ((ny + 1) * sizeof (double));
   if (h->yrange == 0) {
     free (h->xrange);
     free (h);         /* exception in constructor, avoid memory leak */
     GSL_ERROR_VAL ("failed to allocate space for histogram3d y ranges",
-		   GSL_ENOMEM, 0);
+                   GSL_ENOMEM, 0);
   }
   h->zrange = (double *) malloc ((nz + 1) * sizeof (double));
   if (h->zrange == 0) {
@@ -47,7 +47,7 @@ mygsl_histogram3d* mygsl_histogram3d_alloc(const size_t nx, const size_t ny,
     free (h->yrange);
     free (h);         /* exception in constructor, avoid memory leak */
     GSL_ERROR_VAL ("failed to allocate space for histogram3d z ranges",
-		   GSL_ENOMEM, 0);
+                   GSL_ENOMEM, 0);
   }
   h->bin = (double *) malloc (nx*ny*nz*sizeof (double));
   if (h->bin == 0) {
@@ -56,7 +56,7 @@ mygsl_histogram3d* mygsl_histogram3d_alloc(const size_t nx, const size_t ny,
     free (h->zrange);
     free (h);         /* exception in constructor, avoid memory leak */
     GSL_ERROR_VAL ("failed to allocate space for histogram bins",
-		   GSL_ENOMEM, 0);
+                   GSL_ENOMEM, 0);
   }
   h->nx = nx;
   h->ny = ny;
@@ -64,15 +64,15 @@ mygsl_histogram3d* mygsl_histogram3d_alloc(const size_t nx, const size_t ny,
   return h;
 }
 
-mygsl_histogram3d* mygsl_histogram3d_calloc_uniform(const size_t nx, 
-						    const size_t ny,
-						    const size_t nz,
-						    const double xmin,
-						    const double xmax,
-						    const double ymin,
-						    const double ymax,
-						    const double zmin,
-						    const double zmax)
+mygsl_histogram3d* mygsl_histogram3d_calloc_uniform(const size_t nx,
+                                                    const size_t ny,
+                                                    const size_t nz,
+                                                    const double xmin,
+                                                    const double xmax,
+                                                    const double ymin,
+                                                    const double ymax,
+                                                    const double zmin,
+                                                    const double zmax)
 {
   mygsl_histogram3d *h;
   size_t i;
@@ -86,9 +86,9 @@ mygsl_histogram3d* mygsl_histogram3d_calloc_uniform(const size_t nx,
   return h;
 }
 
-mygsl_histogram3d* mygsl_histogram3d_calloc(const size_t nx, 
-					    const size_t ny,
-					    const size_t nz)
+mygsl_histogram3d* mygsl_histogram3d_calloc(const size_t nx,
+                                            const size_t ny,
+                                            const size_t nz)
 {
   mygsl_histogram3d *h;
   size_t i;
@@ -104,10 +104,10 @@ mygsl_histogram3d* mygsl_histogram3d_calloc(const size_t nx,
   return h;
 }
 
-int mygsl_histogram3d_set_ranges_uniform (mygsl_histogram3d * h, 
-					  double xmin, double xmax,
-					  double ymin, double ymax,
-					  double zmin, double zmax)
+int mygsl_histogram3d_set_ranges_uniform (mygsl_histogram3d * h,
+                                          double xmin, double xmax,
+                                          double ymin, double ymax,
+                                          double zmin, double zmax)
 {
   size_t i;
   const size_t nx = h->nx, ny = h->ny, nz = h->nz;
@@ -115,7 +115,6 @@ int mygsl_histogram3d_set_ranges_uniform (mygsl_histogram3d * h,
   if (xmin >= xmax) GSL_ERROR_VAL ("xmin must be less than xmax", GSL_EINVAL, 0);
   if (ymin >= ymax) GSL_ERROR_VAL ("ymin must be less than ymax", GSL_EINVAL, 0);
   if (zmin >= zmax) GSL_ERROR_VAL ("zmin must be less than zmax", GSL_EINVAL, 0);
-
   for (i = 0; i <= nx; i++)
     h->xrange[i] = xmin + ((double) i / (double) nx) * (xmax - xmin);
   for (i = 0; i <= ny; i++)
@@ -126,22 +125,22 @@ int mygsl_histogram3d_set_ranges_uniform (mygsl_histogram3d * h,
   return GSL_SUCCESS;
 }
 
-int mygsl_histogram3d_set_ranges(mygsl_histogram3d * h, 
-				 const double xrange[], size_t xsize,
-				 const double yrange[], size_t ysize,
-				 const double zrange[], size_t zsize)
+int mygsl_histogram3d_set_ranges(mygsl_histogram3d * h,
+                                 const double xrange[], size_t xsize,
+                                 const double yrange[], size_t ysize,
+                                 const double zrange[], size_t zsize)
 {
   size_t i;
   const size_t nx = h->nx, ny = h->ny, nz = h->nz;
   if (xsize != (nx + 1))
-    GSL_ERROR_VAL ("size of xrange must match size of histogram", 
-		   GSL_EINVAL, 0);
+    GSL_ERROR_VAL ("size of xrange must match size of histogram",
+                   GSL_EINVAL, 0);
   if (ysize != (ny + 1))
-    GSL_ERROR_VAL ("size of yrange must match size of histogram", 
-		   GSL_EINVAL, 0);
+    GSL_ERROR_VAL ("size of yrange must match size of histogram",
+                   GSL_EINVAL, 0);
   if (zsize != (nz + 1))
-    GSL_ERROR_VAL ("size of yrange must match size of histogram", 
-		   GSL_EINVAL, 0);
+    GSL_ERROR_VAL ("size of yrange must match size of histogram",
+                   GSL_EINVAL, 0);
   memcpy(h->xrange, xrange, sizeof(double)*xsize);
   memcpy(h->yrange, yrange, sizeof(double)*ysize);
   memcpy(h->zrange, zrange, sizeof(double)*zsize);
@@ -161,13 +160,13 @@ void mygsl_histogram3d_free (mygsl_histogram3d * h)
 /*****/
 
 int mygsl_histogram3d_memcpy(mygsl_histogram3d * dest, const mygsl_histogram3d * src)
-{  
-  size_t nx = src->nx;  
-  size_t ny = src->ny;  
-  size_t nz = src->nz;  
+{
+  size_t nx = src->nx;
+  size_t ny = src->ny;
+  size_t nz = src->nz;
   if (dest->nx != src->nx || dest->ny != src->ny ||  dest->nz != src->nz) {
-    GSL_ERROR ("histograms have different sizes, cannot copy",   
-	       GSL_EINVAL);    
+    GSL_ERROR ("histograms have different sizes, cannot copy",
+               GSL_EINVAL);
   }
   memcpy(dest->xrange, src->xrange, sizeof(double)*(nx+1));
   memcpy(dest->yrange, src->yrange, sizeof(double)*(ny+1));
@@ -187,78 +186,78 @@ mygsl_histogram3d* mygsl_histogram3d_clone(const mygsl_histogram3d * src)
 /*****/
 
 int mygsl_histogram3d_fread(FILE * stream, mygsl_histogram3d * h)
-{  
-  int status = gsl_block_raw_fread (stream, h->xrange, h->nx + 1, 1);  
-  if (status)    return status;  
-  status = gsl_block_raw_fread (stream, h->yrange, h->ny + 1, 1);  
-  if (status)    return status;  
-  status = gsl_block_raw_fread (stream, h->zrange, h->nz + 1, 1);  
-  if (status)    return status;  
-  status = gsl_block_raw_fread (stream, h->bin, h->nx * h->ny * h->nz, 1);  
+{
+  int status = gsl_block_raw_fread (stream, h->xrange, h->nx + 1, 1);
+  if (status)    return status;
+  status = gsl_block_raw_fread (stream, h->yrange, h->ny + 1, 1);
+  if (status)    return status;
+  status = gsl_block_raw_fread (stream, h->zrange, h->nz + 1, 1);
+  if (status)    return status;
+  status = gsl_block_raw_fread (stream, h->bin, h->nx * h->ny * h->nz, 1);
   return status;
 }
 
 int mygsl_histogram3d_fwrite(FILE * stream, const mygsl_histogram3d * h)
-{  
-  int status = gsl_block_raw_fwrite (stream, h->xrange, h->nx + 1, 1);  
-  if (status)    return status;  
-  status = gsl_block_raw_fwrite (stream, h->yrange, h->ny + 1, 1);  
-  if (status)    return status;  
-  status = gsl_block_raw_fwrite (stream, h->zrange, h->nz + 1, 1);  
-  if (status)    return status;  
-  status = gsl_block_raw_fwrite (stream, h->bin, h->nx * h->ny * h->nz, 1);  
+{
+  int status = gsl_block_raw_fwrite (stream, h->xrange, h->nx + 1, 1);
+  if (status)    return status;
+  status = gsl_block_raw_fwrite (stream, h->yrange, h->ny + 1, 1);
+  if (status)    return status;
+  status = gsl_block_raw_fwrite (stream, h->zrange, h->nz + 1, 1);
+  if (status)    return status;
+  status = gsl_block_raw_fwrite (stream, h->bin, h->nx * h->ny * h->nz, 1);
   return status;
 }
 
 int mygsl_histogram3d_increment(mygsl_histogram3d * h, double x, double y, double z)
-{  
-  int status = mygsl_histogram3d_accumulate (h, x, y, z, 1.0);  
+{
+  int status = mygsl_histogram3d_accumulate (h, x, y, z, 1.0);
   return status;
 }
 
 int mygsl_find (const size_t n, const double range[], const double x, size_t * i);
 int mygsl_find2d (const size_t nx, const double xrange[],
-		  const size_t ny, const double yrange[],
-		  const double x, const double y,
-		  size_t * i, size_t * j);
+                  const size_t ny, const double yrange[],
+                  const double x, const double y,
+                  size_t * i, size_t * j);
 int mygsl_find3d (const size_t nx, const double xrange[],
-		  const size_t ny, const double yrange[],
-		  const size_t nz, const double zrange[],
-		  const double x, const double y, const double z,
-		  size_t * i, size_t * j, size_t *k);
-
-int mygsl_histogram3d_accumulate(mygsl_histogram3d * h, 
-				 double x, double y, double z, double weight)
-{  
-  const size_t nx = h->nx;  
-  const size_t ny = h->ny;  
-  const size_t nz = h->nz;  
-  size_t i = 0, j = 0, k = 0;  
+                  const size_t ny, const double yrange[],
+                  const size_t nz, const double zrange[],
+                  const double x, const double y, const double z,
+                  size_t * i, size_t * j, size_t *k);
+
+int mygsl_histogram3d_accumulate(mygsl_histogram3d * h,
+                                 double x, double y, double z, double weight)
+{
+  const size_t nx = h->nx;
+  const size_t ny = h->ny;
+  const size_t nz = h->nz;
+  size_t i = 0, j = 0, k = 0;
   int status = mygsl_find3d (h->nx, h->xrange, h->ny, h->yrange, h->nz, h->zrange,
-			     x, y, z, &i, &j, &k);  
-  if (status) return GSL_EDOM; 
-  if (i >= nx) GSL_ERROR ("index lies outside valid range of 0 .. nx - 1",   
-			  GSL_ESANITY);    
-  if (j >= ny) GSL_ERROR ("index lies outside valid range of 0 .. ny - 1",  
-			  GSL_ESANITY);   
-  if (k >= nz) GSL_ERROR ("index lies outside valid range of 0 .. nz - 1",  
-			  GSL_ESANITY);   
-  h->bin[i*ny*nz + j*nz + k] += weight;  
+                             x, y, z, &i, &j, &k);
+  if (status) return GSL_EDOM;
+  if (i >= nx) GSL_ERROR ("index lies outside valid range of 0 .. nx - 1",
+                          GSL_ESANITY);
+  if (j >= ny) GSL_ERROR ("index lies outside valid range of 0 .. ny - 1",
+                          GSL_ESANITY);
+  if (k >= nz) GSL_ERROR ("index lies outside valid range of 0 .. nz - 1",
+                          GSL_ESANITY);
+  h->bin[i*ny*nz + j*nz + k] += weight;
   return GSL_SUCCESS;
 }
 
-int mygsl_histogram3d_increment2(mygsl_histogram3d * h, 
-				 double x, double y, double z)
+int mygsl_histogram3d_increment2(mygsl_histogram3d * h,
+                                 double x, double y, double z)
 {
   return mygsl_histogram3d_accumulate2(h, x, y, z, 1.0);
 }
 
-int mygsl_histogram3d_accumulate2(mygsl_histogram3d * h, 
-				  double x, double y, double z, double weight)
-{  
-  const size_t nx = h->nx;  
-  const size_t ny = h->ny;  
-  const size_t nz = h->nz;  
+int mygsl_histogram3d_accumulate2(mygsl_histogram3d * h,
+                                  double x, double y, double z, double weight)
+{
+  const size_t nx = h->nx;
+  const size_t ny = h->ny;
+  const size_t nz = h->nz;
   size_t i = 0, j = 0, k = 0;
   int status;
   if (x < h->xrange[0]) x = h->xrange[0] + 4*GSL_DBL_EPSILON;
@@ -268,81 +267,81 @@ int mygsl_histogram3d_accumulate2(mygsl_histogram3d * h,
   if (z < h->zrange[0]) z = h->zrange[0] + 4*GSL_DBL_EPSILON;
   if (z > h->zrange[h->nz]) z = h->zrange[h->nz] - 4*GSL_DBL_EPSILON;
   status = mygsl_find3d (h->nx, h->xrange, h->ny, h->yrange, h->nz, h->zrange,
-			 x, y, z, &i, &j, &k);  
-  if (status) return GSL_EDOM; 
-  if (i >= nx) GSL_ERROR ("index lies outside valid range of 0 .. nx - 1",   
-			  GSL_ESANITY);    
-  if (j >= ny) GSL_ERROR ("index lies outside valid range of 0 .. ny - 1",  
-			  GSL_ESANITY);   
-  if (k >= nz) GSL_ERROR ("index lies outside valid range of 0 .. nz - 1",  
-			  GSL_ESANITY);   
-  h->bin[i*ny*nz + j*nz + k] += weight;  
+                         x, y, z, &i, &j, &k);
+  if (status) return GSL_EDOM;
+  if (i >= nx) GSL_ERROR ("index lies outside valid range of 0 .. nx - 1",
+                          GSL_ESANITY);
+  if (j >= ny) GSL_ERROR ("index lies outside valid range of 0 .. ny - 1",
+                          GSL_ESANITY);
+  if (k >= nz) GSL_ERROR ("index lies outside valid range of 0 .. nz - 1",
+                          GSL_ESANITY);
+  h->bin[i*ny*nz + j*nz + k] += weight;
   return GSL_SUCCESS;
 }
 
-double mygsl_histogram3d_get(const mygsl_histogram3d * h, const size_t i, 
-			     const size_t j, const size_t k)
-{  
-  const size_t nx = h->nx;  
-  const size_t ny = h->ny;  
-  const size_t nz = h->nz;  
-  if (i >= nx) GSL_ERROR_VAL ("index i lies outside valid range of 0 .. nx - 1", 
-			      GSL_EDOM, 0);   
-  if (j >= ny) GSL_ERROR_VAL ("index j lies outside valid range of 0 .. ny - 1",    
-			      GSL_EDOM, 0);    
-  if (k >= nz) GSL_ERROR_VAL ("index k lies outside valid range of 0 .. nz - 1",    
-			      GSL_EDOM, 0);    
+double mygsl_histogram3d_get(const mygsl_histogram3d * h, const size_t i,
+                             const size_t j, const size_t k)
+{
+  const size_t nx = h->nx;
+  const size_t ny = h->ny;
+  const size_t nz = h->nz;
+  if (i >= nx) GSL_ERROR_VAL ("index i lies outside valid range of 0 .. nx - 1",
+                              GSL_EDOM, 0);
+  if (j >= ny) GSL_ERROR_VAL ("index j lies outside valid range of 0 .. ny - 1",
+                              GSL_EDOM, 0);
+  if (k >= nz) GSL_ERROR_VAL ("index k lies outside valid range of 0 .. nz - 1",
+                              GSL_EDOM, 0);
   return h->bin[i*ny*nz + j*nz + k];
 }
 
-int mygsl_histogram3d_get_xrange(const mygsl_histogram3d * h, const size_t i,  
-			       double *xlower, double *xupper)
-{ 
-  const size_t nx = h->nx;  
-  if (i >= nx) GSL_ERROR ("index i lies outside valid range of 0 .. nx - 1", 
-			  GSL_EDOM);    
-  *xlower = h->xrange[i];  
-  *xupper = h->xrange[i + 1];  
+int mygsl_histogram3d_get_xrange(const mygsl_histogram3d * h, const size_t i,
+                                 double *xlower, double *xupper)
+{
+  const size_t nx = h->nx;
+  if (i >= nx) GSL_ERROR ("index i lies outside valid range of 0 .. nx - 1",
+                          GSL_EDOM);
+  *xlower = h->xrange[i];
+  *xupper = h->xrange[i + 1];
   return GSL_SUCCESS;
 }
 
-int mygsl_histogram3d_get_yrange(const mygsl_histogram3d * h, const size_t j,  
-			       double *ylower, double *yupper)
-{ 
-  const size_t ny = h->ny;  
-  if (j >= ny) GSL_ERROR ("index j lies outside valid range of 0 .. ny - 1", 
-			  GSL_EDOM);    
-  *ylower = h->yrange[j];  
-  *yupper = h->yrange[j + 1];  
+int mygsl_histogram3d_get_yrange(const mygsl_histogram3d * h, const size_t j,
+                                 double *ylower, double *yupper)
+{
+  const size_t ny = h->ny;
+  if (j >= ny) GSL_ERROR ("index j lies outside valid range of 0 .. ny - 1",
+                          GSL_EDOM);
+  *ylower = h->yrange[j];
+  *yupper = h->yrange[j + 1];
   return GSL_SUCCESS;
 }
 
-int mygsl_histogram3d_get_zrange(const mygsl_histogram3d * h, const size_t k,  
-			       double *zlower, double *zupper)
-{ 
-  const size_t nz = h->nz;  
-  if (k >= nz) GSL_ERROR ("index k lies outside valid range of 0 .. nz - 1", 
-			  GSL_EDOM);    
-  *zlower = h->zrange[k];  
-  *zupper = h->zrange[k + 1];  
+int mygsl_histogram3d_get_zrange(const mygsl_histogram3d * h, const size_t k,
+                                 double *zlower, double *zupper)
+{
+  const size_t nz = h->nz;
+  if (k >= nz) GSL_ERROR ("index k lies outside valid range of 0 .. nz - 1",
+                          GSL_EDOM);
+  *zlower = h->zrange[k];
+  *zupper = h->zrange[k + 1];
   return GSL_SUCCESS;
 }
 
 int mygsl_histogram3d_find (const mygsl_histogram3d * h,
-			    const double x, const double y, const double z,
-			    size_t * i, size_t * j, size_t *k)
-{ 
-  int status = mygsl_find(h->nx, h->xrange, x, i);  
-  if (status) GSL_ERROR ("x not found in range of h", GSL_EDOM);    
-  status = mygsl_find (h->ny, h->yrange, y, j);  
-  if (status) GSL_ERROR ("y not found in range of h", GSL_EDOM);    
-  status = mygsl_find (h->nz, h->zrange, z, k);  
-  if (status) GSL_ERROR ("z not found in range of h", GSL_EDOM);    
+                            const double x, const double y, const double z,
+                            size_t * i, size_t * j, size_t *k)
+{
+  int status = mygsl_find(h->nx, h->xrange, x, i);
+  if (status) GSL_ERROR ("x not found in range of h", GSL_EDOM);
+  status = mygsl_find (h->ny, h->yrange, y, j);
+  if (status) GSL_ERROR ("y not found in range of h", GSL_EDOM);
+  status = mygsl_find (h->nz, h->zrange, z, k);
+  if (status) GSL_ERROR ("z not found in range of h", GSL_EDOM);
   return GSL_SUCCESS;
 }
 
 gsl_histogram2d* mygsl_histogram3d_xyproject(const mygsl_histogram3d * h3,
-					     size_t kstart, size_t kend)
+                                             size_t kstart, size_t kend)
 {
   gsl_histogram2d *h2;
   double count;
@@ -353,8 +352,8 @@ gsl_histogram2d* mygsl_histogram3d_xyproject(const mygsl_histogram3d * h3,
     for (j = 0; j < h3->ny; j++) {
       count = 0;
       for (k = kstart; k <= kend; k++) {
-	if (k >= h3->nz) break;
-	count += mygsl_histogram3d_get(h3, i, j, k);
+        if (k >= h3->nz) break;
+        count += mygsl_histogram3d_get(h3, i, j, k);
       }
       h2->bin[i*h2->ny + j] = count;
     }
@@ -363,7 +362,7 @@ gsl_histogram2d* mygsl_histogram3d_xyproject(const mygsl_histogram3d * h3,
 }
 
 gsl_histogram2d* mygsl_histogram3d_xzproject(const mygsl_histogram3d * h3,
-					     size_t jstart, size_t jend)
+                                             size_t jstart, size_t jend)
 {
   gsl_histogram2d *h2;
   double count;
@@ -374,8 +373,8 @@ gsl_histogram2d* mygsl_histogram3d_xzproject(const mygsl_histogram3d * h3,
     for (k = 0; k < h3->nz; k++) {
       count = 0;
       for (j = jstart; j <= jend; j++) {
-	if (j >= h3->ny) break;
-	count += mygsl_histogram3d_get(h3, i, j, k);
+        if (j >= h3->ny) break;
+        count += mygsl_histogram3d_get(h3, i, j, k);
       }
       h2->bin[i*h2->ny + k] = count;
     }
@@ -384,7 +383,7 @@ gsl_histogram2d* mygsl_histogram3d_xzproject(const mygsl_histogram3d * h3,
 }
 
 gsl_histogram2d* mygsl_histogram3d_yzproject(const mygsl_histogram3d * h3,
-					     size_t istart, size_t iend)
+                                             size_t istart, size_t iend)
 {
   gsl_histogram2d *h2;
   double count;
@@ -395,8 +394,8 @@ gsl_histogram2d* mygsl_histogram3d_yzproject(const mygsl_histogram3d * h3,
     for (k = 0; k < h3->nz; k++) {
       count = 0;
       for (i = istart; i <= iend; i++) {
-	if (i >= h3->nx) break;
-	count += mygsl_histogram3d_get(h3, i, j, k);
+        if (i >= h3->nx) break;
+        count += mygsl_histogram3d_get(h3, i, j, k);
       }
       h2->bin[j*h2->ny + k] = count;
     }
@@ -422,7 +421,7 @@ int mygsl_histogram3d_shift(mygsl_histogram3d * h, double shift)
 
 double mygsl_histogram3d_xmax(const mygsl_histogram3d * h)
 {
-  const int nx = h->nx;  
+  const int nx = h->nx;
   return h->xrange[nx];
 }
 double mygsl_histogram3d_xmin(const mygsl_histogram3d * h)
@@ -432,7 +431,7 @@ double mygsl_histogram3d_xmin(const mygsl_histogram3d * h)
 
 double mygsl_histogram3d_ymax(const mygsl_histogram3d * h)
 {
-  const int ny = h->ny;  
+  const int ny = h->ny;
   return h->yrange[ny];
 }
 double mygsl_histogram3d_ymin(const mygsl_histogram3d * h)
@@ -442,7 +441,7 @@ double mygsl_histogram3d_ymin(const mygsl_histogram3d * h)
 
 double mygsl_histogram3d_zmax(const mygsl_histogram3d * h)
 {
-  const int nz = h->nz;  
+  const int nz = h->nz;
   return h->zrange[nz];
 }
 
@@ -464,8 +463,8 @@ double mygsl_histogram3d_max_val(const mygsl_histogram3d * h)
   return max;
 }
 
-void mygsl_histogram3d_max_bin(const mygsl_histogram3d * h, 
-			       size_t *imax_out, size_t *jmax_out, size_t *kmax_out)
+void mygsl_histogram3d_max_bin(const mygsl_histogram3d * h,
+                               size_t *imax_out, size_t *jmax_out, size_t *kmax_out)
 {
   const size_t nx = h->nx;
   const size_t ny = h->ny;
@@ -475,13 +474,13 @@ void mygsl_histogram3d_max_bin(const mygsl_histogram3d * h,
   for (i = 0; i < nx; i++) {
     for (j = 0; j < ny; j++) {
       for (k = 0; k < nz; k++) {
-	x = h->bin[i * ny*nz + j*nz + k];
-	if (x > max) {
-	  max = x;
-	  imax = i;
-	  jmax = j;
-	  kmax = k;
-	}
+        x = h->bin[i * ny*nz + j*nz + k];
+        if (x > max) {
+          max = x;
+          imax = i;
+          jmax = j;
+          kmax = k;
+        }
       }
     }
   }
@@ -503,8 +502,8 @@ double mygsl_histogram3d_min_val(const mygsl_histogram3d * h)
   return min;
 }
 
-void mygsl_histogram3d_min_bin(const mygsl_histogram3d * h, 
-			       size_t *imin_out, size_t *jmin_out, size_t *kmin_out)
+void mygsl_histogram3d_min_bin(const mygsl_histogram3d * h,
+                               size_t *imin_out, size_t *jmin_out, size_t *kmin_out)
 {
   const size_t nx = h->nx;
   const size_t ny = h->ny;
@@ -514,13 +513,13 @@ void mygsl_histogram3d_min_bin(const mygsl_histogram3d * h,
   for (i = 0; i < nx; i++) {
     for (j = 0; j < ny; j++) {
       for (k = 0; k < nz; k++) {
-	x = h->bin[i * ny*nz + j*nz + k];
-	if (x < min) {
-	  min = x;
-	  imin = i;
-	  jmin = j;
-	  kmin = k;
-	}
+        x = h->bin[i * ny*nz + j*nz + k];
+        if (x < min) {
+          min = x;
+          imin = i;
+          jmin = j;
+          kmin = k;
+        }
       }
     }
   }
@@ -551,8 +550,8 @@ double mygsl_histogram3d_xmean (const mygsl_histogram3d * h)
     double wi = 0;
     for (j = 0; j < ny; j++) {
       for (k = 0; k < nz; k++) {
-	double wijk = h->bin[i * ny *nz + j * nz + k];
-	if (wijk > 0) wi += wijk;
+        double wijk = h->bin[i * ny *nz + j * nz + k];
+        if (wijk > 0) wi += wijk;
       }
     }
     if (wi > 0) {
@@ -576,8 +575,8 @@ double mygsl_histogram3d_ymean (const mygsl_histogram3d * h)
     double wj = 0;
     for (i = 0; i < nx; i++) {
       for (k = 0; k < nz; k++) {
-	double wijk = h->bin[i * ny *nz + j * nz + k];
-	if (wijk > 0) wj += wijk;
+        double wijk = h->bin[i * ny *nz + j * nz + k];
+        if (wijk > 0) wj += wijk;
       }
     }
     if (wj > 0) {
@@ -601,8 +600,8 @@ double mygsl_histogram3d_zmean (const mygsl_histogram3d * h)
     double wk = 0;
     for (i = 0; i < nx; i++) {
       for (j = 0; j < ny; j++) {
-	double wijk = h->bin[i * ny *nz + j * nz + k];
-	if (wijk > 0) wk += wijk;
+        double wijk = h->bin[i * ny *nz + j * nz + k];
+        if (wijk > 0) wk += wijk;
       }
     }
     if (wk > 0) {
@@ -624,8 +623,8 @@ double mygsl_histogram3d_xsigma(const mygsl_histogram3d * h)
     double wi = 0;
     for (j = 0; j < ny; j++) {
       for (k = 0; k < nz; k++) {
-	double wijk = h->bin[i * ny*nz + j*nz + k];
-	if (wijk > 0) wi += wijk;
+        double wijk = h->bin[i * ny*nz + j*nz + k];
+        if (wijk > 0) wi += wijk;
       }
     }
     if (wi > 0) {
@@ -633,7 +632,7 @@ double mygsl_histogram3d_xsigma(const mygsl_histogram3d * h)
       wvariance += ((xi * xi) - wvariance) * (wi / W);
     }
   }
-  return  sqrt(wvariance);
+  return sqrt(wvariance);
 }
 
 double mygsl_histogram3d_ysigma(const mygsl_histogram3d * h)
@@ -647,8 +646,8 @@ double mygsl_histogram3d_ysigma(const mygsl_histogram3d * h)
     double wj = 0;
     for (i = 0; i < nx; i++) {
       for (k = 0; k < nz; k++) {
-	double wjjk = h->bin[i * ny*nz + j*nz + k];
-	if (wjjk > 0) wj += wjjk;
+        double wjjk = h->bin[i * ny*nz + j*nz + k];
+        if (wjjk > 0) wj += wjjk;
       }
     }
     if (wj > 0) {
@@ -656,7 +655,7 @@ double mygsl_histogram3d_ysigma(const mygsl_histogram3d * h)
       wvariance += ((yj * yj) - wvariance) * (wj / W);
     }
   }
-  return  sqrt(wvariance);
+  return sqrt(wvariance);
 }
 
 double mygsl_histogram3d_zsigma(const mygsl_histogram3d * h)
@@ -670,8 +669,8 @@ double mygsl_histogram3d_zsigma(const mygsl_histogram3d * h)
     double wk = 0;
     for (i = 0; i < nx; i++) {
       for (j = 0; j < ny; j++) {
-	double wijk = h->bin[i * ny*nz + j*nz + k];
-	if (wijk > 0) wk += wijk;
+        double wijk = h->bin[i * ny*nz + j*nz + k];
+        if (wijk > 0) wk += wijk;
       }
     }
     if (wk > 0) {
@@ -679,7 +678,7 @@ double mygsl_histogram3d_zsigma(const mygsl_histogram3d * h)
       wvariance += ((zk * zk) - wvariance) * (wk / W);
     }
   }
-  return  sqrt(wvariance);
+  return sqrt(wvariance);
 }
 
 void mygsl_histogram3d_reset(mygsl_histogram3d * h)
@@ -690,17 +689,17 @@ void mygsl_histogram3d_reset(mygsl_histogram3d * h)
   const size_t nz = h->nz;
 
   for (i = 0; i < nx * ny * nz; i++)
-    {
-      h->bin[i] = 0;
-    }
+  {
+    h->bin[i] = 0;
+  }
 }
 
 int mygsl_histogram3d_equal_bins_p(const mygsl_histogram3d * h1,
-				   const mygsl_histogram3d * h2)
+                                   const mygsl_histogram3d * h2)
 {
   size_t i;
   if ((h1->nx != h2->nx) || (h1->ny != h2->ny) || (h1->nz != h2->nz)) return 0;
-  for (i = 0; i <= h1->nx; i++) 
+  for (i = 0; i <= h1->nx; i++)
     if (h1->xrange[i] != h2->xrange[i]) return 0;
   for (i = 0; i <= h1->ny; i++)
     if (h1->yrange[i] != h2->yrange[i]) return 0;
diff --git a/ext/gsl/histogram_find.c b/ext/gsl_native/histogram_find.c
similarity index 75%
rename from ext/gsl/histogram_find.c
rename to ext/gsl_native/histogram_find.c
index 587b3be..d039431 100644
--- a/ext/gsl/histogram_find.c
+++ b/ext/gsl_native/histogram_find.c
@@ -1,17 +1,17 @@
 /* histogram/find.c
- * 
+ *
  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or (at
  * your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -26,7 +26,6 @@ int mygsl_find (const size_t n, const double range[], const double x, size_t * i
   size_t i_linear, lower, upper, mid;
   if (x < range[0]) return -1;
   if (x >= range[n]) return +1;
-
   /* optimize for linear case */
 
 #ifdef LINEAR_OPT
@@ -36,47 +35,46 @@ int mygsl_find (const size_t n, const double range[], const double x, size_t * i
   }
 
   if (x >= range[i_linear] && x < range[i_linear + 1])
-    {
-      *i = i_linear;
-      return 0;
-    }
+  {
+    *i = i_linear;
+    return 0;
+  }
 #endif
 
   /* perform binary search */
 
-  upper = n ;
-  lower = 0 ;
+  upper = n;
+  lower = 0;
 
   while (upper - lower > 1)
+  {
+    mid = (upper + lower) / 2;
+
+    if (x >= range[mid])
     {
-      mid = (upper + lower) / 2 ;
-      
-      if (x >= range[mid])
-        {
-          lower = mid ;
-        }
-      else
-        {
-          upper = mid ;
-        }
+      lower = mid;
     }
+    else
+    {
+      upper = mid;
+    }
+  }
 
-  *i = lower ;
+  *i = lower;
 
   /* sanity check the result */
 
   if (x < range[lower] || x >= range[lower + 1])
-    {
-      GSL_ERROR ("x not found in range", GSL_ESANITY);
-    }
-
+  {
+    GSL_ERROR ("x not found in range", GSL_ESANITY);
+  }
   return 0;
 }
 
 int mygsl_find2d (const size_t nx, const double xrange[],
-		  const size_t ny, const double yrange[],
-		  const double x, const double y,
-		  size_t * i, size_t * j)
+                  const size_t ny, const double yrange[],
+                  const double x, const double y,
+                  size_t * i, size_t * j)
 {
   int status = mygsl_find (nx, xrange, x, i);
   if (status) return status;
@@ -86,10 +84,10 @@ int mygsl_find2d (const size_t nx, const double xrange[],
 }
 
 int mygsl_find3d (const size_t nx, const double xrange[],
-		  const size_t ny, const double yrange[],
-		  const size_t nz, const double zrange[],
-		  const double x, const double y, const double z,
-		  size_t * i, size_t * j, size_t *k)
+                  const size_t ny, const double yrange[],
+                  const size_t nz, const double zrange[],
+                  const double x, const double y, const double z,
+                  size_t * i, size_t * j, size_t *k)
 {
   int status = mygsl_find (nx, xrange, x, i);
   if (status) return status;
diff --git a/ext/gsl/histogram_oper.c b/ext/gsl_native/histogram_oper.c
similarity index 78%
rename from ext/gsl/histogram_oper.c
rename to ext/gsl_native/histogram_oper.c
index 0c85945..fea48c9 100644
--- a/ext/gsl/histogram_oper.c
+++ b/ext/gsl_native/histogram_oper.c
@@ -18,11 +18,11 @@
  */
 /***************************************************************
  *
- * File gsl_histogram_oper.c: 
- * Routine to make operation on histograms. 
+ * File gsl_histogram_oper.c:
+ * Routine to make operation on histograms.
  * Need GSL library and header.
  * Contains the routines:
- * gsl_histogram_same_binning check if two histograms have the same binning 
+ * gsl_histogram_same_binning check if two histograms have the same binning
  * gsl_histogram_add          add two histograms
  * gsl_histogram_sub          subctract two histograms
  * gsl_histogram_mult         multiply two histograms
@@ -38,7 +38,7 @@
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_histogram.h>
 
-/* 
+/*
  * gsl_histogram_same_binning:
  * control if two histograms have the
  * same binning
@@ -48,112 +48,103 @@ int
 mygsl_histogram_equal_bins_p (const gsl_histogram * h1, const gsl_histogram * h2)
 {
   if (h1->n != h2->n)
-    {
-      return 0;
-    }
-
+  {
+    return 0;
+  }
   {
     size_t i;
     /* init ranges */
 
     for (i = 0; i <= h1->n; i++)
+    {
+      if (gsl_fcmp(h1->range[i],h2->range[i], 1e-12))
       {
-        if (gsl_fcmp(h1->range[i],h2->range[i], 1e-12))
-          {
-            return 0;
-          }
+        return 0;
       }
+    }
   }
 
   return 1;
 }
 
-/* 
+/*
  * gsl_histogram_add:
  * add two histograms
  */
-int 
+int
 mygsl_histogram_add (gsl_histogram * h1, const gsl_histogram * h2)
 {
   size_t i;
 
   if (!mygsl_histogram_equal_bins_p (h1, h2))
-    {
-      GSL_ERROR ("histograms have different binning", GSL_EINVAL);
-    }
-
+  {
+    GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+  }
   for (i = 0; i < h1->n; i++)
-    {
-      h1->bin[i] += h2->bin[i];
-    }
-
+  {
+    h1->bin[i] += h2->bin[i];
+  }
   return GSL_SUCCESS;
 }
 
-/* 
+/*
  * gsl_histogram_sub:
  * subtract two histograms
  */
 
-int 
+int
 mygsl_histogram_sub (gsl_histogram * h1, const gsl_histogram * h2)
 {
   size_t i;
 
   if (!mygsl_histogram_equal_bins_p (h1, h2))
-    {
-      GSL_ERROR ("histograms have different binning", GSL_EINVAL);
-    }
-
+  {
+    GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+  }
   for (i = 0; i < h1->n; i++)
-    {
-      h1->bin[i] -= h2->bin[i];
-    }
-
+  {
+    h1->bin[i] -= h2->bin[i];
+  }
   return GSL_SUCCESS;
 
 }
 
-/* 
+/*
  * gsl_histogram_mult:
  * multiply two histograms
  */
 
-int 
+int
 mygsl_histogram_mul (gsl_histogram * h1, const gsl_histogram * h2)
 {
   size_t i;
 
   if (!mygsl_histogram_equal_bins_p (h1, h2))
-    {
-      GSL_ERROR ("histograms have different binning", GSL_EINVAL);
-    }
-
+  {
+    GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+  }
   for (i = 0; i < h1->n; i++)
-    {
-      h1->bin[i] *= h2->bin[i];
-    }
-
+  {
+    h1->bin[i] *= h2->bin[i];
+  }
   return GSL_SUCCESS;
 }
-/* 
+/*
  * gsl_histogram_div:
  * divide two histograms
  */
-int 
+int
 mygsl_histogram_div (gsl_histogram * h1, const gsl_histogram * h2)
 {
   size_t i;
 
   if (!mygsl_histogram_equal_bins_p (h1, h2))
-    {
-      GSL_ERROR ("histograms have different binning", GSL_EINVAL);
-    }
-
+  {
+    GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+  }
   for (i = 0; i < h1->n; i++)
-    {
-      h1->bin[i] /= h2->bin[i];
-    }
-
+  {
+    h1->bin[i] /= h2->bin[i];
+  }
   return GSL_SUCCESS;
 }
diff --git a/ext/gsl/ieee.c b/ext/gsl_native/ieee.c
similarity index 83%
rename from ext/gsl/ieee.c
rename to ext/gsl_native/ieee.c
index 4ad3b32..1d5df16 100644
--- a/ext/gsl/ieee.c
+++ b/ext/gsl_native/ieee.c
@@ -19,11 +19,7 @@ static VALUE rb_gsl_ieee_env_setup(VALUE obj)
 
 static VALUE rb_gsl_ieee_fprintf_double(int argc, VALUE *argv, VALUE obj)
 {
-#ifdef HAVE_RUBY_IO_H
   rb_io_t *fptr = NULL;
-#else
-  OpenFile *fptr = NULL;
-#endif
   FILE *fp = NULL;
   int flag = 0;
   VALUE vtmp;
@@ -39,15 +35,11 @@ static VALUE rb_gsl_ieee_fprintf_double(int argc, VALUE *argv, VALUE obj)
     case T_FILE:
       GetOpenFile(argv[0], fptr);
       rb_io_check_writable(fptr);
-#ifdef HAVE_RUBY_IO_H
       fp = rb_io_stdio_file(fptr);
-#else
-      fp = GetWriteFile(fptr);
-#endif
       break;
     default:
       rb_raise(rb_eTypeError, "wrong type argument %s (IO or String expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     vtmp = argv[1];
     break;
@@ -60,7 +52,7 @@ static VALUE rb_gsl_ieee_fprintf_double(int argc, VALUE *argv, VALUE obj)
   }
   if (TYPE(vtmp) != T_FLOAT)
     rb_raise(rb_eTypeError, "wrong argument type %s (Float expected)",
-	     rb_class2name(CLASS_OF(vtmp)));
+             rb_class2name(CLASS_OF(vtmp)));
   ftmp = RFLOAT_VALUE(vtmp);
   gsl_ieee_fprintf_double(fp, &ftmp);
   if (fp == stdout) fprintf(stdout, "\n");
@@ -82,15 +74,15 @@ void Init_gsl_ieee(VALUE module)
   mgsl_ieee = rb_define_module_under(module, "IEEE");
 
   rb_define_singleton_method(mgsl_ieee, "env_setup",
-			     rb_gsl_ieee_env_setup, 0);
+                             rb_gsl_ieee_env_setup, 0);
   rb_define_module_function(module, "ieee_env_setup", rb_gsl_ieee_env_setup, 0);
   rb_define_singleton_method(mgsl_ieee, "fprintf_double",
-			     rb_gsl_ieee_fprintf_double, -1);
+                             rb_gsl_ieee_fprintf_double, -1);
   rb_define_singleton_method(mgsl_ieee, "fprintf",
-			     rb_gsl_ieee_fprintf_double, -1);
+                             rb_gsl_ieee_fprintf_double, -1);
   rb_define_singleton_method(mgsl_ieee, "printf",
-			     rb_gsl_ieee_printf_double, -1);
+                             rb_gsl_ieee_printf_double, -1);
   rb_define_singleton_method(mgsl_ieee, "printf_double",
-			     rb_gsl_ieee_printf_double, -1);
+                             rb_gsl_ieee_printf_double, -1);
 
 }
diff --git a/ext/gsl/include/rb_gsl.h b/ext/gsl_native/include/rb_gsl.h
similarity index 97%
rename from ext/gsl/include/rb_gsl.h
rename to ext/gsl_native/include/rb_gsl.h
index 0e72ef8..f701149 100644
--- a/ext/gsl/include/rb_gsl.h
+++ b/ext/gsl_native/include/rb_gsl.h
@@ -67,9 +67,7 @@ void Init_gsl_odeiv(VALUE module);
 void Init_gsl_interp(VALUE module);
 void Init_gsl_spline(VALUE module);
 void Init_gsl_diff(VALUE module);
-#ifdef GSL_1_4_9_LATER
 void Init_gsl_deriv(VALUE module);
-#endif
 
 void Init_gsl_cheb(VALUE module);
 void Init_gsl_sum(VALUE module);
@@ -123,9 +121,7 @@ void Init_cqp(VALUE module);
 
 void Init_fresnel(VALUE module);
 
-#ifdef GSL_1_9_LATER
 void Init_bspline(VALUE module);
-#endif
 
 #ifdef HAVE_ALF_ALF_H
 #include "alf/alf.h"
@@ -133,11 +129,8 @@ void Init_bspline(VALUE module);
 void Init_alf(VALUE module);
 void Init_geometry(VALUE module);
 
-#ifdef GSL_1_14_LATER
 #include <gsl/gsl_multiset.h>
 extern VALUE cMultiset;
 void Init_multiset(VALUE module);
 
 #endif
-
-#endif
diff --git a/ext/gsl/include/rb_gsl_array.h b/ext/gsl_native/include/rb_gsl_array.h
similarity index 86%
rename from ext/gsl/include/rb_gsl_array.h
rename to ext/gsl_native/include/rb_gsl_array.h
index ffbbe1f..330d2a1 100644
--- a/ext/gsl/include/rb_gsl_array.h
+++ b/ext/gsl_native/include/rb_gsl_array.h
@@ -109,14 +109,14 @@ double* get_vector_ptr(VALUE ary, size_t *stride, size_t *n);
 
 gsl_matrix_complex* matrix_to_complex(const gsl_matrix *m);
 
-void gsl_matrix_complex_mul(gsl_matrix_complex *mnew, const gsl_matrix_complex *m, 
-			    const gsl_matrix_complex *mb);
+void gsl_matrix_complex_mul(gsl_matrix_complex *mnew, const gsl_matrix_complex *m,
+                            const gsl_matrix_complex *mb);
 void gsl_matrix_mul(gsl_matrix *mnew, gsl_matrix *m, gsl_matrix *b);
-void gsl_matrix_complex_mul_vector(gsl_vector_complex *vnew, 
-				   const gsl_matrix_complex *m, 
-				   const gsl_vector_complex *v);
-void gsl_matrix_mul_vector(gsl_vector *vnew, 
-			   const gsl_matrix *m, const gsl_vector *v);
+void gsl_matrix_complex_mul_vector(gsl_vector_complex *vnew,
+                                   const gsl_matrix_complex *m,
+                                   const gsl_vector_complex *v);
+void gsl_matrix_mul_vector(gsl_vector *vnew,
+                           const gsl_matrix *m, const gsl_vector *v);
 gsl_vector_complex* vector_to_complex(const gsl_vector *v);
 
 gsl_vector* make_vector_clone(const gsl_vector *v);
@@ -150,8 +150,8 @@ gsl_matrix_int_view* rb_gsl_matrix_int_view_alloc();
 void rb_gsl_matrix_int_view_free(gsl_matrix_int_view *v);
 VALUE rb_gsl_matrix_to_i(VALUE obj);
 VALUE rb_gsl_matrix_int_to_f(VALUE obj);
-void gsl_matrix_int_mul_vector(gsl_vector_int *vnew, 
-			       const gsl_matrix_int *m, const gsl_vector_int *v);
+void gsl_matrix_int_mul_vector(gsl_vector_int *vnew,
+                               const gsl_matrix_int *m, const gsl_vector_int *v);
 VALUE rb_gsl_vector_to_i(VALUE obj);
 VALUE make_rarray_from_cvector_int(const gsl_vector_int *v);
 VALUE rb_gsl_vector_int_to_f(VALUE obj);
@@ -160,34 +160,24 @@ VALUE rb_gsl_vector_print(VALUE obj);
 void gsl_vector_print(const gsl_vector *v, VALUE klass);
 int rbgsl_vector_equal(const gsl_vector *v1, const gsl_vector *v2, double eps);
 
-#ifndef GSL_1_2_LATER
-int gsl_matrix_complex_add(gsl_matrix_complex * a, const gsl_matrix_complex * b);
-int gsl_matrix_complex_sub(gsl_matrix_complex * a, const gsl_matrix_complex * b);
-int gsl_matrix_complex_mul_elements(gsl_matrix_complex * a, const gsl_matrix_complex * b);
-int gsl_matrix_complex_div_elements(gsl_matrix_complex * a, const gsl_matrix_complex * b);
-int gsl_matrix_complex_scale(gsl_matrix_complex * a, const gsl_complex x);
-int gsl_matrix_complex_add_constant(gsl_matrix_complex * a, const gsl_complex x);
-int gsl_matrix_complex_add_diagonal(gsl_matrix_complex * a, const gsl_complex x);
-#endif
-
 void Init_gsl_vector_init(VALUE module);
 void Init_gsl_vector_int_init(VALUE module);
 void Init_gsl_matrix_init(VALUE module);
 void Init_gsl_matrix_int_init(VALUE module);
 
-gsl_matrix* gsl_matrix_alloc_from_array_sizes(VALUE ary, 
-						     VALUE nn1, VALUE nn2);
+gsl_matrix* gsl_matrix_alloc_from_array_sizes(VALUE ary,
+                                              VALUE nn1, VALUE nn2);
 gsl_matrix* gsl_matrix_alloc_from_arrays(int argc, VALUE *argv);
 
 gsl_matrix* gsl_matrix_alloc_from_vector_sizes(VALUE ary,
-					      VALUE nn1, VALUE nn2);
+                                               VALUE nn1, VALUE nn2);
 gsl_matrix* gsl_matrix_alloc_from_vectors(int argc, VALUE *argv);
-gsl_matrix_int* gsl_matrix_int_alloc_from_array_sizes(VALUE ary, 
-						     VALUE nn1, VALUE nn2);
+gsl_matrix_int* gsl_matrix_int_alloc_from_array_sizes(VALUE ary,
+                                                      VALUE nn1, VALUE nn2);
 gsl_matrix_int* gsl_matrix_int_alloc_from_arrays(int argc, VALUE *argv);
 
 gsl_matrix_int* gsl_matrix_int_alloc_from_vector_sizes(VALUE ary,
-					      VALUE nn1, VALUE nn2);
+                                                       VALUE nn1, VALUE nn2);
 gsl_matrix_int* gsl_matrix_int_alloc_from_vectors(int argc, VALUE *argv);
 
 VALUE rb_gsl_matrix_do_something(VALUE obj, void (*f)(gsl_matrix *));
diff --git a/ext/gsl/include/rb_gsl_cheb.h b/ext/gsl_native/include/rb_gsl_cheb.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_cheb.h
rename to ext/gsl_native/include/rb_gsl_cheb.h
diff --git a/ext/gsl/include/rb_gsl_common.h b/ext/gsl_native/include/rb_gsl_common.h
similarity index 83%
rename from ext/gsl/include/rb_gsl_common.h
rename to ext/gsl_native/include/rb_gsl_common.h
index c0cffa5..39c3330 100644
--- a/ext/gsl/include/rb_gsl_common.h
+++ b/ext/gsl_native/include/rb_gsl_common.h
@@ -13,11 +13,7 @@
 #define ___RB_GSL_COMMON_H___
 
 #include <ruby.h>
-#ifdef HAVE_RUBY_IO_H
 #include <ruby/io.h>
-#else
-#include <rubyio.h>
-#endif
 
 #include <ctype.h>
 #include <gsl/gsl_errno.h>
@@ -32,7 +28,7 @@
 EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 
 #ifndef CHECK_FIXNUM
-#define CHECK_FIXNUM(x) if(!FIXNUM_P(x))rb_raise(rb_eTypeError,"Fixnum expected");
+#define CHECK_FIXNUM(x) if(!FIXNUM_P(x)) rb_raise(rb_eTypeError,"Fixnum expected");
 #endif
 
 #ifndef Need_Float
@@ -40,9 +36,9 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef Need_Float2
-#define Need_Float2(x,y) do {\
-    Need_Float(x);\
-    Need_Float(y);} while (0)
+#define Need_Float2(x,y) do { \
+    Need_Float(x); \
+    Need_Float(y); } while (0)
 #endif
 
 #ifndef COMPLEX_P
@@ -50,12 +46,12 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_RNG
-#define CHECK_RNG(x) if(!rb_obj_is_kind_of(x,cgsl_rng))\
+#define CHECK_RNG(x) if(!rb_obj_is_kind_of(x,cgsl_rng)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Rng expected)");
 #endif
 
 #ifndef CHECK_COMPLEX
-#define CHECK_COMPLEX(x) if(!rb_obj_is_kind_of(x,cgsl_complex))\
+#define CHECK_COMPLEX(x) if(!rb_obj_is_kind_of(x,cgsl_complex)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Complex expected)");
 #endif
 
@@ -64,12 +60,12 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_POLY
-#define CHECK_POLY(x) if(!rb_obj_is_kind_of(x,cgsl_poly))\
+#define CHECK_POLY(x) if(!rb_obj_is_kind_of(x,cgsl_poly)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Poly expected)");
 #endif
 
 #ifndef CHECK_POLY_INT
-#define CHECK_POLY_INT(x) if(!rb_obj_is_kind_of(x,cgsl_poly_int))\
+#define CHECK_POLY_INT(x) if(!rb_obj_is_kind_of(x,cgsl_poly_int)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Poly::Int expected)");
 #endif
 
@@ -78,7 +74,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_RATIONAL
-#define CHECK_RATIONAL(x) if(!rb_obj_is_kind_of(x,cgsl_rational))\
+#define CHECK_RATIONAL(x) if(!rb_obj_is_kind_of(x,cgsl_rational)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Rational expected)");
 #endif
 
@@ -88,7 +84,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_BLOCK
-#define CHECK_BLOCK(x) if(!rb_obj_is_kind_of(x,cgsl_block))\
+#define CHECK_BLOCK(x) if(!rb_obj_is_kind_of(x,cgsl_block)) \
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Block expected)", rb_class2name(CLASS_OF(x)));
 #endif
 #ifndef BLOCK_INT_P
@@ -96,7 +92,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_BLOCK_INT
-#define CHECK_BLOCK_INT(x) if(!rb_obj_is_kind_of(x,cgsl_block_int))\
+#define CHECK_BLOCK_INT(x) if(!rb_obj_is_kind_of(x,cgsl_block_int)) \
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Block::Int expected)", rb_class2name(CLASS_OF(x)));
 #endif
 #ifndef BLOCK_UCHAR_P
@@ -104,7 +100,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_BLOCK_UCHAR
-#define CHECK_BLOCK_UCHAR(x) if(!rb_obj_is_kind_of(x,cgsl_block_uchar))\
+#define CHECK_BLOCK_UCHAR(x) if(!rb_obj_is_kind_of(x,cgsl_block_uchar)) \
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Block::Byte expected)", rb_class2name(CLASS_OF(x)));
 #endif
 /*****/
@@ -126,27 +122,27 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef VECTOR_ROW_COL
-#define VECTOR_ROW_COL(x) ((rb_obj_is_kind_of(x,cgsl_vector_col)||rb_obj_is_kind_of(x,cgsl_vector_int_col))?cgsl_vector_col:cgsl_vector)
+#define VECTOR_ROW_COL(x) ((rb_obj_is_kind_of(x,cgsl_vector_col)||rb_obj_is_kind_of(x,cgsl_vector_int_col)) ? cgsl_vector_col : cgsl_vector)
 #endif
 
 #ifndef CHECK_VECTOR
-#define CHECK_VECTOR(x) if(!rb_obj_is_kind_of(x,cgsl_vector))\
+#define CHECK_VECTOR(x) if(!rb_obj_is_kind_of(x,cgsl_vector)) \
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector expected)", rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifdef HAVE_NARRAY_H
-#define Data_Get_Vector(obj,sval) do {\
-    if (NA_IsNArray(obj)) {\
-      /* Convert obj to GSL::Vector::View */\
-      obj = rb_gsl_na_to_gsl_vector_view_method(obj);\
-    }\
-    CHECK_VECTOR(obj);\
-    Data_Get_Struct(obj,gsl_vector,sval);\
+#define Data_Get_Vector(obj,sval) do { \
+    if (NA_IsNArray(obj)) { \
+      /* Convert obj to GSL::Vector::View */ \
+      obj = rb_gsl_na_to_gsl_vector_view_method(obj); \
+    } \
+    CHECK_VECTOR(obj); \
+    Data_Get_Struct(obj,gsl_vector,sval); \
 } while (0)
 #else
-#define Data_Get_Vector(obj,sval) do {\
-    CHECK_VECTOR(obj);\
-    Data_Get_Struct(obj,gsl_vector,sval);\
+#define Data_Get_Vector(obj,sval) do { \
+    CHECK_VECTOR(obj); \
+    Data_Get_Struct(obj,gsl_vector,sval); \
 } while (0)
 #endif
 
@@ -168,11 +164,11 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef VECTOR_INT_ROW_COL
-#define VECTOR_INT_ROW_COL(x) (VECTOR_INT_ROW_P(x)?cgsl_vector_int:cgsl_vector_int_col)
+#define VECTOR_INT_ROW_COL(x) (VECTOR_INT_ROW_P(x) ? cgsl_vector_int : cgsl_vector_int_col)
 #endif
 
 #ifndef CHECK_VECTOR_INT
-#define CHECK_VECTOR_INT(x) if(!rb_obj_is_kind_of(x,cgsl_vector_int))\
+#define CHECK_VECTOR_INT(x) if(!rb_obj_is_kind_of(x,cgsl_vector_int)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Vector::Int expected)");
 #endif
 
@@ -190,11 +186,11 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef VECTOR_COMPLEX_ROW_COL
-#define VECTOR_COMPLEX_ROW_COL(x) (VECTOR_COMPLEX_ROW_P(x)?cgsl_vector_complex:cgsl_vector_complex_col)
+#define VECTOR_COMPLEX_ROW_COL(x) (VECTOR_COMPLEX_ROW_P(x) ? cgsl_vector_complex : cgsl_vector_complex_col)
 #endif
 
 #ifndef CHECK_VECTOR_COMPLEX
-#define CHECK_VECTOR_COMPLEX(x) if(!rb_obj_is_kind_of(x,cgsl_vector_complex))\
+#define CHECK_VECTOR_COMPLEX(x) if(!rb_obj_is_kind_of(x,cgsl_vector_complex)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Vector::Complex expected)");
 #endif
 
@@ -203,13 +199,13 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_MATRIX
-#define CHECK_MATRIX(x) if(!rb_obj_is_kind_of(x,cgsl_matrix))\
+#define CHECK_MATRIX(x) if(!rb_obj_is_kind_of(x,cgsl_matrix)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Matrix expected)");
 #endif
 
-#define Data_Get_Matrix(obj,sval) do {\
-    CHECK_MATRIX(obj);\
-    Data_Get_Struct(obj,gsl_matrix,sval);\
+#define Data_Get_Matrix(obj,sval) do { \
+    CHECK_MATRIX(obj); \
+    Data_Get_Struct(obj,gsl_matrix,sval); \
 } while (0)
 
 
@@ -218,7 +214,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_MATRIX_INT
-#define CHECK_MATRIX_INT(x) if(!rb_obj_is_kind_of(x,cgsl_matrix_int))\
+#define CHECK_MATRIX_INT(x) if(!rb_obj_is_kind_of(x,cgsl_matrix_int)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Matrix::Int expected)");
 #endif
 
@@ -227,7 +223,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_MATRIX_COMPLEX
-#define CHECK_MATRIX_COMPLEX(x) if(!rb_obj_is_kind_of(x,cgsl_matrix_complex))\
+#define CHECK_MATRIX_COMPLEX(x) if(!rb_obj_is_kind_of(x,cgsl_matrix_complex)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Matrix::Complex expected)");
 #endif
 
@@ -236,7 +232,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_TENSOR
-#define CHECK_TENSOR(x) if(CLASS_OF(x)!=cgsl_tensor)\
+#define CHECK_TENSOR(x) if(CLASS_OF(x)!=cgsl_tensor) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Tensor expected)");
 #endif
 
@@ -245,7 +241,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_TENSOR_INT
-#define CHECK_TENSOR_INT(x) if(CLASS_OF(x)!=cgsl_tensor_int)\
+#define CHECK_TENSOR_INT(x) if(CLASS_OF(x)!=cgsl_tensor_int) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Tensor::Int expected)");
 #endif
 
@@ -254,7 +250,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_PERMUTATION
-#define CHECK_PERMUTATION(x) if(!rb_obj_is_kind_of(x,cgsl_permutation))\
+#define CHECK_PERMUTATION(x) if(!rb_obj_is_kind_of(x,cgsl_permutation)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Permutation expected)");
 #endif
 
@@ -263,7 +259,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_PROC
-#define CHECK_PROC(x) if(!rb_obj_is_kind_of(x,rb_cProc))\
+#define CHECK_PROC(x) if(!rb_obj_is_kind_of(x,rb_cProc)) \
     rb_raise(rb_eTypeError, "wrong argument type (Proc expected)");
 #endif
 
@@ -272,7 +268,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_FUNCTION
-#define CHECK_FUNCTION(x) if(!rb_obj_is_kind_of(x,cgsl_function))\
+#define CHECK_FUNCTION(x) if(!rb_obj_is_kind_of(x,cgsl_function)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Function expected)");
 #endif
 
@@ -281,7 +277,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_FUNCTION_FDF
-#define CHECK_FUNCTION_FDF(x) if(!rb_obj_is_kind_of(x,cgsl_function_fdf))\
+#define CHECK_FUNCTION_FDF(x) if(!rb_obj_is_kind_of(x,cgsl_function_fdf)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Function_fdf expected)");
 #endif
 
@@ -290,7 +286,7 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #endif
 
 #ifndef CHECK_HISTOGRAM
-#define CHECK_HISTOGRAM(x) if(!rb_obj_is_kind_of(x,cgsl_histogram))\
+#define CHECK_HISTOGRAM(x) if(!rb_obj_is_kind_of(x,cgsl_histogram)) \
     rb_raise(rb_eTypeError, "wrong argument type (GSL::Histogram expected)");
 #endif
 
@@ -301,13 +297,13 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
 #define RBGSL_SET_CLASS0(obj0, cls) RBASIC(obj0)->klass = cls
 #endif
 #define RBGSL_SET_CLASS(obj, cls) do { \
-  VALUE _obj_ = (obj); \
-  RBGSL_SET_CLASS0(_obj_, cls); \
+    VALUE _obj_ = (obj); \
+    RBGSL_SET_CLASS0(_obj_, cls); \
 } while (0)
 #endif
 
 void rb_gsl_error_handler(const char *reason, const char *file,
-				 int line, int gsl_errno);
+                          int line, int gsl_errno);
 
 FILE* rb_gsl_open_writefile(VALUE io, int *flag);
 FILE* rb_gsl_open_readfile(VALUE io, int *flag);
@@ -336,10 +332,6 @@ gsl_vector_int* mygsl_vector_int_down(gsl_vector_int *p);
 void mygsl_vector_int_up2(gsl_vector_int *pnew, gsl_vector_int *p);
 gsl_vector_int* mygsl_vector_int_up(gsl_vector_int *p);
 
-#ifndef GSL_1_3_LATER
-int gsl_fcmp(const double x1, const double x2, const double epsilon);
-#endif
-
 size_t count_columns(const char *str);
 char* str_scan_double(const char *str, double *val);
 char* str_scan_int(const char *str, int *val);
diff --git a/ext/gsl/include/rb_gsl_complex.h b/ext/gsl_native/include/rb_gsl_complex.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_complex.h
rename to ext/gsl_native/include/rb_gsl_complex.h
diff --git a/ext/gsl/include/rb_gsl_const.h b/ext/gsl_native/include/rb_gsl_const.h
similarity index 87%
rename from ext/gsl/include/rb_gsl_const.h
rename to ext/gsl_native/include/rb_gsl_const.h
index 359df40..c46b61b 100644
--- a/ext/gsl/include/rb_gsl_const.h
+++ b/ext/gsl_native/include/rb_gsl_const.h
@@ -14,13 +14,8 @@
 #define ___RB_GSL_CONST_H___
 
 #include "rb_gsl.h"
-#ifndef GSL_1_4_LATER
-#include <gsl/gsl_const_mks.h>
-#include <gsl/gsl_const_cgs.h>
-#else
 #include <gsl/gsl_const_mksa.h>
 #include <gsl/gsl_const_cgsm.h>
-#endif
 #include <gsl/gsl_const_num.h>
 
 EXTERN VALUE mgsl_const_mks, mgsl_const_cgs;
diff --git a/ext/gsl/include/rb_gsl_dirac.h b/ext/gsl_native/include/rb_gsl_dirac.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_dirac.h
rename to ext/gsl_native/include/rb_gsl_dirac.h
diff --git a/ext/gsl/include/rb_gsl_eigen.h b/ext/gsl_native/include/rb_gsl_eigen.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_eigen.h
rename to ext/gsl_native/include/rb_gsl_eigen.h
diff --git a/ext/gsl/include/rb_gsl_fft.h b/ext/gsl_native/include/rb_gsl_fft.h
similarity index 96%
rename from ext/gsl/include/rb_gsl_fft.h
rename to ext/gsl_native/include/rb_gsl_fft.h
index 6d3ca43..8de6449 100644
--- a/ext/gsl/include/rb_gsl_fft.h
+++ b/ext/gsl_native/include/rb_gsl_fft.h
@@ -18,9 +18,6 @@
 #include <gsl/gsl_fft_real.h>
 #include <gsl/gsl_fft_halfcomplex.h>
 #include "rb_gsl.h"
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 typedef struct
 {
diff --git a/ext/gsl/include/rb_gsl_fit.h b/ext/gsl_native/include/rb_gsl_fit.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_fit.h
rename to ext/gsl_native/include/rb_gsl_fit.h
diff --git a/ext/gsl/include/rb_gsl_function.h b/ext/gsl_native/include/rb_gsl_function.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_function.h
rename to ext/gsl_native/include/rb_gsl_function.h
diff --git a/ext/gsl/include/rb_gsl_graph.h b/ext/gsl_native/include/rb_gsl_graph.h
similarity index 98%
rename from ext/gsl/include/rb_gsl_graph.h
rename to ext/gsl_native/include/rb_gsl_graph.h
index c4a8cb7..21fffd3 100644
--- a/ext/gsl/include/rb_gsl_graph.h
+++ b/ext/gsl_native/include/rb_gsl_graph.h
@@ -58,8 +58,8 @@ typedef struct __rb_gsl_plot {
   VALUE reposition;
   VALUE blankout;
   VALUE O;
-  VALUE X, Y; 
-  
+  VALUE X, Y;
+
 } gsl_graph;
 
 gsl_graph* gsl_graph_new();
diff --git a/ext/gsl/include/rb_gsl_histogram.h b/ext/gsl_native/include/rb_gsl_histogram.h
similarity index 90%
rename from ext/gsl/include/rb_gsl_histogram.h
rename to ext/gsl_native/include/rb_gsl_histogram.h
index 83b5a6c..02a9b7b 100644
--- a/ext/gsl/include/rb_gsl_histogram.h
+++ b/ext/gsl_native/include/rb_gsl_histogram.h
@@ -29,21 +29,21 @@ typedef struct {
 } mygsl_histogram2d_view;
 
 #ifndef HISTOGRAM2D_P
-#define HISTOGRAM2D_P(x) (rb_obj_is_kind_of(x,cgsl_histogram2d)?1:0)
+#define HISTOGRAM2D_P(x) (rb_obj_is_kind_of(x,cgsl_histogram2d) ? 1 : 0)
 #endif
 
 #ifndef CHECK_HISTOGRAM2D
-#define CHECK_HISTOGRAM2D(x) if(!rb_obj_is_kind_of(x,cgsl_histogram2d))\
+#define CHECK_HISTOGRAM2D(x) if(!rb_obj_is_kind_of(x,cgsl_histogram2d)) \
     rb_raise(rb_eTypeError, "wrong type (Histogram2d expected)");
 #endif
 
 
 #ifndef HISTOGRAM3D_P
-#define HISTOGRAM3D_P(x) (rb_obj_is_kind_of(x,cgsl_histogram3d)?1:0)
+#define HISTOGRAM3D_P(x) (rb_obj_is_kind_of(x,cgsl_histogram3d) ? 1 : 0)
 #endif
 
 #ifndef CHECK_HISTOGRAM3D
-#define CHECK_HISTOGRAM3D(x) if(!rb_obj_is_kind_of(x,cgsl_histogram3d))\
+#define CHECK_HISTOGRAM3D(x) if(!rb_obj_is_kind_of(x,cgsl_histogram3d)) \
     rb_raise(rb_eTypeError, "wrong type (Histogram3d expected)");
 #endif
 
@@ -51,13 +51,13 @@ typedef struct {
 
 int
 mygsl_histogram_equal_bins_p (const gsl_histogram * h1, const gsl_histogram * h2);
-int 
+int
 mygsl_histogram_add (gsl_histogram * h1, const gsl_histogram * h2);
-int 
+int
 mygsl_histogram_sub (gsl_histogram * h1, const gsl_histogram * h2);
-int 
+int
 mygsl_histogram_mul (gsl_histogram * h1, const gsl_histogram * h2);
-int 
+int
 mygsl_histogram_div (gsl_histogram * h1, const gsl_histogram * h2);
 
 #endif
diff --git a/ext/gsl/include/rb_gsl_histogram3d.h b/ext/gsl_native/include/rb_gsl_histogram3d.h
similarity index 50%
rename from ext/gsl/include/rb_gsl_histogram3d.h
rename to ext/gsl_native/include/rb_gsl_histogram3d.h
index 862141a..5520a91 100644
--- a/ext/gsl/include/rb_gsl_histogram3d.h
+++ b/ext/gsl_native/include/rb_gsl_histogram3d.h
@@ -3,11 +3,11 @@
 
 typedef struct {
   size_t nx, ny, nz;
-  double * xrange ;
-  double * yrange ;
-  double * zrange ;
-  double * bin ;
-} mygsl_histogram3d ;
+  double * xrange;
+  double * yrange;
+  double * zrange;
+  double * bin;
+} mygsl_histogram3d;
 
 typedef struct {
   gsl_histogram2d h;
@@ -15,56 +15,56 @@ typedef struct {
 
 
 mygsl_histogram3d* mygsl_histogram3d_alloc(const size_t nx, const size_t ny,
-					   const size_t nz);
+                                           const size_t nz);
 void mygsl_histogram3d_free (mygsl_histogram3d * h);
-mygsl_histogram3d* mygsl_histogram3d_calloc_uniform(const size_t nx, 
-						    const size_t ny,
-						    const size_t nz,
-						    const double xmin,
-						    const double xmax,
-						    const double ymin,
-						    const double ymax,
-						    const double zmin,
-						    const double zmax);
-mygsl_histogram3d* mygsl_histogram3d_calloc(const size_t nx, 
-					    const size_t ny,
-					    const size_t nz);
-int mygsl_histogram3d_set_ranges_uniform (mygsl_histogram3d * h, 
-					  double xmin, double xmax,
-					  double ymin, double ymax,
-					  double zmin, double zmax);
-int mygsl_histogram3d_set_ranges (mygsl_histogram3d * h, 
-				  const double xrange[], size_t xsize,
-				  const double yrange[], size_t ysize,
-				  const double zrange[], size_t zsize);
+mygsl_histogram3d* mygsl_histogram3d_calloc_uniform(const size_t nx,
+                                                    const size_t ny,
+                                                    const size_t nz,
+                                                    const double xmin,
+                                                    const double xmax,
+                                                    const double ymin,
+                                                    const double ymax,
+                                                    const double zmin,
+                                                    const double zmax);
+mygsl_histogram3d* mygsl_histogram3d_calloc(const size_t nx,
+                                            const size_t ny,
+                                            const size_t nz);
+int mygsl_histogram3d_set_ranges_uniform (mygsl_histogram3d * h,
+                                          double xmin, double xmax,
+                                          double ymin, double ymax,
+                                          double zmin, double zmax);
+int mygsl_histogram3d_set_ranges (mygsl_histogram3d * h,
+                                  const double xrange[], size_t xsize,
+                                  const double yrange[], size_t ysize,
+                                  const double zrange[], size_t zsize);
 int mygsl_histogram3d_memcpy(mygsl_histogram3d * dest, const mygsl_histogram3d * src);
 mygsl_histogram3d* mygsl_histogram3d_clone(const mygsl_histogram3d * src);
 int mygsl_histogram3d_fread(FILE * stream, mygsl_histogram3d * h);
 int mygsl_histogram3d_fwrite(FILE * stream, const mygsl_histogram3d * h);
 int mygsl_histogram3d_increment(mygsl_histogram3d * h, double x, double y, double z);
-int mygsl_histogram3d_accumulate (mygsl_histogram3d * h, 
-				  double x, double y, double z, double weight);
-int mygsl_histogram3d_increment2(mygsl_histogram3d * h, 
-				 double x, double y, double z);
-int mygsl_histogram3d_accumulate2(mygsl_histogram3d * h, 
-				  double x, double y, double z, double weight);
-double mygsl_histogram3d_get (const mygsl_histogram3d * h, const size_t i, 
-			      const size_t j, const size_t k);
-int mygsl_histogram3d_get_xrange(const mygsl_histogram3d * h, const size_t i,  
-				 double *xlower, double *xupper);
-int mygsl_histogram3d_get_yrange(const mygsl_histogram3d * h, const size_t j,  
-				 double *ylower, double *yupper);
-int mygsl_histogram3d_get_zrange(const mygsl_histogram3d * h, const size_t k,  
-				 double *zlower, double *zupper);
+int mygsl_histogram3d_accumulate (mygsl_histogram3d * h,
+                                  double x, double y, double z, double weight);
+int mygsl_histogram3d_increment2(mygsl_histogram3d * h,
+                                 double x, double y, double z);
+int mygsl_histogram3d_accumulate2(mygsl_histogram3d * h,
+                                  double x, double y, double z, double weight);
+double mygsl_histogram3d_get (const mygsl_histogram3d * h, const size_t i,
+                              const size_t j, const size_t k);
+int mygsl_histogram3d_get_xrange(const mygsl_histogram3d * h, const size_t i,
+                                 double *xlower, double *xupper);
+int mygsl_histogram3d_get_yrange(const mygsl_histogram3d * h, const size_t j,
+                                 double *ylower, double *yupper);
+int mygsl_histogram3d_get_zrange(const mygsl_histogram3d * h, const size_t k,
+                                 double *zlower, double *zupper);
 int mygsl_histogram3d_find (const mygsl_histogram3d * h,
-			    const double x, const double y, const double z,
-			    size_t * i, size_t * j, size_t *k);
+                            const double x, const double y, const double z,
+                            size_t * i, size_t * j, size_t *k);
 gsl_histogram2d* mygsl_histogram3d_xyproject(const mygsl_histogram3d * h3,
-					     size_t kstart, size_t kend);
+                                             size_t kstart, size_t kend);
 gsl_histogram2d* mygsl_histogram3d_xzproject(const mygsl_histogram3d * h3,
-					     size_t jstart, size_t jend);
+                                             size_t jstart, size_t jend);
 gsl_histogram2d* mygsl_histogram3d_yzproject(const mygsl_histogram3d * h3,
-					     size_t istart, size_t iend);
+                                             size_t istart, size_t iend);
 int mygsl_histogram3d_scale(mygsl_histogram3d * h, double scale);
 int mygsl_histogram3d_shift(mygsl_histogram3d * h, double shift);
 double mygsl_histogram3d_xmax(const mygsl_histogram3d * h);
@@ -74,11 +74,11 @@ double mygsl_histogram3d_ymin(const mygsl_histogram3d * h);
 double mygsl_histogram3d_zmax(const mygsl_histogram3d * h);
 double mygsl_histogram3d_zmin(const mygsl_histogram3d * h);
 double mygsl_histogram3d_max_val(const mygsl_histogram3d * h);
-void mygsl_histogram3d_max_bin(const mygsl_histogram3d * h, 
-			       size_t *imax_out, size_t *jmax_out, size_t *kmax_out);
+void mygsl_histogram3d_max_bin(const mygsl_histogram3d * h,
+                               size_t *imax_out, size_t *jmax_out, size_t *kmax_out);
 double mygsl_histogram3d_min_val(const mygsl_histogram3d * h);
-void mygsl_histogram3d_min_bin(const mygsl_histogram3d * h, 
-			       size_t *imin_out, size_t *jmin_out, size_t *kmin_out);
+void mygsl_histogram3d_min_bin(const mygsl_histogram3d * h,
+                               size_t *imin_out, size_t *jmin_out, size_t *kmin_out);
 double mygsl_histogram3d_sum (const mygsl_histogram3d * h);
 double mygsl_histogram3d_xmean (const mygsl_histogram3d * h);
 double mygsl_histogram3d_ymean (const mygsl_histogram3d * h);
@@ -88,7 +88,7 @@ double mygsl_histogram3d_ysigma(const mygsl_histogram3d * h);
 double mygsl_histogram3d_zsigma(const mygsl_histogram3d * h);
 void mygsl_histogram3d_reset(mygsl_histogram3d * h);
 int mygsl_histogram3d_equal_bins_p(const mygsl_histogram3d * h1,
-				   const mygsl_histogram3d * h2);
+                                   const mygsl_histogram3d * h2);
 int mygsl_histogram3d_add(mygsl_histogram3d * h1, const mygsl_histogram3d * h2);
 int mygsl_histogram3d_sub(mygsl_histogram3d * h1, const mygsl_histogram3d * h2);
 int mygsl_histogram3d_mul(mygsl_histogram3d * h1, const mygsl_histogram3d * h2);
diff --git a/ext/gsl/include/rb_gsl_integration.h b/ext/gsl_native/include/rb_gsl_integration.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_integration.h
rename to ext/gsl_native/include/rb_gsl_integration.h
diff --git a/ext/gsl/include/rb_gsl_interp.h b/ext/gsl_native/include/rb_gsl_interp.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_interp.h
rename to ext/gsl_native/include/rb_gsl_interp.h
diff --git a/ext/gsl/include/rb_gsl_linalg.h b/ext/gsl_native/include/rb_gsl_linalg.h
similarity index 95%
rename from ext/gsl/include/rb_gsl_linalg.h
rename to ext/gsl_native/include/rb_gsl_linalg.h
index 3d0e618..02e1560 100644
--- a/ext/gsl/include/rb_gsl_linalg.h
+++ b/ext/gsl_native/include/rb_gsl_linalg.h
@@ -14,7 +14,6 @@
 
 #include <gsl/gsl_linalg.h>
 #include <gsl/gsl_math.h>
-#include "rb_gsl_with_narray.h"
 
 VALUE rb_gsl_linalg_complex_LU_decomp(int argc, VALUE *argv, VALUE obj);
 VALUE rb_gsl_linalg_complex_LU_decomp2(int argc, VALUE *argv, VALUE obj);
diff --git a/ext/gsl/include/rb_gsl_math.h b/ext/gsl_native/include/rb_gsl_math.h
similarity index 85%
rename from ext/gsl/include/rb_gsl_math.h
rename to ext/gsl_native/include/rb_gsl_math.h
index f305cfe..44d34f1 100644
--- a/ext/gsl/include/rb_gsl_math.h
+++ b/ext/gsl_native/include/rb_gsl_math.h
@@ -15,10 +15,6 @@
 
 #include "rb_gsl.h"
 
-#ifndef GSL_1_3_LATER
-int gsl_fcmp (const double x1, const double x2, const double epsilon);
-#endif
-
 VALUE rb_gsl_math_complex_eval(gsl_complex (*func)(gsl_complex), VALUE obj);
 
 #endif
diff --git a/ext/gsl/include/rb_gsl_odeiv.h b/ext/gsl_native/include/rb_gsl_odeiv.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_odeiv.h
rename to ext/gsl_native/include/rb_gsl_odeiv.h
diff --git a/ext/gsl/include/rb_gsl_poly.h b/ext/gsl_native/include/rb_gsl_poly.h
similarity index 95%
rename from ext/gsl/include/rb_gsl_poly.h
rename to ext/gsl_native/include/rb_gsl_poly.h
index 41f2f95..02422ca 100644
--- a/ext/gsl/include/rb_gsl_poly.h
+++ b/ext/gsl_native/include/rb_gsl_poly.h
@@ -27,7 +27,7 @@ EXTERN VALUE cgsl_rational;
 typedef gsl_vector gsl_poly;
 typedef gsl_vector_int gsl_poly_int;
 /*
-typedef struct ___gsl_rational 
+typedef struct ___gsl_rational
 {
   VALUE num, den;
   gsl_poly *pnum;
@@ -36,7 +36,7 @@ typedef struct ___gsl_rational
 */
 
 int gsl_poly_conv(const double *a, size_t na, const double *b, size_t nb,
-		  double *c, size_t *nc);
+                  double *c, size_t *nc);
 
 gsl_vector* gsl_poly_deconv_vector(const gsl_vector *c, const gsl_vector *a, gsl_vector **r);
 gsl_vector* gsl_poly_deriv(const gsl_vector *v);
@@ -51,7 +51,7 @@ VALUE rb_gsl_poly_complex_solve2(int argc, VALUE *argv, VALUE obj);
 
 
 int gsl_poly_int_conv(const int *a, size_t na, const int *b, size_t nb,
-		  int *c, size_t *nc);
+                      int *c, size_t *nc);
 
 gsl_vector_int* gsl_poly_int_deconv_vector(const gsl_vector_int *c, const gsl_vector_int *a, gsl_vector_int **r);
 gsl_vector_int* gsl_poly_int_deriv(const gsl_vector_int *v);
diff --git a/ext/gsl/include/rb_gsl_rational.h b/ext/gsl_native/include/rb_gsl_rational.h
similarity index 96%
rename from ext/gsl/include/rb_gsl_rational.h
rename to ext/gsl_native/include/rb_gsl_rational.h
index 03d89b8..6e00e3b 100644
--- a/ext/gsl/include/rb_gsl_rational.h
+++ b/ext/gsl_native/include/rb_gsl_rational.h
@@ -15,7 +15,7 @@
 
 #include "rb_gsl_poly.h"
 
-typedef struct ___gsl_rational 
+typedef struct ___gsl_rational
 {
   VALUE num, den;
   gsl_poly *pnum;
diff --git a/ext/gsl/include/rb_gsl_rng.h b/ext/gsl_native/include/rb_gsl_rng.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_rng.h
rename to ext/gsl_native/include/rb_gsl_rng.h
diff --git a/ext/gsl/include/rb_gsl_root.h b/ext/gsl_native/include/rb_gsl_root.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_root.h
rename to ext/gsl_native/include/rb_gsl_root.h
diff --git a/ext/gsl/include/rb_gsl_sf.h b/ext/gsl_native/include/rb_gsl_sf.h
similarity index 70%
rename from ext/gsl/include/rb_gsl_sf.h
rename to ext/gsl_native/include/rb_gsl_sf.h
index 941b68d..9a61cec 100644
--- a/ext/gsl/include/rb_gsl_sf.h
+++ b/ext/gsl_native/include/rb_gsl_sf.h
@@ -13,6 +13,7 @@
 
 #include <gsl/gsl_sf.h>
 #include <gsl/gsl_complex.h>
+#include <gsl/gsl_sf_mathieu.h>
 #include "rb_gsl.h"
 
 EXTERN VALUE cgsl_sf_result, cgsl_sf_result_e10;
@@ -23,56 +24,56 @@ VALUE rb_gsl_sf_eval1(double (*func)(double), VALUE argv);
 VALUE rb_gsl_sf_eval_int_double(double (*func)(int, double), VALUE jj, VALUE argv);
 VALUE rb_gsl_sf_eval_double_double(double (*func)(double, double), VALUE ff, VALUE argv);
 VALUE rb_gsl_sf_eval1_uint(double (*func)(unsigned int), VALUE argv);
-VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VALUE m);;
-VALUE rb_gsl_sf_eval_int_double_double(double (*func)(int, double, double), VALUE jj, 
-				       VALUE ff, VALUE argv);
+VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VALUE m);
+VALUE rb_gsl_sf_eval_int_double_double(double (*func)(int, double, double), VALUE jj,
+                                       VALUE ff, VALUE argv);
 VALUE rb_gsl_sf_eval_int_int_double(double (*func)(int, int, double), VALUE jj,
-				    VALUE jj2, VALUE argv);
-VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double), 
-					   VALUE ff, VALUE ff2, VALUE argv);
-VALUE rb_gsl_sf_eval_double4(double (*func)(double, double, double, double), 
-			     VALUE ff, VALUE ff2, VALUE ff3, VALUE argv);
+                                    VALUE jj2, VALUE argv);
+VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double),
+                             VALUE ff, VALUE ff2, VALUE argv);
+VALUE rb_gsl_sf_eval_double4(double (*func)(double, double, double, double),
+                             VALUE ff, VALUE ff2, VALUE ff3, VALUE argv);
 VALUE rb_gsl_sf_eval_double_int(double (*func)(double, int), VALUE argv, VALUE jj);
 VALUE rb_gsl_sf_eval1_int(double (*func)(int), VALUE argv);
 VALUE rb_gsl_sf_eval_e(int (*func)(double, gsl_sf_result*), VALUE x);
-VALUE rb_gsl_sf_eval_e_int_double(int (*func)(int, double, gsl_sf_result*), 
-				  VALUE n, VALUE x);
-VALUE rb_gsl_sf_eval_e_int_int_double(int (*func)(int, int, double, gsl_sf_result*), 
-				      VALUE n1, VALUE n2, VALUE x);
-VALUE rb_gsl_sf_eval_e_double2(int (*func)(double, double, gsl_sf_result*), 
-			       VALUE x1, VALUE x2);
+VALUE rb_gsl_sf_eval_e_int_double(int (*func)(int, double, gsl_sf_result*),
+                                  VALUE n, VALUE x);
+VALUE rb_gsl_sf_eval_e_int_int_double(int (*func)(int, int, double, gsl_sf_result*),
+                                      VALUE n1, VALUE n2, VALUE x);
+VALUE rb_gsl_sf_eval_e_double2(int (*func)(double, double, gsl_sf_result*),
+                               VALUE x1, VALUE x2);
 VALUE rb_gsl_sf_eval_e_uint(int (*func)(unsigned int, gsl_sf_result*), VALUE x);
-VALUE rb_gsl_sf_eval_e_int_uint(int (*func)(int, unsigned int, gsl_sf_result*), 
-				VALUE n, VALUE x);
-VALUE rb_gsl_sf_eval_e_double_uint(int (*func)(double, unsigned int, gsl_sf_result*), 
-				   VALUE y, VALUE x);
-VALUE rb_gsl_sf_eval_e_m(int (*func)(double, gsl_mode_t, gsl_sf_result*), 
-			 VALUE x, VALUE m);
-VALUE rb_gsl_sf_eval_e_double2_m(int (*func)(double, double, gsl_mode_t, gsl_sf_result*), 
-				 VALUE x1, VALUE x2, VALUE m);
-VALUE rb_gsl_sf_eval_e_double3_m(int (*func)(double, double, double, gsl_mode_t, gsl_sf_result*), 
-				 VALUE x1, VALUE x2, VALUE x3, VALUE m);
-VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t), 
-			       VALUE argv, VALUE x2, VALUE m);
-VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t), 
-			       VALUE argv, VALUE x2, VALUE x3, VALUE m);
+VALUE rb_gsl_sf_eval_e_int_uint(int (*func)(int, unsigned int, gsl_sf_result*),
+                                VALUE n, VALUE x);
+VALUE rb_gsl_sf_eval_e_double_uint(int (*func)(double, unsigned int, gsl_sf_result*),
+                                   VALUE y, VALUE x);
+VALUE rb_gsl_sf_eval_e_m(int (*func)(double, gsl_mode_t, gsl_sf_result*),
+                         VALUE x, VALUE m);
+VALUE rb_gsl_sf_eval_e_double2_m(int (*func)(double, double, gsl_mode_t, gsl_sf_result*),
+                                 VALUE x1, VALUE x2, VALUE m);
+VALUE rb_gsl_sf_eval_e_double3_m(int (*func)(double, double, double, gsl_mode_t, gsl_sf_result*),
+                                 VALUE x1, VALUE x2, VALUE x3, VALUE m);
+VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t),
+                               VALUE argv, VALUE x2, VALUE m);
+VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t),
+                               VALUE argv, VALUE x2, VALUE x3, VALUE m);
 
-VALUE rb_gsl_sf_eval_e_double4_m(int (*func)(double, double, double, double, gsl_mode_t, gsl_sf_result*), 
-				 VALUE x1, VALUE x2, VALUE x3, VALUE x4, VALUE m);
+VALUE rb_gsl_sf_eval_e_double4_m(int (*func)(double, double, double, double, gsl_mode_t, gsl_sf_result*),
+                                 VALUE x1, VALUE x2, VALUE x3, VALUE x4, VALUE m);
 
 VALUE rb_gsl_sf_eval_e_int(int (*func)(int, gsl_sf_result*), VALUE x);
-VALUE rb_gsl_sf_eval_e_double3(int (*func)(double, double, double, gsl_sf_result*), 
-			      VALUE x1, VALUE x2, VALUE x3);
-VALUE rb_gsl_sf_eval_e_int_double2(int (*func)(int, double, double, gsl_sf_result*), 
-				   VALUE n, VALUE x1, VALUE x2);
-VALUE rb_gsl_sf_eval_e_double2(int (*func)(double, double, gsl_sf_result*), 
-			       VALUE x1, VALUE x2);
+VALUE rb_gsl_sf_eval_e_double3(int (*func)(double, double, double, gsl_sf_result*),
+                               VALUE x1, VALUE x2, VALUE x3);
+VALUE rb_gsl_sf_eval_e_int_double2(int (*func)(int, double, double, gsl_sf_result*),
+                                   VALUE n, VALUE x1, VALUE x2);
+VALUE rb_gsl_sf_eval_e_double2(int (*func)(double, double, gsl_sf_result*),
+                               VALUE x1, VALUE x2);
 
 VALUE eval_sf(double (*func)(double, gsl_mode_t), VALUE argv);
 
 VALUE rb_gsl_sf_eval_double4_m(double (*func)(double, double, double, double,
-					      gsl_mode_t), 
-			       VALUE argv, VALUE x2, VALUE x3, VALUE x4, VALUE m);
+                                              gsl_mode_t),
+                               VALUE argv, VALUE x2, VALUE x3, VALUE x4, VALUE m);
 
 VALUE rb_gsl_sf_eval_complex(double (*f)(double), VALUE obj);
 
@@ -104,11 +105,6 @@ void Init_gsl_sf_synchrotron(VALUE module);
 void Init_gsl_sf_transport(VALUE module);
 void Init_gsl_sf_trigonometric(VALUE module);
 void Init_gsl_sf_zeta(VALUE module);
-
-
-#ifdef GSL_1_9_LATER
-#include <gsl/gsl_sf_mathieu.h>
 void Init_sf_mathieu(VALUE module);
-#endif
 
 #endif
diff --git a/ext/gsl/include/rb_gsl_statistics.h b/ext/gsl_native/include/rb_gsl_statistics.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_statistics.h
rename to ext/gsl_native/include/rb_gsl_statistics.h
diff --git a/ext/gsl/include/rb_gsl_tensor.h b/ext/gsl_native/include/rb_gsl_tensor.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_tensor.h
rename to ext/gsl_native/include/rb_gsl_tensor.h
diff --git a/ext/gsl/include/rb_gsl_with_narray.h b/ext/gsl_native/include/rb_gsl_with_narray.h
similarity index 100%
rename from ext/gsl/include/rb_gsl_with_narray.h
rename to ext/gsl_native/include/rb_gsl_with_narray.h
diff --git a/ext/gsl/include/templates_off.h b/ext/gsl_native/include/templates_off.h
similarity index 100%
rename from ext/gsl/include/templates_off.h
rename to ext/gsl_native/include/templates_off.h
diff --git a/ext/gsl/include/templates_on.h b/ext/gsl_native/include/templates_on.h
similarity index 99%
rename from ext/gsl/include/templates_on.h
rename to ext/gsl_native/include/templates_on.h
index c2578a4..4db23e9 100644
--- a/ext/gsl/include/templates_on.h
+++ b/ext/gsl_native/include/templates_on.h
@@ -173,7 +173,7 @@
 #error unknown BASE_ directive in source.h
 #endif
 
-#define CONCAT2x(a,b) a ## _ ## b 
+#define CONCAT2x(a,b) a ## _ ## b
 #define CONCAT2(a,b) CONCAT2x(a,b)
 #define CONCAT3x(a,b,c) a ## _ ## b ## _ ## c
 #define CONCAT3(a,b,c) CONCAT3x(a,b,c)
diff --git a/ext/gsl/integration.c b/ext/gsl_native/integration.c
similarity index 81%
rename from ext/gsl/integration.c
rename to ext/gsl_native/integration.c
index b45a04c..8ad1a3f 100644
--- a/ext/gsl/integration.c
+++ b/ext/gsl_native/integration.c
@@ -15,10 +15,10 @@
 #include "include/rb_gsl_common.h"
 
 #ifndef CHECK_WORKSPACE
-#define CHECK_WORKSPACE(x) if(CLASS_OF(x)!=cgsl_integration_workspace)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (Integration::Workspace expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_WORKSPACE(x) if(CLASS_OF(x)!=cgsl_integration_workspace) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (Integration::Workspace expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #define EPSABS_DEFAULT 0.0
@@ -30,26 +30,24 @@ static VALUE cgsl_integration_qaws_table, cgsl_integration_qawo_table;
 
 static VALUE cgsl_integration_workspace;
 
-#ifdef GSL_1_14_LATER
 static VALUE cgsl_integration_glfixed_table;
-#endif
 
 static int get_a_b(int argc, VALUE *argv, int argstart, double *a, double *b);
-static int get_epsabs_epsrel(int argc, VALUE *argv, int argstart, 
-			     double *epsabs, double *epsrel);
+static int get_epsabs_epsrel(int argc, VALUE *argv, int argstart,
+                             double *epsabs, double *epsrel);
 static int get_a_b_epsabs_epsrel(int argc, VALUE *argv, int argstart,
-				  double *a, double *b, double *epsabs,
-				  double *epsrel);
+                                 double *a, double *b, double *epsabs,
+                                 double *epsrel);
 static int get_limit_key_workspace(int argc, VALUE *argv, int argstart,
-				   size_t *limit, int *key, 
-				   gsl_integration_workspace **w);
+                                   size_t *limit, int *key,
+                                   gsl_integration_workspace **w);
 static int get_limit_workspace(int argc, VALUE *argv, int argstart,
-				   size_t *limit, 
-			       gsl_integration_workspace **w);
+                               size_t *limit,
+                               gsl_integration_workspace **w);
 static int get_epsabs_epsrel_limit_workspace(int argc, VALUE *argv, int argstart,
-					     double *epsabs, double *epsrel,
-					     size_t *limit,
-					     gsl_integration_workspace **w);
+                                             double *epsabs, double *epsrel,
+                                             size_t *limit,
+                                             gsl_integration_workspace **w);
 
 static int get_a_b(int argc, VALUE *argv, int argstart, double *a, double *b)
 {
@@ -74,8 +72,8 @@ static int get_a_b(int argc, VALUE *argv, int argstart, double *a, double *b)
   return itmp;
 }
 
-static int get_epsabs_epsrel(int argc, VALUE *argv, int argstart, 
-			     double *epsabs, double *epsrel)
+static int get_epsabs_epsrel(int argc, VALUE *argv, int argstart,
+                             double *epsabs, double *epsrel)
 {
   int itmp;
   VALUE aa, bb;
@@ -94,13 +92,13 @@ static int get_epsabs_epsrel(int argc, VALUE *argv, int argstart,
     *epsabs = NUM2DBL(argv[argstart]);
     *epsrel = NUM2DBL(argv[argstart+1]);
     itmp = 2;
-  } 
-  return  argstart + itmp;
+  }
+  return argstart + itmp;
 }
 
 static int get_a_b_epsabs_epsrel(int argc, VALUE *argv, int argstart,
-				  double *a, double *b, double *epsabs,
-				  double *epsrel)
+                                 double *a, double *b, double *epsabs,
+                                 double *epsrel)
 {
   int itmp;
   *epsabs = EPSABS_DEFAULT;
@@ -111,8 +109,8 @@ static int get_a_b_epsabs_epsrel(int argc, VALUE *argv, int argstart,
 }
 
 static int get_limit_key_workspace(int argc, VALUE *argv, int argstart,
-				   size_t *limit, int *key, 
-				   gsl_integration_workspace **w)
+                                   size_t *limit, int *key,
+                                   gsl_integration_workspace **w)
 {
   int flag = 0;
   switch (argc-argstart) {
@@ -163,8 +161,8 @@ static int get_limit_key_workspace(int argc, VALUE *argv, int argstart,
 }
 
 static int get_limit_workspace(int argc, VALUE *argv, int argstart,
-				   size_t *limit, 
-				   gsl_integration_workspace **w)
+                               size_t *limit,
+                               gsl_integration_workspace **w)
 {
   int flag = 0;
 
@@ -207,9 +205,9 @@ static int get_limit_workspace(int argc, VALUE *argv, int argstart,
 }
 
 static int get_epsabs_epsrel_limit_workspace(int argc, VALUE *argv, int argstart,
-					     double *epsabs, double *epsrel,
-					     size_t *limit,
-					     gsl_integration_workspace **w)
+                                             double *epsabs, double *epsrel,
+                                             size_t *limit,
+                                             gsl_integration_workspace **w)
 {
   int flag = 0, itmp;
   itmp = argstart;
@@ -269,9 +267,8 @@ static VALUE rb_gsl_integration_qng(int argc, VALUE *argv, VALUE obj)
   // local variable 'itmp' declared and set, but never used
   //int itmp;
 
-  if (argc < 1) rb_raise(rb_eArgError, 
-			 "wrong number of arguments (%d for >= 1)", argc);
-
+  if (argc < 1) rb_raise(rb_eArgError,
+                         "wrong number of arguments (%d for >= 1)", argc);
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     CHECK_FUNCTION(argv[0]);
@@ -283,12 +280,12 @@ static VALUE rb_gsl_integration_qng(int argc, VALUE *argv, VALUE obj)
     Data_Get_Struct(obj, gsl_function, F);
     break;
   }
-  status = gsl_integration_qng(F, a, b, epsabs, epsrel, 
-			       &result, &abserr, &neval);
-  
+  status = gsl_integration_qng(F, a, b, epsabs, epsrel,
+                               &result, &abserr, &neval);
+
   return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
-		     INT2FIX(neval), INT2FIX(status));
-}			    
+                     INT2FIX(neval), INT2FIX(status));
+}
 
 static VALUE rb_gsl_integration_qag(int argc, VALUE *argv, VALUE obj)
 {
@@ -298,9 +295,8 @@ static VALUE rb_gsl_integration_qag(int argc, VALUE *argv, VALUE obj)
   gsl_function *F = NULL;
   gsl_integration_workspace *w = NULL;
   int key = KEY_DEFAULT, status, intervals, itmp, flag = 0;
-  if (argc < 1) rb_raise(rb_eArgError, 
-			 "wrong number of arguments (%d for >= 1)", argc);
-
+  if (argc < 1) rb_raise(rb_eArgError,
+                         "wrong number of arguments (%d for >= 1)", argc);
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     CHECK_FUNCTION(argv[0]);
@@ -325,26 +321,26 @@ static VALUE rb_gsl_integration_qag(int argc, VALUE *argv, VALUE obj)
   default:
     if (argc == 2) {
       if (FIXNUM_P(argv[1])) {
-	key = FIX2INT(argv[1]);
-	w = gsl_integration_workspace_alloc(limit);
-	flag = 1;
+        key = FIX2INT(argv[1]);
+        w = gsl_integration_workspace_alloc(limit);
+        flag = 1;
       } else if (rb_obj_is_kind_of(argv[1], cgsl_integration_workspace)) {
-	Data_Get_Struct(argv[1], gsl_integration_workspace, w);
-	flag = 0;
+        Data_Get_Struct(argv[1], gsl_integration_workspace, w);
+        flag = 0;
       } else {
-	rb_raise(rb_eTypeError, "Key or Workspace expected");
+        rb_raise(rb_eTypeError, "Key or Workspace expected");
       }
       itmp = get_a_b(argc, argv, 0, &a, &b);
     } else if (argc == 3) {
       if (FIXNUM_P(argv[2])) {
-	key = FIX2INT(argv[2]);
-	w = gsl_integration_workspace_alloc(limit);
-	flag = 1;
+        key = FIX2INT(argv[2]);
+        w = gsl_integration_workspace_alloc(limit);
+        flag = 1;
       } else if (rb_obj_is_kind_of(argv[2], cgsl_integration_workspace)) {
-	Data_Get_Struct(argv[2], gsl_integration_workspace, w);
-	flag = 0;
+        Data_Get_Struct(argv[2], gsl_integration_workspace, w);
+        flag = 0;
       } else {
-	rb_raise(rb_eTypeError, "Key or Workspace expected");
+        rb_raise(rb_eTypeError, "Key or Workspace expected");
       }
       itmp = get_a_b(argc, argv, 0, &a, &b);
     } else {
@@ -354,14 +350,13 @@ static VALUE rb_gsl_integration_qag(int argc, VALUE *argv, VALUE obj)
     Data_Get_Struct(obj, gsl_function, F);
     break;
   }
-  status = gsl_integration_qag(F, a, b, epsabs, epsrel, limit, key, w, 
-			       &result, &abserr);
+  status = gsl_integration_qag(F, a, b, epsabs, epsrel, limit, key, w,
+                               &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
-
-  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), 
-		     INT2FIX(intervals), INT2FIX(status));
-}			    
+  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
+                     INT2FIX(intervals), INT2FIX(status));
+}
 
 static VALUE rb_gsl_integration_qags(int argc, VALUE *argv, VALUE obj)
 {
@@ -383,16 +378,15 @@ static VALUE rb_gsl_integration_qags(int argc, VALUE *argv, VALUE obj)
     break;
   }
   flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
-					   &limit, &w);
- 
-  status = gsl_integration_qags(F, a, b, epsabs, epsrel, limit, w, 
-				&result, &abserr);
+                                           &limit, &w);
+
+  status = gsl_integration_qags(F, a, b, epsabs, epsrel, limit, w,
+                                &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
-
-  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), 
-      INT2FIX(intervals), INT2FIX(status));
-}			    
+  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
+                     INT2FIX(intervals), INT2FIX(status));
+}
 
 static VALUE rb_gsl_integration_qagp(int argc, VALUE *argv, VALUE obj)
 {
@@ -423,17 +417,16 @@ static VALUE rb_gsl_integration_qagp(int argc, VALUE *argv, VALUE obj)
   }
   itmp += 1;
   flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
-					   &limit, &w);
+                                           &limit, &w);
 
-  status = gsl_integration_qagp(F, v->data, v->size, epsabs, epsrel, limit, w, 
-				&result, &abserr);
+  status = gsl_integration_qagp(F, v->data, v->size, epsabs, epsrel, limit, w,
+                                &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
   if (flag2 == 1) gsl_vector_free(v);
-
-  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), 
-		     INT2FIX(intervals), INT2FIX(status));
-}			    
+  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
+                     INT2FIX(intervals), INT2FIX(status));
+}
 
 /* (-infty --- +infty) */
 static VALUE rb_gsl_integration_qagi(int argc, VALUE *argv, VALUE obj)
@@ -456,15 +449,14 @@ static VALUE rb_gsl_integration_qagi(int argc, VALUE *argv, VALUE obj)
     break;
   }
   flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
-					   &limit, &w);
-  status = gsl_integration_qagi(F, epsabs, epsrel, limit, w, 
-				&result, &abserr);
+                                           &limit, &w);
+  status = gsl_integration_qagi(F, epsabs, epsrel, limit, w,
+                                &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
-
-  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), 
-		    INT2FIX(intervals), INT2FIX(status));
-}			    
+  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
+                     INT2FIX(intervals), INT2FIX(status));
+}
 
 /* (a --- +infty) */
 static VALUE rb_gsl_integration_qagiu(int argc, VALUE *argv, VALUE obj)
@@ -490,15 +482,14 @@ static VALUE rb_gsl_integration_qagiu(int argc, VALUE *argv, VALUE obj)
   a = NUM2DBL(argv[itmp]);
   itmp += 1;
   flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
-					   &limit, &w);
-  status = gsl_integration_qagiu(F, a, epsabs, epsrel, limit, w, 
-				&result, &abserr);
+                                           &limit, &w);
+  status = gsl_integration_qagiu(F, a, epsabs, epsrel, limit, w,
+                                 &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
-
-  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), 
-		     INT2FIX(intervals), INT2FIX(status));
-}			    
+  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
+                     INT2FIX(intervals), INT2FIX(status));
+}
 
 /* (-infty --- b) */
 static VALUE rb_gsl_integration_qagil(int argc, VALUE *argv, VALUE obj)
@@ -523,17 +514,16 @@ static VALUE rb_gsl_integration_qagil(int argc, VALUE *argv, VALUE obj)
   Need_Float(argv[itmp]);
   b = NUM2DBL(argv[itmp]);
   flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel,
-					   &limit, &w);
+                                           &limit, &w);
   Data_Get_Struct(obj, gsl_function, F);
 
-  status = gsl_integration_qagil(F, b, epsabs, epsrel, limit, w, 
-				&result, &abserr);
+  status = gsl_integration_qagil(F, b, epsabs, epsrel, limit, w,
+                                 &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
-
-  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), 
-		     INT2FIX(intervals), INT2FIX(status));
-}			    
+  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
+                     INT2FIX(intervals), INT2FIX(status));
+}
 
 static VALUE rb_gsl_integration_qawc(int argc, VALUE *argv, VALUE obj)
 {
@@ -559,14 +549,13 @@ static VALUE rb_gsl_integration_qawc(int argc, VALUE *argv, VALUE obj)
   Need_Float(argv[itmp]);
   c = NUM2DBL(argv[itmp]);
   flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel,
-					   &limit, &w);
+                                           &limit, &w);
   status = gsl_integration_qawc(F, a, b, c, epsabs, epsrel, limit, w, &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
-
   return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals),
-		     INT2FIX(status));
-}			    
+                     INT2FIX(status));
+}
 
 VALUE rb_gsl_integration_qaws_table_alloc(int argc, VALUE *argv, VALUE klass)
 {
@@ -587,7 +576,7 @@ VALUE rb_gsl_integration_qaws_table_alloc(int argc, VALUE *argv, VALUE klass)
     nu = argv[3];
   }
   t = gsl_integration_qaws_table_alloc(NUM2DBL(alpha), NUM2DBL(beta),
-				       FIX2INT(mu), FIX2INT(nu));
+                                       FIX2INT(mu), FIX2INT(nu));
   return Data_Wrap_Struct(klass, 0, gsl_integration_qaws_table_free, t);
 }
 
@@ -614,7 +603,6 @@ static VALUE rb_gsl_integration_qaws_table_set(int argc, VALUE *argv, VALUE obj)
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
   }
-
   gsl_integration_qaws_table_set(t, alpha, beta, mu, nu);
   return obj;
 }
@@ -637,8 +625,8 @@ static VALUE rb_gsl_ary_to_integration_qaws_table(VALUE ary)
 {
   gsl_integration_qaws_table *t = NULL;
   t = make_qaws_table(ary);
-  return Data_Wrap_Struct(cgsl_integration_qaws_table, 
-			  0, gsl_integration_qaws_table_free, t);
+  return Data_Wrap_Struct(cgsl_integration_qaws_table,
+                          0, gsl_integration_qaws_table_free, t);
 }
 
 static gsl_integration_qaws_table* make_qaws_table(VALUE ary)
@@ -682,33 +670,30 @@ static VALUE rb_gsl_integration_qaws(int argc, VALUE *argv, VALUE obj)
   } else {
     flagt = 0;
     if (!rb_obj_is_kind_of(argv[itmp], cgsl_integration_qaws_table))
-	rb_raise(rb_eTypeError, "Integration::QAWS_Table expected");
-
+      rb_raise(rb_eTypeError, "Integration::QAWS_Table expected");
     Data_Get_Struct(argv[itmp], gsl_integration_qaws_table, t);
   }
   flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel,
-					   &limit, &w);
+                                           &limit, &w);
   status = gsl_integration_qaws(F, a, b, t, epsabs, epsrel, limit, w, &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
   if (flagt == 1) gsl_integration_qaws_table_free(t);
-
   return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals),
-		     INT2FIX(status));
-}			    
+                     INT2FIX(status));
+}
 
 static gsl_integration_qawo_table* make_qawo_table(VALUE ary);
 
 static VALUE rb_gsl_integration_qawo_table_alloc(int argc, VALUE *argv,
-						 VALUE klass)
+                                                 VALUE klass)
 {
   gsl_integration_qawo_table *t = NULL;
   double omega, L;
   enum gsl_integration_qawo_enum sine;
   size_t n;
-  if (argc != 1 && argc != 4) 
+  if (argc != 1 && argc != 4)
     rb_raise(rb_eArgError, "wrong nubmer of arguments (%d for 1 or 4)", argc);
-
   if (TYPE(argv[0]) == T_ARRAY) {
     omega = NUM2DBL(rb_ary_entry(argv[0], 0));
     L = NUM2DBL(rb_ary_entry(argv[0], 1));
@@ -720,9 +705,8 @@ static VALUE rb_gsl_integration_qawo_table_alloc(int argc, VALUE *argv,
     sine = FIX2INT(argv[2]);
     n = FIX2INT(argv[3]);
   }
-
   t = gsl_integration_qawo_table_alloc(omega, L, sine, n);
-				       
+
   return Data_Wrap_Struct(klass, 0, gsl_integration_qawo_table_free, t);
 }
 
@@ -743,8 +727,8 @@ static VALUE rb_gsl_ary_to_integration_qawo_table(VALUE ary)
 {
   gsl_integration_qawo_table *t = NULL;
   t = make_qawo_table(ary);
-  return Data_Wrap_Struct(cgsl_integration_qawo_table, 
-			  0, gsl_integration_qawo_table_free, t);
+  return Data_Wrap_Struct(cgsl_integration_qawo_table,
+                          0, gsl_integration_qawo_table_free, t);
 }
 
 static gsl_integration_qawo_table* make_qawo_table(VALUE ary)
@@ -806,7 +790,7 @@ static VALUE rb_gsl_integration_qawo(int argc, VALUE *argv, VALUE obj)
   int status, intervals, itmp, flag = 0, flagt = 0;
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
-  if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
+    if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
     CHECK_FUNCTION(argv[0]);
     Data_Get_Struct(argv[0], gsl_function, F);
     itmp = 1;
@@ -821,18 +805,17 @@ static VALUE rb_gsl_integration_qawo(int argc, VALUE *argv, VALUE obj)
   a = NUM2DBL(argv[itmp]);
   flagt = get_qawo_table(argv[argc-1], &t);
   flag = get_epsabs_epsrel_limit_workspace(argc-1, argv, itmp+1, &epsabs, &epsrel,
-					   &limit, &w);
+                                           &limit, &w);
   status = gsl_integration_qawo(F, a, epsabs, epsrel, limit, w, t, &result, &abserr);
   intervals = w->size;
   if (flag == 1) gsl_integration_workspace_free(w);
   if (flagt == 1) gsl_integration_qawo_table_free(t);
-
   return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals),
-		     INT2FIX(status));
-}			    
+                     INT2FIX(status));
+}
 
 static int get_qawo_table(VALUE tt,
-			  gsl_integration_qawo_table **t)
+                          gsl_integration_qawo_table **t)
 {
   int flagt;
 
@@ -879,7 +862,7 @@ static VALUE rb_gsl_integration_qawf(int argc, VALUE *argv, VALUE obj)
     itmp += 1;
   }
   vtmp = argv + itmp;
-  flagt = get_qawo_table(argv[argc-1], &t);    
+  flagt = get_qawo_table(argv[argc-1], &t);
 
   switch (argc - 1 - itmp) {
   case 0:
@@ -920,10 +903,9 @@ static VALUE rb_gsl_integration_qawf(int argc, VALUE *argv, VALUE obj)
     gsl_integration_workspace_free(cw);
   }
   if (flagt == 1) gsl_integration_qawo_table_free(t);
-
-  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), 
-		     INT2FIX(intervals), INT2FIX(status));
-}			    
+  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
+                     INT2FIX(intervals), INT2FIX(status));
+}
 
 
 static void rb_gsl_integration_define_symbols(VALUE module)
@@ -939,14 +921,14 @@ static void rb_gsl_integration_define_symbols(VALUE module)
 }
 
 static VALUE rb_gsl_integration_workspace_alloc(int argc, VALUE *argv,
-						VALUE klass)
+                                                VALUE klass)
 {
   size_t limit;
   if (argc == 1) limit = FIX2INT(argv[0]);
   else limit = LIMIT_DEFAULT;
-  return Data_Wrap_Struct(klass, 0, 
-			  gsl_integration_workspace_free, 
-			  gsl_integration_workspace_alloc(limit));
+  return Data_Wrap_Struct(klass, 0,
+                          gsl_integration_workspace_free,
+                          gsl_integration_workspace_alloc(limit));
 }
 
 static VALUE rb_gsl_integration_workspace_limit(VALUE obj)
@@ -989,7 +971,7 @@ static VALUE rb_gsl_integration_workspace_to_a(VALUE obj)
   gsl_integration_workspace *w = NULL;
   Data_Get_Struct(obj, gsl_integration_workspace, w);
   return rb_ary_new3(5, INT2FIX(w->limit), INT2FIX(w->size), INT2FIX(w->nrmax),
-		     INT2FIX(w->i), INT2FIX(w->maximum_level));
+                     INT2FIX(w->i), INT2FIX(w->maximum_level));
 }
 
 static VALUE rb_gsl_integration_workspace_alist(VALUE obj)
@@ -1029,7 +1011,6 @@ static VALUE rb_gsl_integration_workspace_elist(VALUE obj)
   return Data_Wrap_Struct(cgsl_vector_view_ro, 0, free, v);
 }
 
-#ifdef GSL_1_14_LATER
 static VALUE rb_gsl_integration_glfixed_table_alloc(VALUE klass, VALUE n)
 {
   gsl_integration_glfixed_table *t;
@@ -1045,7 +1026,7 @@ static VALUE rb_gsl_integration_glfixed(VALUE obj, VALUE aa, VALUE bb, VALUE tt)
   double res;
   if (!rb_obj_is_kind_of(tt, cgsl_integration_glfixed_table)) {
     rb_raise(rb_eTypeError, "Wrong arugment type (%s for GSL::Integration::Glfixed_table)",
-	     rb_class2name(CLASS_OF(tt)));
+             rb_class2name(CLASS_OF(tt)));
   }
   Data_Get_Struct(tt, gsl_integration_glfixed_table, t);
   a = NUM2DBL(aa);
@@ -1054,7 +1035,6 @@ static VALUE rb_gsl_integration_glfixed(VALUE obj, VALUE aa, VALUE bb, VALUE tt)
   res = gsl_integration_glfixed(f, a, b, t);
   return rb_float_new(res);
 }
-#endif
 
 void Init_gsl_integration(VALUE module)
 {
@@ -1080,69 +1060,69 @@ void Init_gsl_integration(VALUE module)
   rb_define_alias(cgsl_function, "qagil", "integration_qagil");
   rb_define_alias(cgsl_function, "qawc", "integration_qawc");
 
-  cgsl_integration_qaws_table = rb_define_class_under(mgsl_integ, "QAWS_Table", 
-						      cGSL_Object);
+  cgsl_integration_qaws_table = rb_define_class_under(mgsl_integ, "QAWS_Table",
+                                                      cGSL_Object);
   rb_define_singleton_method(cgsl_integration_qaws_table, "alloc",
-			     rb_gsl_integration_qaws_table_alloc, -1);
+                             rb_gsl_integration_qaws_table_alloc, -1);
   /*  rb_define_singleton_method(cgsl_integration_qaws_table, "new",
       rb_gsl_integration_qaws_table_alloc, -1);*/
-  rb_define_method(cgsl_integration_qaws_table, "to_a", 
-		   rb_gsl_integration_qaws_table_to_a, 0);
-  rb_define_method(cgsl_integration_qaws_table, "set", 
-		   rb_gsl_integration_qaws_table_set, -1);
-  rb_define_method(rb_cArray, "to_gsl_integration_qaws_table", 
-		   rb_gsl_ary_to_integration_qaws_table, 0);
+  rb_define_method(cgsl_integration_qaws_table, "to_a",
+                   rb_gsl_integration_qaws_table_to_a, 0);
+  rb_define_method(cgsl_integration_qaws_table, "set",
+                   rb_gsl_integration_qaws_table_set, -1);
+  rb_define_method(rb_cArray, "to_gsl_integration_qaws_table",
+                   rb_gsl_ary_to_integration_qaws_table, 0);
   rb_define_alias(rb_cArray, "to_qaws_table", "to_gsl_integration_qaws_table");
   rb_define_method(cgsl_function, "integration_qaws", rb_gsl_integration_qaws, -1);
   rb_define_alias(cgsl_function, "qaws", "integration_qaws");
 
-  cgsl_integration_qawo_table = rb_define_class_under(mgsl_integ, "QAWO_Table", 
-						      cGSL_Object);
+  cgsl_integration_qawo_table = rb_define_class_under(mgsl_integ, "QAWO_Table",
+                                                      cGSL_Object);
   rb_define_singleton_method(cgsl_integration_qawo_table, "alloc",
-			     rb_gsl_integration_qawo_table_alloc, -1);
+                             rb_gsl_integration_qawo_table_alloc, -1);
   /*  rb_define_singleton_method(cgsl_integration_qawo_table, "new",
       rb_gsl_integration_qawo_table_alloc, -1);*/
-  rb_define_method(cgsl_integration_qawo_table, "to_a", 
-		   rb_gsl_integration_qawo_table_to_a, 0);
-  rb_define_method(rb_cArray, "to_gsl_integration_qawo_table", 
-		   rb_gsl_ary_to_integration_qawo_table, 0);
-  rb_define_method(cgsl_integration_qawo_table, "set", 
-		   rb_gsl_integration_qawo_table_set, -1);
-  rb_define_method(cgsl_integration_qawo_table, "set_length", 
-		   rb_gsl_integration_qawo_table_set_length, 1);
+  rb_define_method(cgsl_integration_qawo_table, "to_a",
+                   rb_gsl_integration_qawo_table_to_a, 0);
+  rb_define_method(rb_cArray, "to_gsl_integration_qawo_table",
+                   rb_gsl_ary_to_integration_qawo_table, 0);
+  rb_define_method(cgsl_integration_qawo_table, "set",
+                   rb_gsl_integration_qawo_table_set, -1);
+  rb_define_method(cgsl_integration_qawo_table, "set_length",
+                   rb_gsl_integration_qawo_table_set_length, 1);
   rb_define_method(cgsl_function, "integration_qawo", rb_gsl_integration_qawo, -1);
   rb_define_method(cgsl_function, "integration_qawf", rb_gsl_integration_qawf, -1);
   rb_define_alias(cgsl_function, "qawo", "integration_qawo");
   rb_define_alias(cgsl_function, "qawf", "integration_qawf");
 
-  cgsl_integration_workspace = rb_define_class_under(mgsl_integ, 
-						     "Workspace", cGSL_Object);
+  cgsl_integration_workspace = rb_define_class_under(mgsl_integ,
+                                                     "Workspace", cGSL_Object);
 
   /*  rb_define_singleton_method(cgsl_integration_workspace, "new",
       rb_gsl_integration_workspace_alloc, -1);*/
   rb_define_singleton_method(cgsl_integration_workspace, "alloc",
-			     rb_gsl_integration_workspace_alloc, -1);
-
-  rb_define_method(cgsl_integration_workspace, "limit", 
-		   rb_gsl_integration_workspace_limit, 0);
-  rb_define_method(cgsl_integration_workspace, "size", 
-		   rb_gsl_integration_workspace_size, 0);
-  rb_define_method(cgsl_integration_workspace, "nrmax", 
-		   rb_gsl_integration_workspace_nrmax, 0);
-  rb_define_method(cgsl_integration_workspace, "i", 
-		   rb_gsl_integration_workspace_i, 0);
-  rb_define_method(cgsl_integration_workspace, "maximum_level", 
-		   rb_gsl_integration_workspace_maximum_level, 0);
-  rb_define_method(cgsl_integration_workspace, "to_a", 
-		   rb_gsl_integration_workspace_to_a, 0);
-  rb_define_method(cgsl_integration_workspace, "alist", 
-		   rb_gsl_integration_workspace_alist, 0);
-  rb_define_method(cgsl_integration_workspace, "blist", 
-		   rb_gsl_integration_workspace_blist, 0);
-  rb_define_method(cgsl_integration_workspace, "rlist", 
-		   rb_gsl_integration_workspace_rlist, 0);
-  rb_define_method(cgsl_integration_workspace, "elist", 
-		   rb_gsl_integration_workspace_elist, 0);
+                             rb_gsl_integration_workspace_alloc, -1);
+
+  rb_define_method(cgsl_integration_workspace, "limit",
+                   rb_gsl_integration_workspace_limit, 0);
+  rb_define_method(cgsl_integration_workspace, "size",
+                   rb_gsl_integration_workspace_size, 0);
+  rb_define_method(cgsl_integration_workspace, "nrmax",
+                   rb_gsl_integration_workspace_nrmax, 0);
+  rb_define_method(cgsl_integration_workspace, "i",
+                   rb_gsl_integration_workspace_i, 0);
+  rb_define_method(cgsl_integration_workspace, "maximum_level",
+                   rb_gsl_integration_workspace_maximum_level, 0);
+  rb_define_method(cgsl_integration_workspace, "to_a",
+                   rb_gsl_integration_workspace_to_a, 0);
+  rb_define_method(cgsl_integration_workspace, "alist",
+                   rb_gsl_integration_workspace_alist, 0);
+  rb_define_method(cgsl_integration_workspace, "blist",
+                   rb_gsl_integration_workspace_blist, 0);
+  rb_define_method(cgsl_integration_workspace, "rlist",
+                   rb_gsl_integration_workspace_rlist, 0);
+  rb_define_method(cgsl_integration_workspace, "elist",
+                   rb_gsl_integration_workspace_elist, 0);
 
   /*****/
   rb_define_module_function(mgsl_integ, "qng", rb_gsl_integration_qng, -1);
@@ -1157,13 +1137,10 @@ void Init_gsl_integration(VALUE module)
   rb_define_module_function(mgsl_integ, "qawo", rb_gsl_integration_qawo, -1);
   rb_define_module_function(mgsl_integ, "qawf", rb_gsl_integration_qawf, -1);
 
-#ifdef GSL_1_14_LATER
   cgsl_integration_glfixed_table = rb_define_class_under(mgsl_integ, "Glfixed_table", cGSL_Object);
   rb_define_singleton_method(cgsl_integration_glfixed_table, "alloc",
-			     rb_gsl_integration_glfixed_table_alloc, 1);
+                             rb_gsl_integration_glfixed_table_alloc, 1);
   rb_define_method(cgsl_function, "glfixed", rb_gsl_integration_glfixed, 3);
-#endif
-
 }
 
 #undef EPSABS_DEFAULT
diff --git a/ext/gsl/interp.c b/ext/gsl_native/interp.c
similarity index 93%
rename from ext/gsl/interp.c
rename to ext/gsl_native/interp.c
index b2ae04f..aaa0347 100644
--- a/ext/gsl/interp.c
+++ b/ext/gsl_native/interp.c
@@ -34,10 +34,10 @@ static VALUE rb_gsl_interp_new(int argc, VALUE *argv, VALUE klass)
       break;
     default:
       if (ptrx == NULL) {
-	ptrx = get_vector_ptr(argv[i], &stride, &sizex);
+        ptrx = get_vector_ptr(argv[i], &stride, &sizex);
       } else {
-	ptry = get_vector_ptr(argv[i], &stride, &sizey);
-	size = GSL_MIN_INT(sizex, sizey);
+        ptry = get_vector_ptr(argv[i], &stride, &sizey);
+        size = GSL_MIN_INT(sizex, sizey);
       }
       break;
     }
@@ -132,7 +132,7 @@ static VALUE rb_gsl_interp_bsearch(int argc, VALUE *argv, VALUE obj)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 3)", argc);
       break;
     }
-    break; 
+    break;
   }
   return INT2FIX(gsl_interp_bsearch(v->data, x, indexl, indexh));
 }
@@ -170,9 +170,9 @@ static VALUE rb_gsl_interp_accel_find(VALUE obj, VALUE vv, VALUE xx)
 }
 
 static VALUE rb_gsl_interp_evaluate(VALUE obj, VALUE xxa, VALUE yya, VALUE xx,
-				    double (*eval)(const gsl_interp *, const double [], 
-						   const double [], double, 
-						   gsl_interp_accel *))
+                                    double (*eval)(const gsl_interp *, const double [],
+                                                   const double [], double,
+                                                   gsl_interp_accel *))
 {
   rb_gsl_interp *rgi = NULL;
   double *ptrx = NULL, *ptry = NULL;
@@ -181,17 +181,13 @@ static VALUE rb_gsl_interp_evaluate(VALUE obj, VALUE xxa, VALUE yya, VALUE xx,
   VALUE ary, x;
   double val;
   size_t n, i, j, size, stridex, stridey;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na = NULL;
-  double *ptrz = NULL, *ptr = NULL;
-#endif
   Data_Get_Struct(obj, rb_gsl_interp, rgi);
   ptrx = get_vector_ptr(xxa, &stridex, &size);
-  if (size != rgi->p->size ){
+  if (size != rgi->p->size ) {
     rb_raise(rb_eTypeError, "size mismatch (xa:%d != %d)",  (int) size, (int) rgi->p->size);
   }
   ptry = get_vector_ptr(yya, &stridey, &size);
-  if (size != rgi->p->size ){
+  if (size != rgi->p->size ) {
     rb_raise(rb_eTypeError, "size mismatch (ya:%d != %d)", (int) size, (int) rgi->p->size);
   }
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
@@ -215,12 +211,14 @@ static VALUE rb_gsl_interp_evaluate(VALUE obj, VALUE xxa, VALUE yya, VALUE xx,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na = NULL;
+      double *ptrz = NULL, *ptr = NULL;
       GetNArray(xx, na);
       ptrz = (double*) na->ptr;
       ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
       ptr = NA_PTR_TYPE(ary, double*);
       for (i = 0; (int) i < na->total; i++)
-	ptr[i] = (*eval)(rgi->p, ptrx, ptry, ptrz[i], rgi->a);
+        ptr[i] = (*eval)(rgi->p, ptrx, ptry, ptrz[i], rgi->a);
       return ary;
     }
 #endif
@@ -228,18 +226,18 @@ static VALUE rb_gsl_interp_evaluate(VALUE obj, VALUE xxa, VALUE yya, VALUE xx,
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	val = (*eval)(rgi->p, ptrx, ptry, gsl_vector_get(v, i), rgi->a);
-	gsl_vector_set(vnew, i, val);
+        val = (*eval)(rgi->p, ptrx, ptry, gsl_vector_get(v, i), rgi->a);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  val = (*eval)(rgi->p, ptrx, ptry, gsl_matrix_get(m, i, j), rgi->a);
-	  gsl_matrix_set(mnew, i, j, val);
-	}
+        for (j = 0; j < m->size2; j++) {
+          val = (*eval)(rgi->p, ptrx, ptry, gsl_matrix_get(m, i, j), rgi->a);
+          gsl_matrix_set(mnew, i, j, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -306,7 +304,7 @@ static VALUE rb_gsl_interp_eval_deriv_e(VALUE obj, VALUE xxa, VALUE yya, VALUE x
   default:
     return rb_float_new(y);
     break;
-  } 
+  }
   return Qnil;
 }
 
@@ -338,8 +336,8 @@ static VALUE rb_gsl_interp_eval_deriv2_e(VALUE obj, VALUE xxa, VALUE yya, VALUE
   return Qnil;
 }
 
-static VALUE rb_gsl_interp_eval_integ(VALUE obj, VALUE xxa, VALUE yya, 
-				      VALUE aa, VALUE bb)
+static VALUE rb_gsl_interp_eval_integ(VALUE obj, VALUE xxa, VALUE yya,
+                                      VALUE aa, VALUE bb)
 {
   rb_gsl_interp *rgi = NULL;
   double *ptr1 = NULL, *ptr2 = NULL;
@@ -354,8 +352,8 @@ static VALUE rb_gsl_interp_eval_integ(VALUE obj, VALUE xxa, VALUE yya,
   return rb_float_new(gsl_interp_eval_integ(rgi->p, ptr1, ptr2, a, b, rgi->a));
 }
 
-static VALUE rb_gsl_interp_eval_integ_e(VALUE obj, VALUE xxa, VALUE yya, 
-					VALUE aa, VALUE bb)
+static VALUE rb_gsl_interp_eval_integ_e(VALUE obj, VALUE xxa, VALUE yya,
+                                        VALUE aa, VALUE bb)
 {
   rb_gsl_interp *rgi = NULL;
   double *ptr1 = NULL, *ptr2 = NULL;
@@ -392,9 +390,7 @@ const gsl_interp_type* get_interp_type(VALUE t)
     type = FIX2INT(t);
     switch (type) {
     case GSL_INTERP_LINEAR: return gsl_interp_linear; break;
-#ifdef GSL_1_1_LATER
     case GSL_INTERP_POLYNOMIAL: return gsl_interp_polynomial; break;
-#endif
     case GSL_INTERP_CSPLINE: return gsl_interp_cspline; break;
     case GSL_INTERP_CSPLINE_PERIODIC: return gsl_interp_cspline_periodic; break;
     case GSL_INTERP_AKIMA: return gsl_interp_akima; break;
@@ -408,10 +404,8 @@ const gsl_interp_type* get_interp_type(VALUE t)
     strcpy(name, STR2CSTR(t));
     if (str_tail_grep(name, "linear") == 0) {
       return gsl_interp_linear;
-#ifdef GSL_1_1_LATER
     } else if (str_tail_grep(name, "polynomial") == 0) {
       return gsl_interp_polynomial;
-#endif
     } else if (str_tail_grep(name, "cspline") == 0) {
       return gsl_interp_cspline;
     } else if (str_tail_grep(name, "cspline_periodic") == 0) {
@@ -453,10 +447,8 @@ static void rb_gsl_interp_define_const(VALUE klass)
   rb_define_const(klass, "AKIMA_PERIODIC", INT2FIX(GSL_INTERP_AKIMA_PERIODIC));
 
   rb_define_const(klass, "Linear", INT2FIX(GSL_INTERP_LINEAR));
-#ifdef GSL_1_1_LATER
   rb_define_const(klass, "POLYNOMIAL", INT2FIX(GSL_INTERP_POLYNOMIAL));
   rb_define_const(klass, "Polynomial", INT2FIX(GSL_INTERP_POLYNOMIAL));
-#endif
   rb_define_const(klass, "CSpline", INT2FIX(GSL_INTERP_CSPLINE));
   rb_define_const(klass, "CSpline_Periodic", INT2FIX(GSL_INTERP_CSPLINE_PERIODIC));
   rb_define_const(klass, "Akima", INT2FIX(GSL_INTERP_AKIMA));
diff --git a/ext/gsl_native/jacobi.c b/ext/gsl_native/jacobi.c
new file mode 100644
index 0000000..54c65a7
--- /dev/null
+++ b/ext/gsl_native/jacobi.c
@@ -0,0 +1,733 @@
+#ifdef HAVE_JACOBI_H
+#include "include/rb_gsl.h"
+#include "jacobi.h"
+
+static VALUE jac_eval3_e(VALUE x, VALUE a, VALUE b,
+                         int (*f)(double, double, double, gsl_sf_result*))
+{
+  gsl_sf_result *result;
+  VALUE obj;
+  obj = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, result);
+  (*f)(NUM2DBL(x), NUM2DBL(a), NUM2DBL(b), result);
+  return obj;
+}
+
+static VALUE jac_eval3(VALUE xx, VALUE aa, VALUE bb, double (*f)(double, double, double))
+{
+  gsl_vector *x, *y;
+  double a, b;
+  size_t i, len;
+  VALUE ary;
+  a = NUM2DBL(aa);
+  b = NUM2DBL(bb);
+  if (VECTOR_P(xx)) {
+    Data_Get_Struct(xx, gsl_vector, x);
+    y = gsl_vector_alloc(x->size);
+    for (i = 0; i < x->size; i++) {
+      gsl_vector_set(y, i, (*f)(gsl_vector_get(x, i), a, b));
+    }
+    return Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(xx)), 0, gsl_vector_free, y);
+  } else if (TYPE(xx) == T_ARRAY) {
+    //    len = RARRAY(xx)->len;
+    len = RARRAY_LEN(xx);
+    ary = rb_ary_new2(len);
+    for (i = 0; i < len; i++) {
+      rb_ary_store(ary, i, rb_float_new((*f)(NUM2DBL(rb_ary_entry(xx, i)), a, b)));
+    }
+    return ary;
+#ifdef HAVE_NARRAY_H
+  } else if (NA_IsNArray(xx)) {
+    double *ptr1, *ptr2;
+    struct NARRAY *na;
+    GetNArray(xx, na);
+    len = na->total;
+    ptr1 = (double*) na->ptr;
+    ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
+    ptr2 = NA_PTR_TYPE(ary, double*);
+    for (i = 0; i < len; i++) {
+      ptr2[i] = (*f)(ptr1[i], a, b);
+    }
+    return ary;
+#endif
+  } else {
+    return rb_float_new((*f)(NUM2DBL(xx), a, b));
+  }
+}
+
+static VALUE rb_jac_jacobi_eval(int argc, VALUE *argv,
+                                double (*f)(double, int, double, double),
+                                int (*f2)(int, const double*, int, double*, double, double, double*))
+{
+  gsl_vector *x, *ws, *y;
+  double a, b;
+  VALUE ary;
+  size_t len, i;
+  int n, flag = 0;
+  if (argc < 4) rb_raise(rb_eArgError, "Too few arguments (%d for >= 4)", argc);
+  if (VECTOR_P(argv[0])) {
+    Data_Get_Struct(argv[0], gsl_vector, x);
+    y = gsl_vector_alloc(x->size);
+    ary = Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(x)), 0, gsl_vector_free, y);
+    switch (argc) {
+    case 4:
+      ws = gsl_vector_alloc(2*x->size);
+      flag = 1;
+      break;
+    case 5:
+      CHECK_VECTOR(argv[4]);
+      Data_Get_Struct(argv[4], gsl_vector, ws);
+      break;
+    default:
+      rb_raise(rb_eArgError, "Too many arguments (%d for 4 or 5)", argc);
+    }
+    (*f2)(x->size, x->data, FIX2INT(argv[1]), y->data, NUM2DBL(argv[2]), NUM2DBL(argv[3]),
+          ws->data);
+    if (flag == 1) gsl_vector_free(ws);
+    return ary;
+  } else if (TYPE(argv[0]) == T_ARRAY) {
+    n = FIX2INT(argv[1]);
+    a = NUM2DBL(argv[2]);
+    b = NUM2DBL(argv[3]);
+    //    len = RARRAY(argv[0])->len;
+    len = RARRAY_LEN(argv[0]);
+    ary = rb_ary_new2(len);
+    for (i = 0; i < len; i++) {
+      rb_ary_store(ary, i, rb_float_new((*f)(NUM2DBL(rb_ary_entry(argv[0], i)), n, a, b)));
+    }
+    return ary;
+#ifdef HAVE_NARRAY_H
+  } else if (NA_IsNArray(argv[0])) {
+    double *ptr1, *ptr2;
+    struct NARRAY *na;
+    GetNArray(argv[0], na);
+    len = na->total;
+    ptr1 = (double*) na->ptr;
+    ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(argv[0]));
+    ptr2 = NA_PTR_TYPE(ary, double*);
+    n = FIX2INT(argv[1]);
+    a = NUM2DBL(argv[2]);
+    b = NUM2DBL(argv[3]);
+    ws = gsl_vector_alloc(len);
+    (*f2)(len, ptr1, n, ptr2, a, b, ws->data);
+    gsl_vector_free(ws);
+    return ary;
+#endif
+  } else {
+    return rb_float_new((*f)(NUM2DBL(argv[0]), FIX2INT(argv[1]), NUM2DBL(argv[2]), NUM2DBL(argv[3])));
+  }
+}
+static VALUE rb_jac_jacobi_P0_e(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3_e(x, a, b, jac_jacobi_P0_e);
+}
+
+static VALUE rb_jac_jacobi_P0(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3(x, a, b, jac_jacobi_P0);
+}
+
+static VALUE rb_jac_jacobi_P1_e(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3_e(x, a, b, jac_jacobi_P1_e);
+}
+
+static VALUE rb_jac_jacobi_P1(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3(x, a, b, jac_jacobi_P1);
+}
+
+
+static VALUE rb_jac_jacobi(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_jacobi_eval(argc, argv, jac_jacobi, jac_jacobi_array);
+}
+
+static VALUE rb_jac_djacobi_P0_e(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3_e(x, a, b, jac_djacobi_P0_e);
+}
+
+static VALUE rb_jac_djacobi_P0(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3(x, a, b, jac_djacobi_P0);
+}
+
+static VALUE rb_jac_djacobi_P1_e(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3_e(x, a, b, jac_djacobi_P1_e);
+}
+
+static VALUE rb_jac_djacobi_P1(VALUE module, VALUE x, VALUE a, VALUE b)
+{
+  return jac_eval3(x, a, b, jac_djacobi_P1);
+}
+
+static VALUE rb_jac_djacobi(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_jacobi_eval(argc, argv, jac_djacobi, jac_djacobi_array);
+}
+
+static VALUE rb_jac_zeros_eval(int argc, VALUE *argv, VALUE module,
+                               int (*f)(double*, int, double, double))
+{
+  gsl_vector *x;
+  int m, status;
+  double a, b;
+  VALUE xx;
+  switch (argc) {
+  case 3:
+    if (FIXNUM_P(argv[0])) {
+      m = FIX2INT(argv[0]);
+      a = NUM2DBL(argv[1]);
+      b = NUM2DBL(argv[2]);
+      x = gsl_vector_alloc(m);
+      xx = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, x);
+    } else if (VECTOR_P(argv[0])) {
+      Data_Get_Struct(argv[0], gsl_vector, x);
+      m = x->size;
+      a = NUM2DBL(argv[1]);
+      b = NUM2DBL(argv[2]);
+      xx = argv[0];
+    } else {
+      rb_raise(rb_eTypeError, "Wrong argument type %s (Fixnum or GSL::Vector expected)",
+               rb_class2name(CLASS_OF(argv[0])));
+    }
+    break;
+  case 4:
+    CHECK_VECTOR(argv[0]);
+    Data_Get_Struct(argv[0], gsl_vector, x);
+    m = FIX2INT(argv[1]);
+    a = NUM2DBL(argv[2]);
+    b = NUM2DBL(argv[3]);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
+  }
+  status = (*f)(x->data, m, a, b);
+  if (status != GSL_SUCCESS)
+    rb_raise(rb_eRuntimeError, "Something wrong. (error code %d)", status);
+  return xx;
+}
+
+static VALUE rb_jac_jacobi_zeros(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_zeros_eval(argc, argv, module, jac_jacobi_zeros);
+}
+
+static void jac_define_const(VALUE module)
+{
+  rb_define_const(module, "GJ", INT2FIX(JAC_GJ));
+  rb_define_const(module, "GLJ", INT2FIX(JAC_GLJ));
+  rb_define_const(module, "GRJM", INT2FIX(JAC_GRJM));
+  rb_define_const(module, "GRJP", INT2FIX(JAC_GRJP));
+}
+
+static VALUE rb_jac_quadrature_alloc(VALUE klass, VALUE vQ)
+{
+  jac_quadrature *q;
+
+  q = jac_quadrature_alloc(FIX2INT(vQ));
+
+  return Data_Wrap_Struct(klass, 0, jac_quadrature_free, q);
+}
+
+static VALUE rb_jac_quadrature_Q(VALUE obj)
+{
+  jac_quadrature *q;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  return INT2FIX(q->Q);
+}
+
+static VALUE rb_jac_quadrature_type(VALUE obj)
+{
+  jac_quadrature *q;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  return INT2FIX((int) q->type);
+}
+
+static VALUE rb_jac_quadrature_alpha(VALUE obj)
+{
+  jac_quadrature *q;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  return NUM2DBL(q->alpha);
+}
+
+static VALUE rb_jac_quadrature_beta(VALUE obj)
+{
+  jac_quadrature *q;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  return NUM2DBL(q->beta);
+}
+
+static VALUE rb_jac_quadrature_x(VALUE obj)
+{
+  jac_quadrature *q;
+  gsl_vector_view *v;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  v = gsl_vector_view_alloc();
+  v->vector.data = q->x;
+  v->vector.size = q->Q;
+  v->vector.stride = 1;
+  return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
+}
+
+static VALUE rb_jac_quadrature_w(VALUE obj)
+{
+  jac_quadrature *q;
+  gsl_vector_view *v;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  v = gsl_vector_view_alloc();
+  v->vector.data = q->w;
+  v->vector.size = q->Q;
+  v->vector.stride = 1;
+  return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
+}
+
+static VALUE rb_jac_quadrature_D(VALUE obj)
+{
+  jac_quadrature *q;
+  gsl_vector_view *v;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  v = gsl_vector_view_alloc();
+  v->vector.data = q->D;
+  v->vector.size = q->Q;
+  v->vector.stride = 1;
+  return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
+}
+
+static VALUE rb_jac_quadrature_xp(VALUE obj)
+{
+  jac_quadrature *q;
+  gsl_vector_view *v;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  v = gsl_vector_view_alloc();
+  v->vector.data = q->w;
+  v->vector.size = q->np;
+  v->vector.stride = 1;
+  return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
+}
+
+static VALUE rb_jac_interpmat_alloc(int argc, VALUE *argv, VALUE obj)
+{
+  int err;
+  jac_quadrature *q;
+  gsl_vector *xp;
+  int np;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  switch (argc) {
+  case 1:
+    CHECK_VECTOR(argv[0]);
+    Data_Get_Struct(argv[0], gsl_vector, xp);
+    np = xp->size;
+    break;
+  case 2:
+    CHECK_VECTOR(argv[1]);
+    Data_Get_Struct(argv[1], gsl_vector, xp);
+    np = FIX2INT(argv[0]);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
+  }
+  err = jac_interpmat_alloc(q, np, xp->data);
+  return FIX2INT(err);
+}
+
+static VALUE rb_jac_interpmat_free(VALUE obj)
+{
+  jac_quadrature *q;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  jac_interpmat_free(q);
+  return Qtrue;
+}
+
+static VALUE rb_jac_quadrature_zwd(int argc, VALUE *argv, VALUE obj)
+{
+  jac_quadrature *q;
+  gsl_vector *ws;
+  int flag = 0, type, status;
+  double a, b;
+  Data_Get_Struct(obj, jac_quadrature, q);
+  switch (argc) {
+  case 3:
+    type = FIX2INT(argv[0]);
+    a = NUM2DBL(argv[1]);
+    b = NUM2DBL(argv[2]);
+    ws = gsl_vector_alloc(q->Q);
+    flag = 1;
+    break;
+  case 4:
+    type = FIX2INT(argv[0]);
+    a = NUM2DBL(argv[1]);
+    b = NUM2DBL(argv[2]);
+    Data_Get_Struct(argv[3], gsl_vector, ws);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
+  }
+  status = jac_quadrature_zwd(q, type, a, b, ws->data);
+  if (flag == 1) gsl_vector_free(ws);
+  return INT2FIX(status);
+}
+
+static VALUE rb_jac_integrate(VALUE obj, VALUE ff)
+{
+  jac_quadrature *q;
+  gsl_vector *f;
+  CHECK_VECTOR(ff);
+  Data_Get_Struct(obj, jac_quadrature, q);
+  Data_Get_Struct(ff, gsl_vector, f);
+  return rb_float_new(jac_integrate(q, f->data));
+}
+
+static VALUE rb_jac_interpolate(int argc, VALUE *argv, VALUE obj)
+{
+  jac_quadrature *q;
+  gsl_vector *f, *fout;
+  VALUE vfout;
+  switch (argc) {
+  case 1:
+    CHECK_VECTOR(argv[0]);
+    Data_Get_Struct(argv[0], gsl_vector, f);
+    fout = gsl_vector_alloc(f->size);
+    vfout = Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(argv[0])), 0, gsl_vector_free, fout);
+    break;
+  case 2:
+    CHECK_VECTOR(argv[0]);
+    Data_Get_Struct(argv[0], gsl_vector, f);
+    CHECK_VECTOR(argv[1]);
+    Data_Get_Struct(argv[1], gsl_vector, fout);
+    vfout = argv[1];
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
+  }
+  Data_Get_Struct(obj, jac_quadrature, q);
+  jac_interpolate(q, f->data, fout->data);
+  return vfout;
+}
+
+static VALUE rb_jac_differentiate(int argc, VALUE *argv, VALUE obj)
+{
+  jac_quadrature *q;
+  gsl_vector *f, *fout;
+  VALUE vfout;
+  switch (argc) {
+  case 1:
+    CHECK_VECTOR(argv[0]);
+    Data_Get_Struct(argv[0], gsl_vector, f);
+    fout = gsl_vector_alloc(f->size);
+    vfout = Data_Wrap_Struct(VECTOR_ROW_COL(CLASS_OF(argv[0])), 0, gsl_vector_free, fout);
+    break;
+  case 2:
+    CHECK_VECTOR(argv[0]);
+    Data_Get_Struct(argv[0], gsl_vector, f);
+    CHECK_VECTOR(argv[1]);
+    Data_Get_Struct(argv[1], gsl_vector, fout);
+    vfout = argv[1];
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
+  }
+  Data_Get_Struct(obj, jac_quadrature, q);
+  jac_differentiate(q, f->data, fout->data);
+  return vfout;
+}
+
+/*****/
+static VALUE rb_jac_qeval(int argc, VALUE *argv,
+                          int (*f)(double*, double*, const int, double, double, double*))
+{
+  gsl_vector *z, *D, *ws;
+  int Q;
+  int flag = 0, status;
+  double alpha, beta;
+  VALUE vD;
+  if (argc < 3) rb_raise(rb_eArgError, "Too few arguments (%d for >= 3)", argc);
+  CHECK_VECTOR(argv[0]);
+  Data_Get_Struct(argv[0], gsl_vector, z);
+  argc -= 1;
+  argv += 1;
+  if (VECTOR_P(argv[argc-1])) {
+    Data_Get_Struct(argv[argc-1], gsl_vector, ws);
+    argc -= 1;
+  } else {
+    ws = gsl_vector_alloc(z->size);
+    flag = 1;
+  }
+  switch (argc) {
+  case 2:
+    Q = z->size;
+    D = gsl_vector_alloc(Q*Q);
+    alpha = NUM2DBL(argv[0]);
+    beta = NUM2DBL(argv[1]);
+    vD = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
+    break;
+  case 4:
+    Data_Get_Struct(argv[0], gsl_vector, D);
+    vD = argv[0];
+    Q = FIX2INT(argv[1]);
+    alpha = NUM2DBL(argv[2]);
+    beta = NUM2DBL(argv[3]);
+    break;
+  case 3:
+    if (VECTOR_P(argv[0])) {
+      Q = z->size;
+      Data_Get_Struct(argv[0], gsl_vector, D);
+      vD = argv[0];
+    } else {
+      Q = FIX2INT(argv[0]);
+      D = gsl_vector_alloc(Q*Q);
+      vD = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
+    }
+    alpha = NUM2DBL(argv[1]);
+    beta = NUM2DBL(argv[2]);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments.");
+  }
+  status = (*f)(z->data, D->data, Q, alpha, beta, ws->data);
+  if (flag == 1) gsl_vector_free(ws);
+  if (status != GSL_SUCCESS) rb_raise(rb_eRuntimeError, "Something wrong.");
+  return vD;
+}
+
+static VALUE rb_jac_diffmat_gj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_diffmat_gj);
+}
+
+static VALUE rb_jac_diffmat_glj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_diffmat_glj);
+}
+
+static VALUE rb_jac_diffmat_grjm(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_diffmat_grjm);
+}
+
+static VALUE rb_jac_diffmat_grjp(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_diffmat_grjp);
+}
+
+static VALUE rb_jac_weights_gj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_weights_gj);
+}
+
+static VALUE rb_jac_weights_glj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_weights_glj);
+}
+
+static VALUE rb_jac_weights_grjm(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_weights_grjm);
+}
+
+static VALUE rb_jac_weights_grjp(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_qeval(argc, argv, jac_weights_grjp);
+}
+
+static VALUE rb_jac_zeros_gj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_zeros_eval(argc, argv, module, jac_zeros_gj);
+}
+static VALUE rb_jac_zeros_glj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_zeros_eval(argc, argv, module, jac_zeros_glj);
+}
+static VALUE rb_jac_zeros_grjm(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_zeros_eval(argc, argv, module, jac_zeros_grjm);
+}
+static VALUE rb_jac_zeros_grjp(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_zeros_eval(argc, argv, module, jac_zeros_grjp);
+}
+
+static VALUE rb_jac_lagrange_eval(int argc, VALUE *argv,
+                                  double (*f)(int, double, int, double*, double, double))
+{
+  gsl_vector *z;
+  int i, Q;
+  double alpha, beta, zz;
+
+  switch (argc) {
+  case 5:
+    i = FIX2INT(argv[0]);
+    zz = NUM2DBL(argv[1]);
+    CHECK_VECTOR(argv[2]);
+    Data_Get_Struct(argv[2], gsl_vector, z);
+    Q = z->size;
+    alpha = NUM2DBL(argv[3]);
+    beta = NUM2DBL(argv[4]);
+    break;
+  case 6:
+    i = FIX2INT(argv[0]);
+    zz = NUM2DBL(argv[1]);
+    Q = FIX2INT(argv[2]);
+    CHECK_VECTOR(argv[3]);
+    Data_Get_Struct(argv[3], gsl_vector, z);
+    alpha = NUM2DBL(argv[4]);
+    beta = NUM2DBL(argv[5]);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 5 or 6)", argc);
+  }
+  return rb_float_new((*f)(i, zz, Q, z->data, alpha, beta));
+}
+
+static VALUE rb_jac_lagrange_gj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_lagrange_eval(argc, argv, jac_lagrange_gj);
+}
+static VALUE rb_jac_lagrange_glj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_lagrange_eval(argc, argv, jac_lagrange_glj);
+}
+static VALUE rb_jac_lagrange_grjm(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_lagrange_eval(argc, argv, jac_lagrange_grjm);
+}
+
+static VALUE rb_jac_lagrange_grjp(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_lagrange_eval(argc, argv, jac_lagrange_grjp);
+}
+
+static VALUE rb_jac_interpmat_eval(int argc, VALUE *argv,
+                                   int (*f)(double*, double*, int, double*, int, double, double))
+{
+  gsl_vector *imat, *zp, *z;
+  double alpha, beta;
+  int np, Q, status;
+  VALUE vimat;
+
+  if (argc < 3) rb_raise(rb_eArgError, "Too few arguments (%d for >= 3)", argc);
+  CHECK_VECTOR(argv[0]);
+  if (VECTOR_P(argv[1])) {
+    Data_Get_Struct(argv[0], gsl_vector, imat);
+    Data_Get_Struct(argv[1], gsl_vector, zp);
+    vimat = argv[0];
+    if (FIXNUM_P(argv[2])) np = FIX2INT(argv[2]);
+    argc -= 3;
+    argv += 3;
+  } else {
+    Data_Get_Struct(argv[0], gsl_vector, zp);
+    if (FIXNUM_P(argv[1])) np = FIX2INT(argv[1]);
+    else np = zp->size;
+    imat = gsl_vector_alloc(np);
+    vimat = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, imat);
+    argc -= 2;
+    argv += 2;
+  }
+  CHECK_VECTOR(argv[0]);
+  Data_Get_Struct(argv[0], gsl_vector, z);
+  argc -= 1;
+  argv += 1;
+  switch (argc) {
+  case 3:
+    Q = FIX2INT(argv[0]);
+    alpha = NUM2DBL(argv[1]);
+    beta = NUM2DBL(argv[2]);
+    break;
+  case 2:
+    Q = z->size;
+    alpha = NUM2DBL(argv[0]);
+    beta = NUM2DBL(argv[1]);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments.");
+  }
+  (*f)(imat->data, zp->data, np, z->data, Q, alpha, beta);
+  if (status != GSL_SUCCESS) rb_raise(rb_eRuntimeError, "Some error.");
+  return vimat;
+}
+
+static VALUE rb_jac_interpmat_gj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_interpmat_eval(argc, argv, jac_interpmat_gj);
+}
+
+static VALUE rb_jac_interpmat_glj(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_interpmat_eval(argc, argv, jac_interpmat_glj);
+}
+static VALUE rb_jac_interpmat_grjm(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_interpmat_eval(argc, argv, jac_interpmat_grjm);
+}
+static VALUE rb_jac_interpmat_grjp(int argc, VALUE *argv, VALUE module)
+{
+  return rb_jac_interpmat_eval(argc, argv, jac_interpmat_grjp);
+}
+void Init_jacobi(VALUE module)
+{
+  VALUE mjac, cjacq;
+
+  mjac = rb_define_module("Jac");
+  jac_define_const(mjac);
+  cjacq = rb_define_class_under(mjac, "Quadrature", cGSL_Object);
+
+  rb_define_module_function(mjac, "jacobi_P0_e", rb_jac_jacobi_P0_e, 3);
+  rb_define_module_function(mjac, "jacobi_P0", rb_jac_jacobi_P0, 3);
+  rb_define_module_function(mjac, "jacobi_P1_e", rb_jac_jacobi_P1_e, 3);
+  rb_define_module_function(mjac, "jacobi_P1", rb_jac_jacobi_P1, 3);
+  rb_define_module_function(mjac, "jacobi", rb_jac_jacobi, -1);
+  rb_define_module_function(mjac, "djacobi_P0_e", rb_jac_djacobi_P0_e, 3);
+  rb_define_module_function(mjac, "djacobi_P0", rb_jac_djacobi_P0, 3);
+  rb_define_module_function(mjac, "djacobi_P1_e", rb_jac_djacobi_P1_e, 3);
+  rb_define_module_function(mjac, "djacobi_P1", rb_jac_djacobi_P1, 3);
+  rb_define_module_function(mjac, "djacobi", rb_jac_djacobi, 4);
+
+  rb_define_module_function(mjac, "jacobi_zeros", rb_jac_jacobi_zeros, -1);
+
+  /*****/
+  rb_define_singleton_method(cjacq, "alloc", rb_jac_quadrature_alloc, 1);
+  rb_define_method(cjacq, "Q", rb_jac_quadrature_Q, 0);
+  rb_define_method(cjacq, "type", rb_jac_quadrature_type, 0);
+  rb_define_method(cjacq, "alpha", rb_jac_quadrature_alpha, 0);
+  rb_define_method(cjacq, "beta", rb_jac_quadrature_beta, 0);
+  rb_define_method(cjacq, "x", rb_jac_quadrature_x, 0);
+  rb_define_method(cjacq, "w", rb_jac_quadrature_w, 0);
+  rb_define_method(cjacq, "D", rb_jac_quadrature_D, 0);
+  rb_define_method(cjacq, "xp", rb_jac_quadrature_xp, 0);
+  rb_define_method(cjacq, "interpmat_alloc", rb_jac_interpmat_alloc, -1);
+  rb_define_method(cjacq, "interpmat_free", rb_jac_interpmat_free, 0);
+  rb_define_method(cjacq, "zwd", rb_jac_quadrature_zwd, -1);
+  rb_define_method(cjacq, "integrate", rb_jac_integrate, 1);
+  rb_define_method(cjacq, "interpolate", rb_jac_interpolate, -1);
+  rb_define_method(cjacq, "differentiate", rb_jac_differentiate, -1);
+  /*****/
+  rb_define_module_function(mjac, "diffmat_gj", rb_jac_diffmat_gj, -1);
+  rb_define_module_function(mjac, "diffmat_glj", rb_jac_diffmat_glj, -1);
+  rb_define_module_function(mjac, "diffmat_grjm", rb_jac_diffmat_grjm, -1);
+  rb_define_module_function(mjac, "diffmat_grjp", rb_jac_diffmat_grjp, -1);
+
+  rb_define_module_function(mjac, "weights_gj", rb_jac_weights_gj, -1);
+  rb_define_module_function(mjac, "weights_glj", rb_jac_weights_glj, -1);
+  rb_define_module_function(mjac, "weights_grjm", rb_jac_weights_grjm, -1);
+  rb_define_module_function(mjac, "weights_grjp", rb_jac_weights_grjp, -1);
+
+  rb_define_module_function(mjac, "zeros_gj", rb_jac_zeros_gj, -1);
+  rb_define_module_function(mjac, "zeros_glj", rb_jac_zeros_glj, -1);
+  rb_define_module_function(mjac, "zeros_grjm", rb_jac_zeros_grjm, -1);
+  rb_define_module_function(mjac, "zeros_grjp", rb_jac_zeros_grjp, -1);
+
+  rb_define_module_function(mjac, "lagrange_gj", rb_jac_lagrange_gj, -1);
+  rb_define_module_function(mjac, "lagrange_glj", rb_jac_lagrange_glj, -1);
+  rb_define_module_function(mjac, "lagrange_grjm", rb_jac_lagrange_grjm, -1);
+  rb_define_module_function(mjac, "lagrange_grjp", rb_jac_lagrange_grjp, -1);
+
+  rb_define_module_function(mjac, "interpmat_gj", rb_jac_interpmat_gj, -1);
+  rb_define_module_function(mjac, "interpmat_glj", rb_jac_interpmat_glj, -1);
+  rb_define_module_function(mjac, "interpmat_grjm", rb_jac_interpmat_grjm, -1);
+  rb_define_module_function(mjac, "interpmat_grjp", rb_jac_interpmat_grjp, -1);
+
+}
+
+#endif
+
diff --git a/ext/gsl/linalg.c b/ext/gsl_native/linalg.c
similarity index 91%
rename from ext/gsl/linalg.c
rename to ext/gsl_native/linalg.c
index 29ae415..22acf0e 100644
--- a/ext/gsl/linalg.c
+++ b/ext/gsl_native/linalg.c
@@ -38,7 +38,40 @@ enum {
 
 #ifdef HAVE_NARRAY_H
 static VALUE rb_gsl_linalg_LU_decomp_narray(int argc, VALUE *argv, VALUE obj,
-					    int flag);
+                                            int flag)
+{
+  struct NARRAY *na, *na2;
+  VALUE m;
+  gsl_matrix_view mv;
+  gsl_permutation *p;
+  int signum;
+
+  if (argc != 1)
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
+  GetNArray(argv[0], na);
+  if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
+  if (na->shape[0] != na->shape[1])
+    rb_raise(rb_eRuntimeError, "square matrix required");
+  if (flag == LINALG_DECOMP) {
+    m = na_make_object(NA_DFLOAT, 2, na->shape, CLASS_OF(argv[0]));
+    GetNArray(m, na2);
+    memcpy((double*)na2->ptr, (double*)na->ptr, sizeof(double)*na2->total);
+    mv = gsl_matrix_view_array((double*)na2->ptr, na->shape[1], na->shape[0]);
+  } else {
+    mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
+  }
+  p = gsl_permutation_alloc(mv.matrix.size1);
+  gsl_linalg_LU_decomp(&mv.matrix, p, &signum);
+  if (flag == LINALG_DECOMP) {
+    return rb_ary_new3(3, m,
+                       Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
+                       INT2FIX(signum));
+  } else {
+    return rb_ary_new3(3, argv[0],
+                       Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
+                       INT2FIX(signum));
+  }
+}
 #endif
 
 static VALUE rb_gsl_linalg_LU_decomposition(int argc, VALUE *argv, VALUE obj, int flag)
@@ -51,7 +84,7 @@ static VALUE rb_gsl_linalg_LU_decomposition(int argc, VALUE *argv, VALUE obj, in
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
 #ifdef HAVE_NARRAY_H
-    if (NA_IsNArray(argv[0])) 
+    if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_LU_decomp_narray(argc, argv, obj, flag);
 #endif
     if (MATRIX_COMPLEX_P(argv[0]))
@@ -109,45 +142,6 @@ static VALUE rb_gsl_linalg_LU_decomp_bang(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_LU_decomposition(argc, argv, obj, LINALG_DECOMP_BANG);
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_LU_decomp_narray(int argc, VALUE *argv, VALUE obj,
-					    int flag)
-{
-  struct NARRAY *na, *na2;
-  VALUE m;
-  gsl_matrix_view mv;
-  gsl_permutation *p;
-  int signum;
-
-  if (argc != 1) 
-    rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
-  GetNArray(argv[0], na);
-  if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
-  if (na->shape[0] != na->shape[1])
-    rb_raise(rb_eRuntimeError, "square matrix required");
-  if (flag == LINALG_DECOMP) {
-    m = na_make_object(NA_DFLOAT, 2, na->shape, CLASS_OF(argv[0]));
-    GetNArray(m, na2);
-    memcpy((double*)na2->ptr, (double*)na->ptr, sizeof(double)*na2->total);
-    mv = gsl_matrix_view_array((double*)na2->ptr, na->shape[1], na->shape[0]);
-  } else {
-    mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
-  }
-  p = gsl_permutation_alloc(mv.matrix.size1);
-  gsl_linalg_LU_decomp(&mv.matrix, p, &signum);
-  if (flag == LINALG_DECOMP) {
-    return rb_ary_new3(3, m, 
-		       Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
-		       INT2FIX(signum));
-  } else {
-    return rb_ary_new3(3, argv[0], 
-		Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
-		INT2FIX(signum));
-  }
-  
-}
-#endif
-
 static gsl_matrix* get_matrix(VALUE obj, VALUE klass,int *flagm);
 static gsl_permutation* get_permutation(VALUE obj,  size_t size, int *flagp);
 static gsl_vector* get_vector2(VALUE obj,  int *flagv);
@@ -155,15 +149,13 @@ static gsl_vector* get_vector2(VALUE obj,  int *flagv);
 static gsl_matrix* get_matrix(VALUE obj, VALUE klass, int *flagm)
 {
   gsl_matrix *mtmp = NULL, *m = NULL;
-#ifdef HAVE_NARRAY_H
-  gsl_matrix_view mv;
-  struct NARRAY *na;
-#endif
   if (CLASS_OF(obj) == klass) {
     Data_Get_Struct(obj, gsl_matrix, m);
     *flagm = 0;
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(obj)) {
+    gsl_matrix_view mv;
+    struct NARRAY *na;
     GetNArray(obj, na);
     mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
     m = &mv.matrix;
@@ -194,15 +186,13 @@ static gsl_permutation* get_permutation(VALUE obj, size_t size, int *flagp)
 static gsl_vector* get_vector2(VALUE obj, int *flagv)
 {
   gsl_vector *v = NULL;
-#ifdef HAVE_NARRAY_H
-  gsl_vector_view vv;
-  struct NARRAY *na;
-#endif
   if (TYPE(obj) == T_ARRAY) {
     v = make_cvector_from_rarray(obj);
     *flagv = 1;
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(obj)) {
+    gsl_vector_view vv;
+    struct NARRAY *na;
     GetNArray(obj, na);
     vv = gsl_vector_view_array((double*) na->ptr, na->total);
     v = &vv.vector;
@@ -217,7 +207,36 @@ static gsl_vector* get_vector2(VALUE obj, int *flagv)
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_LU_solve_narray(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_gsl_linalg_LU_solve_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *na, *b;
+  VALUE ret;
+  gsl_permutation *p;
+  gsl_matrix_view mv;
+  gsl_vector_view bv, xv;
+  double *x;
+  int shape[1];
+  if (argc < 3)
+    rb_raise(rb_eArgError,
+             "wrong number of arguments %d(NArray, GSL::Permutation and NArray expected",
+             argc);
+  GetNArray(argv[0], na);
+  mv = gsl_matrix_view_array((double*) na->ptr, na->shape[1], na->shape[0]);
+  CHECK_PERMUTATION(argv[1]);
+  Data_Get_Struct(argv[1], gsl_permutation, p);
+  GetNArray(argv[2], b);
+  bv = gsl_vector_view_array((double*) b->ptr, b->total);
+  if (argc == 3) {
+    shape[0] = b->total;
+    ret = na_make_object(NA_DFLOAT, 1, shape, CLASS_OF(argv[0]));
+  } else {
+    ret = argv[3];
+  }
+  x = NA_PTR_TYPE(ret,double*);
+  xv = gsl_vector_view_array(x, b->total);
+  gsl_linalg_LU_solve(&mv.matrix, p, &bv.vector, &xv.vector);
+  return ret;
+}
 #endif
 
 VALUE rb_gsl_linalg_LU_solve(int argc, VALUE *argv, VALUE obj)
@@ -230,19 +249,18 @@ VALUE rb_gsl_linalg_LU_solve(int argc, VALUE *argv, VALUE obj)
   VALUE bb;
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
-    if (argc < 2 || argc > 4) 
+    if (argc < 2 || argc > 4)
       rb_raise(rb_eArgError, "Usage: solve(m, b), solve(m, b, x), solve(lu, p, b), solve(lu, p, b, x)");
 #ifdef HAVE_NARRAY_H
-    if (NA_IsNArray(argv[0])) 
+    if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_LU_solve_narray(argc, argv, obj);
 #endif
     m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
     itmp = 1;
     break;
   default:
-    if (argc < 1 || argc > 3) 
+    if (argc < 1 || argc > 3)
       rb_raise(rb_eArgError, "Usage: LU_solve(b), LU_solve(p, b), LU_solve(b, x), solve(p, b, x)");
-    
     m = get_matrix(obj, cgsl_matrix_LU, &flagm);
     itmp = 0;
     break;
@@ -252,7 +270,6 @@ VALUE rb_gsl_linalg_LU_solve(int argc, VALUE *argv, VALUE obj)
   p = get_permutation(argv[itmp], size, &flagp);
   if (flagp == 1 && flagm == 0) rb_raise(rb_eArgError, "permutation must be given");
   if (flagp == 0) itmp++;
-
   bb = argv[itmp];
   b = get_vector2(argv[itmp], &flagb);
   itmp++;
@@ -274,42 +291,27 @@ VALUE rb_gsl_linalg_LU_solve(int argc, VALUE *argv, VALUE obj)
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_LU_solve_narray(int argc, VALUE *argv, VALUE obj)
+static VALUE rb_gsl_linalg_LU_svx_narray(int argc, VALUE *argv, VALUE obj)
 {
   struct NARRAY *na, *b;
-  VALUE ret;
   gsl_permutation *p;
   gsl_matrix_view mv;
-  gsl_vector_view bv, xv;
-  double *x;
-  int shape[1];
-  if (argc < 3)
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments %d(NArray, GSL::Permutation and NArray expected", 
-	     argc);
+  gsl_vector_view bv;
+  if (argc != 3)
+    rb_raise(rb_eArgError,
+             "wrong number of arguments %d(NArray, GSL::Permutation and NArray expected",
+             argc);
   GetNArray(argv[0], na);
   mv = gsl_matrix_view_array((double*) na->ptr, na->shape[1], na->shape[0]);
   CHECK_PERMUTATION(argv[1]);
   Data_Get_Struct(argv[1], gsl_permutation, p);
   GetNArray(argv[2], b);
   bv = gsl_vector_view_array((double*) b->ptr, b->total);
-  if (argc == 3) {
-    shape[0] = b->total;
-    ret = na_make_object(NA_DFLOAT, 1, shape, CLASS_OF(argv[0]));
-  } else {
-    ret = argv[3];
-  }
-  x = NA_PTR_TYPE(ret,double*);
-  xv = gsl_vector_view_array(x, b->total);
-  gsl_linalg_LU_solve(&mv.matrix, p, &bv.vector, &xv.vector);
-  return ret;
+  gsl_linalg_LU_svx(&mv.matrix, p, &bv.vector);
+  return argv[2];
 }
 #endif
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_LU_svx_narray(int argc, VALUE *argv, VALUE obj);
-#endif
-
 /* bb must be Vector, it is replaced by the root of the system */
 static VALUE rb_gsl_linalg_LU_svx(int argc, VALUE *argv, VALUE obj)
 {
@@ -321,18 +323,18 @@ static VALUE rb_gsl_linalg_LU_svx(int argc, VALUE *argv, VALUE obj)
 
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
-    if (argc < 2 || argc > 3) 
+    if (argc < 2 || argc > 3)
       rb_raise(rb_eArgError, "Usage: svx(m, b), svx(lu, p, b)");
 #ifdef HAVE_NARRAY_H
-  if (NA_IsNArray(argv[0])) 
-    return rb_gsl_linalg_LU_svx_narray(argc, argv, obj);
+    if (NA_IsNArray(argv[0]))
+      return rb_gsl_linalg_LU_svx_narray(argc, argv, obj);
 #endif
     m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
     itmp = 1;
     break;
   default:
-   if (argc < 1 || argc > 2) 
-     rb_raise(rb_eArgError, "Usage: LU_svx(b), LU_svx(p, b)");
+    if (argc < 1 || argc > 2)
+      rb_raise(rb_eArgError, "Usage: LU_svx(b), LU_svx(p, b)");
     m = get_matrix(obj, cgsl_matrix_LU, &flagm);
     itmp = 0;
     break;
@@ -350,32 +352,10 @@ static VALUE rb_gsl_linalg_LU_svx(int argc, VALUE *argv, VALUE obj)
   return argv[itmp];
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_LU_svx_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *na, *b;
-  gsl_permutation *p;
-  gsl_matrix_view mv;
-  gsl_vector_view bv;
-  if (argc != 3)
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments %d(NArray, GSL::Permutation and NArray expected", 
-	     argc);
-  GetNArray(argv[0], na);
-  mv = gsl_matrix_view_array((double*) na->ptr, na->shape[1], na->shape[0]);
-  CHECK_PERMUTATION(argv[1]);
-  Data_Get_Struct(argv[1], gsl_permutation, p);
-  GetNArray(argv[2], b);
-  bv = gsl_vector_view_array((double*) b->ptr, b->total);
-  gsl_linalg_LU_svx(&mv.matrix, p, &bv.vector);
-  return argv[2];
-}
-#endif
-
 /* singleton */
 static VALUE rb_gsl_linalg_LU_refine(VALUE obj, VALUE vm,
-				     VALUE lu, VALUE pp, VALUE bb,
-				     VALUE xx)
+                                     VALUE lu, VALUE pp, VALUE bb,
+                                     VALUE xx)
 {
   gsl_matrix *m = NULL, *mlu = NULL;
   gsl_permutation *p = NULL;
@@ -403,59 +383,6 @@ static VALUE rb_gsl_linalg_LU_refine(VALUE obj, VALUE vm,
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_LU_invert_narray(int argc, VALUE *argv, VALUE obj);
-#endif
-
-static VALUE rb_gsl_linalg_LU_invert(int argc, VALUE *argv, VALUE obj)
-{
-  gsl_matrix *m = NULL, *inverse = NULL;
-  gsl_permutation *p = NULL;
-  int signum, flagm = 0, flagp = 0, itmp;
-  size_t size;
-  switch (TYPE(obj)) {
-  case T_MODULE:  case T_CLASS:  case T_OBJECT:
-#ifdef HAVE_NARRAY_H
-    if (NA_IsNArray(argv[0]))
-      return rb_gsl_linalg_LU_invert_narray(argc, argv, obj);
-#endif
-    m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
-    itmp = 1;
-    break;
-  default:
-    m = get_matrix(obj, cgsl_matrix_LU, &flagm);
-    itmp = 0;
-  }
-  size = m->size1;
-
-  if (argc == itmp) {
-    p = gsl_permutation_alloc(size);
-    flagp = 1;
-  } else {
-    CHECK_PERMUTATION(argv[itmp]);
-    p = get_permutation(argv[itmp], size, &flagp);
-  }
-  if (flagp == 1 && flagm == 0) rb_raise(rb_eArgError, "permutation must be given");
-  if (flagp == 0) itmp++;
-
-  if (flagm == 1 || flagp == 1) {
-    gsl_linalg_LU_decomp(m, p, &signum);  
-  }
-
-  if (argc-1 == itmp) {
-    CHECK_MATRIX(argv[itmp]);
-    Data_Get_Struct(argv[itmp], gsl_matrix, inverse);
-  } else {
-    inverse = gsl_matrix_alloc(size, size);
-  }
-  gsl_linalg_LU_invert(m, p, inverse);
-  if (flagm == 1) gsl_matrix_free(m);
-  if (flagp == 1) gsl_permutation_free(p);
-  if (argc-1 == itmp) return argv[itmp];
-  else return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, inverse);
-
-}
-
-#ifdef HAVE_NARRAY_H
 static VALUE rb_gsl_linalg_LU_invert_narray(int argc, VALUE *argv, VALUE obj)
 {
   struct NARRAY *na;
@@ -483,7 +410,7 @@ static VALUE rb_gsl_linalg_LU_det_narray(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 2:
     signum = FIX2INT(argv[1]);
-    /* no break */
+  /* no break */
   case 1:
     GetNArray(argv[0], na);
     mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
@@ -512,6 +439,51 @@ static VALUE rb_gsl_linalg_LU_lndet_narray(int argc, VALUE *argv, VALUE obj)
 
 #endif
 
+static VALUE rb_gsl_linalg_LU_invert(int argc, VALUE *argv, VALUE obj)
+{
+  gsl_matrix *m = NULL, *inverse = NULL;
+  gsl_permutation *p = NULL;
+  int signum, flagm = 0, flagp = 0, itmp;
+  size_t size;
+  switch (TYPE(obj)) {
+  case T_MODULE:  case T_CLASS:  case T_OBJECT:
+#ifdef HAVE_NARRAY_H
+    if (NA_IsNArray(argv[0]))
+      return rb_gsl_linalg_LU_invert_narray(argc, argv, obj);
+#endif
+    m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
+    itmp = 1;
+    break;
+  default:
+    m = get_matrix(obj, cgsl_matrix_LU, &flagm);
+    itmp = 0;
+  }
+  size = m->size1;
+
+  if (argc == itmp) {
+    p = gsl_permutation_alloc(size);
+    flagp = 1;
+  } else {
+    CHECK_PERMUTATION(argv[itmp]);
+    p = get_permutation(argv[itmp], size, &flagp);
+  }
+  if (flagp == 1 && flagm == 0) rb_raise(rb_eArgError, "permutation must be given");
+  if (flagp == 0) itmp++;
+  if (flagm == 1 || flagp == 1) {
+    gsl_linalg_LU_decomp(m, p, &signum);
+  }
+  if (argc-1 == itmp) {
+    CHECK_MATRIX(argv[itmp]);
+    Data_Get_Struct(argv[itmp], gsl_matrix, inverse);
+  } else {
+    inverse = gsl_matrix_alloc(size, size);
+  }
+  gsl_linalg_LU_invert(m, p, inverse);
+  if (flagm == 1) gsl_matrix_free(m);
+  if (flagp == 1) gsl_permutation_free(p);
+  if (argc-1 == itmp) return argv[itmp];
+  else return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, inverse);
+}
 static VALUE rb_gsl_linalg_LU_det(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix *m = NULL;
@@ -522,7 +494,7 @@ static VALUE rb_gsl_linalg_LU_det(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc < 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                           argc);
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_LU_det_narray(argc, argv, obj);
@@ -547,8 +519,8 @@ static VALUE rb_gsl_linalg_LU_det(int argc, VALUE *argv, VALUE obj)
       p = gsl_permutation_alloc(size);
       flagp = 1;
     }
-  } 
-  if (flagm == 1) gsl_linalg_LU_decomp(m, p, &sign);  
+  }
+  if (flagm == 1) gsl_linalg_LU_decomp(m, p, &sign);
   det = gsl_linalg_LU_det(m, sign);
   if (flagm == 1) gsl_matrix_free(m);
   if (flagp == 1) gsl_permutation_free(p);
@@ -565,7 +537,7 @@ static VALUE rb_gsl_linalg_LU_lndet(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc < 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                           argc);
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_LU_lndet_narray(argc, argv, obj);
@@ -579,7 +551,7 @@ static VALUE rb_gsl_linalg_LU_lndet(int argc, VALUE *argv, VALUE obj)
   }
   if (flagm == 1) {
     p = gsl_permutation_alloc(m->size1);
-    gsl_linalg_LU_decomp(m, p, &sign);  
+    gsl_linalg_LU_decomp(m, p, &sign);
   }
   lndet = gsl_linalg_LU_lndet(m);
   if (flagm == 1) {
@@ -606,7 +578,7 @@ static VALUE rb_gsl_linalg_LU_sgndet(int argc, VALUE *argv, VALUE obj)
   }
   if (flagm == 1) {
     p = gsl_permutation_alloc(m->size1);
-    gsl_linalg_LU_decomp(m, p, &sign);  
+    gsl_linalg_LU_decomp(m, p, &sign);
   } else {
     if (argc-itmp != 1) rb_raise(rb_eArgError, "sign must be given");
     sign = FIX2INT(argv[itmp]);
@@ -619,12 +591,11 @@ static VALUE rb_gsl_linalg_LU_sgndet(int argc, VALUE *argv, VALUE obj)
   return INT2FIX(signdet);
 }
 
-#ifdef GSL_1_6_LATER
 int gsl_linalg_LQ_solve_T(const gsl_matrix*, const gsl_vector*, const gsl_vector*, gsl_vector*);
 int gsl_linalg_LQ_svx_T (const gsl_matrix*, const gsl_vector*, gsl_vector*);
-int gsl_linalg_LQ_lssolve_T(const gsl_matrix * LQ, const gsl_vector * tau, 
-                           const gsl_vector * b, gsl_vector * x, 
-                           gsl_vector * residual);
+int gsl_linalg_LQ_lssolve_T(const gsl_matrix * LQ, const gsl_vector * tau,
+                            const gsl_vector * b, gsl_vector * x,
+                            gsl_vector * residual);
 int
 gsl_linalg_LQ_Lsolve_T (const gsl_matrix * LQ, const gsl_vector * b, gsl_vector* x);
 int
@@ -632,9 +603,6 @@ gsl_linalg_LQ_Lsvx_T (const gsl_matrix * LQ, gsl_vector * x);
 int
 gsl_linalg_L_solve_T (const gsl_matrix * L, const gsl_vector * b, gsl_vector * x);
 
-
-#endif
-
 enum {
   LINALG_QR_DECOMP,
   LINALG_QR_DECOMP_BANG,
@@ -659,7 +627,7 @@ enum {
 };
 
 static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
-					       int flag)
+                                               int flag)
 {
   gsl_matrix *m = NULL, *mtmp = NULL;
   gsl_vector *tau = NULL;
@@ -679,7 +647,7 @@ static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
     break;
   }
   CHECK_MATRIX(omatrix);
-  Data_Get_Struct(omatrix, gsl_matrix, mtmp);    
+  Data_Get_Struct(omatrix, gsl_matrix, mtmp);
 
   switch (flag) {
   case LINALG_QR_DECOMP:
@@ -693,7 +661,6 @@ static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
     mdecomp = omatrix;
     RBGSL_SET_CLASS(mdecomp, cgsl_matrix_QR);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_DECOMP:
     fdecomp = &gsl_linalg_LQ_decomp;
     m = make_matrix_clone(mtmp);
@@ -705,7 +672,6 @@ static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
     mdecomp = omatrix;
     RBGSL_SET_CLASS(mdecomp, cgsl_matrix_LQ);
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -736,7 +702,7 @@ static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
     break;
   case LINALG_QR_DECOMP_BANG:
   case LINALG_LQ_DECOMP_BANG:
-   if (argc == itmp) {
+    if (argc == itmp) {
       return Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
     } else {
       RBGSL_SET_CLASS(argv[itmp], cgsl_vector_tau);
@@ -751,7 +717,88 @@ static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
 }
 
 #ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_QR_decomp_narray(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_gsl_linalg_QR_decomp_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *na;
+  gsl_matrix_view mv;
+  gsl_vector_view vv;
+  int shapem[2], shapev[1];
+  VALUE qr, tau;
+  if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
+  GetNArray(argv[0], na);
+  shapem[0] = na->shape[1];
+  shapem[1] = na->shape[1];
+  shapev[0] = shapem[0];
+  qr = na_make_object(NA_DFLOAT, 2, shapem, CLASS_OF(argv[0]));
+  tau = na_make_object(NA_DFLOAT, 1, shapev, cNVector);
+  memcpy(NA_PTR_TYPE(qr,double*),na->ptr,sizeof(double)*shapem[0]*shapem[1]);
+  mv = gsl_matrix_view_array(NA_PTR_TYPE(qr,double*), shapem[0], shapem[1]);
+  vv = gsl_vector_view_array(NA_PTR_TYPE(tau,double*), shapev[0]);
+  gsl_linalg_QR_decomp(&mv.matrix, &vv.vector);
+  return rb_ary_new3(2, qr, tau);
+}
+
+static VALUE rb_gsl_linalg_QR_unpack_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *m, *tau;
+  gsl_matrix_view mv, mq, mr;
+  gsl_vector_view vv;
+  int shape[2];
+  VALUE q, r;
+  if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
+                          argc);
+  GetNArray(argv[0], m);
+  GetNArray(argv[1], tau);
+  mv = gsl_matrix_view_array((double*)m->ptr, m->shape[1], m->shape[0]);
+  vv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
+  shape[0] = m->shape[1];
+  shape[1] = m->shape[1];
+  q = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
+  shape[0] = m->shape[1];
+  shape[1] = m->shape[0];
+  r = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
+  mq = gsl_matrix_view_array(NA_PTR_TYPE(q,double*), m->shape[1], m->shape[1]);
+  mr = gsl_matrix_view_array(NA_PTR_TYPE(r,double*), m->shape[1], m->shape[0]);
+  //  printf("OK 4 %d %d\n", mq.matrix.size1, mr.matrix.size2);
+  gsl_linalg_QR_unpack(&mv.matrix, &vv.vector, &mq.matrix, &mr.matrix);
+  //  printf("OK 5\n");
+  return rb_ary_new3(2, q, r);
+}
+
+static VALUE rb_gsl_linalg_QR_solve_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *qr, *tau, *b;
+  VALUE x;
+  gsl_matrix_view mv;
+  gsl_vector_view tv, bv, xv;
+  if (argc != 3) rb_raise(rb_eArgError, "Usage: QR.solve(qr, tau, b)");
+  GetNArray(argv[0], qr);
+  GetNArray(argv[1], tau);
+  GetNArray(argv[2], b);
+  x = na_make_object(NA_DFLOAT, 1, b->shape, CLASS_OF(argv[2]));
+  mv = gsl_matrix_view_array((double*)qr->ptr, qr->shape[1], qr->shape[0]);
+  tv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
+  bv = gsl_vector_view_array((double*)b->ptr, b->shape[0]);
+  xv = gsl_vector_view_array(NA_PTR_TYPE(x,double*), b->shape[0]);
+  gsl_linalg_QR_solve(&mv.matrix, &tv.vector, &bv.vector, &xv.vector);
+  return x;
+}
+static VALUE rb_gsl_linalg_QR_svx_narray(int argc, VALUE *argv, VALUE obj)
+{
+  struct NARRAY *qr, *tau, *b;
+  gsl_matrix_view mv;
+  gsl_vector_view tv, bv;
+  if (argc != 3) rb_raise(rb_eArgError, "Usage: QR.solve(qr, tau, b)");
+  GetNArray(argv[0], qr);
+  GetNArray(argv[1], tau);
+  GetNArray(argv[2], b);
+  mv = gsl_matrix_view_array((double*)qr->ptr, qr->shape[1], qr->shape[0]);
+  tv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
+  bv = gsl_vector_view_array((double*)b->ptr, b->shape[0]);
+  gsl_linalg_QR_svx(&mv.matrix, &tv.vector, &bv.vector);
+  return argv[2];
+}
+
 #endif
 
 static VALUE rb_gsl_linalg_QR_decomp(int argc, VALUE *argv, VALUE obj)
@@ -768,7 +815,6 @@ static VALUE rb_gsl_linalg_QR_decomp_bang(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_QR_DECOMP_BANG);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_LQ_decomp(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_LQ_DECOMP);
@@ -778,7 +824,6 @@ static VALUE rb_gsl_linalg_LQ_decomp_bang(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_LQ_DECOMP_BANG);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QR_LQ_solve(int argc, VALUE *argv, VALUE obj, int flag)
 {
@@ -810,13 +855,11 @@ static VALUE rb_gsl_linalg_QR_LQ_solve(int argc, VALUE *argv, VALUE obj, int fla
     fdecomp = &gsl_linalg_QR_decomp;
     fsolve = &gsl_linalg_QR_solve;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_SOLVE:
     m = get_matrix(omatrix, cgsl_matrix_LQ, &flagm);
     fdecomp = &gsl_linalg_LQ_decomp;
     fsolve = &gsl_linalg_LQ_solve_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operatioin");
     break;
@@ -878,7 +921,7 @@ static VALUE rb_gsl_linalg_QR_LQ_svx(int argc, VALUE *argv, VALUE obj, int flag)
     itmp = 0;
     break;
   }
-  if (argc-itmp < 1 || argc-itmp > 2) 
+  if (argc-itmp < 1 || argc-itmp > 2)
     rb_raise(rb_eArgError,  "wrong number of arguments");
   CHECK_MATRIX(omatrix);
   switch (flag) {
@@ -887,13 +930,11 @@ static VALUE rb_gsl_linalg_QR_LQ_svx(int argc, VALUE *argv, VALUE obj, int flag)
     fdecomp = &gsl_linalg_QR_decomp;
     fsvx = &gsl_linalg_QR_svx;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_SOLVE:
     m = get_matrix(omatrix, cgsl_matrix_LQ, &flagm);
     fdecomp = &gsl_linalg_LQ_decomp;
     fsvx = &gsl_linalg_LQ_svx_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operatioin");
     break;
@@ -932,7 +973,7 @@ static VALUE rb_gsl_linalg_QR_LQ_lssolve(int argc, VALUE *argv, VALUE obj, int f
   size_t size;
   int (*fdecomp)(gsl_matrix*, gsl_vector*);
   int (*flssolve)(const gsl_matrix*, const gsl_vector*, const gsl_vector*, gsl_vector*,
-		  gsl_vector*);
+                  gsl_vector*);
 
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
@@ -954,13 +995,11 @@ static VALUE rb_gsl_linalg_QR_LQ_lssolve(int argc, VALUE *argv, VALUE obj, int f
     fdecomp = &gsl_linalg_QR_decomp;
     flssolve = &gsl_linalg_QR_lssolve;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_SOLVE:
     m = get_matrix(omatrix, cgsl_matrix_LQ, &flagm);
     fdecomp = &gsl_linalg_LQ_decomp;
     flssolve = &gsl_linalg_LQ_lssolve_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operatioin");
     break;
@@ -1009,7 +1048,6 @@ static VALUE rb_gsl_linalg_QR_LQ_lssolve(int argc, VALUE *argv, VALUE obj, int f
   if (flagm == 1) gsl_matrix_free(m);
   if (flagt == 1) gsl_vector_free(tau);
   if (flagb == 1) gsl_vector_free(b);
-
   switch (argc - itmp) {
   case 2:
     return INT2FIX(status);
@@ -1019,16 +1057,11 @@ static VALUE rb_gsl_linalg_QR_LQ_lssolve(int argc, VALUE *argv, VALUE obj, int f
     break;
   default:
     return rb_ary_new3(2, Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x),
-		       Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, r));
+                       Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, r));
   }
   return Qnil;
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_QR_solve_narray(int argc, VALUE *argv, VALUE obj);
-static VALUE rb_gsl_linalg_QR_svx_narray(int argc, VALUE *argv, VALUE obj);
-#endif
-
 static VALUE rb_gsl_linalg_QR_solve(int argc, VALUE *argv, VALUE obj)
 {
 #ifdef HAVE_NARRAY_H
@@ -1052,7 +1085,6 @@ static VALUE rb_gsl_linalg_QR_lssolve(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QR_LQ_lssolve(argc, argv, obj, LINALG_QR_SOLVE);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_LQ_solve(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QR_LQ_solve(argc, argv, obj, LINALG_LQ_SOLVE);
@@ -1067,18 +1099,17 @@ static VALUE rb_gsl_linalg_LQ_lssolve(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QR_LQ_lssolve(argc, argv, obj, LINALG_LQ_SOLVE);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QRLQ_QTvec(int argc, VALUE *argv, VALUE obj,
-				      int flag)
+                                      int flag)
 {
   gsl_matrix *QR = NULL;
   gsl_vector *tau = NULL, *v = NULL;
   VALUE ret;
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
-    if (argc != 3) rb_raise(rb_eArgError, 
-			    "wrong number of arguments (%d for 3)", argc); 
+    if (argc != 3) rb_raise(rb_eArgError,
+                            "wrong number of arguments (%d for 3)", argc);
     CHECK_MATRIX(argv[0]); CHECK_VECTOR(argv[1]); CHECK_VECTOR(argv[2]);
     Data_Get_Struct(argv[0], gsl_matrix, QR);
     Data_Get_Struct(argv[1], gsl_vector, tau);
@@ -1086,8 +1117,8 @@ static VALUE rb_gsl_linalg_QRLQ_QTvec(int argc, VALUE *argv, VALUE obj,
     ret = argv[2];
     break;
   default:
-    if (argc != 2) rb_raise(rb_eArgError, 
-			    "wrong number of arguments (%d for 2)", argc); 
+    if (argc != 2) rb_raise(rb_eArgError,
+                            "wrong number of arguments (%d for 2)", argc);
     CHECK_VECTOR(argv[2]); CHECK_VECTOR(argv[1]);
     Data_Get_Struct(obj, gsl_matrix, QR);
     Data_Get_Struct(argv[0], gsl_vector, tau);
@@ -1102,14 +1133,12 @@ static VALUE rb_gsl_linalg_QRLQ_QTvec(int argc, VALUE *argv, VALUE obj,
   case LINALG_QR_Qvec:
     gsl_linalg_QR_Qvec(QR, tau, v);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_vecQ:
     gsl_linalg_LQ_vecQ(QR, tau, v);
     break;
   case LINALG_LQ_vecQT:
     gsl_linalg_LQ_vecQT(QR, tau, v);
     break;
-#endif
   default:
     break;
   }
@@ -1126,7 +1155,6 @@ static VALUE rb_gsl_linalg_QR_Qvec(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QRLQ_QTvec(argc, argv, obj, LINALG_QR_Qvec);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_LQ_vecQT(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQ_QTvec(argc, argv, obj, LINALG_LQ_vecQT);
@@ -1136,10 +1164,9 @@ static VALUE rb_gsl_linalg_LQ_vecQ(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQ_QTvec(argc, argv, obj, LINALG_LQ_vecQ);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QRLQ_unpack(int argc, VALUE *argv, VALUE obj,
-				       int flag)
+                                       int flag)
 {
   gsl_matrix *QR = NULL, *Q = NULL, *R = NULL;
   gsl_vector *tau = NULL;
@@ -1158,14 +1185,14 @@ static VALUE rb_gsl_linalg_QRLQ_unpack(int argc, VALUE *argv, VALUE obj,
   }
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
-    if (argc != 2) rb_raise(rb_eArgError, 
-			    "wrong number of arguments (%d for 2)", argc);
+    if (argc != 2) rb_raise(rb_eArgError,
+                            "wrong number of arguments (%d for 2)", argc);
     vtmp = argv[0];
     itmp = 1;
     break;
   default:
-    if (argc != 1) rb_raise(rb_eArgError, 
-			    "wrong number of arguments (%d for 1)", argc);
+    if (argc != 1) rb_raise(rb_eArgError,
+                            "wrong number of arguments (%d for 1)", argc);
     vtmp = obj;
     itmp = 0;
     break;
@@ -1186,13 +1213,11 @@ static VALUE rb_gsl_linalg_QRLQ_unpack(int argc, VALUE *argv, VALUE obj,
     vQ = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, Q);
     vR = Data_Wrap_Struct(cgsl_matrix_R, 0, gsl_matrix_free, R);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_UNPACK:
-  gsl_linalg_LQ_unpack(QR, tau, Q, R);
-  vQ = Data_Wrap_Struct(cgsl_matrix_L, 0, gsl_matrix_free, Q);
-  vR = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, R);
+    gsl_linalg_LQ_unpack(QR, tau, Q, R);
+    vQ = Data_Wrap_Struct(cgsl_matrix_L, 0, gsl_matrix_free, Q);
+    vR = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, R);
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1200,10 +1225,6 @@ static VALUE rb_gsl_linalg_QRLQ_unpack(int argc, VALUE *argv, VALUE obj,
   return rb_ary_new3(2, vQ, vR);
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_QR_unpack_narray(int argc, VALUE *argv, VALUE obj);
-#endif
-
 static VALUE rb_gsl_linalg_QR_unpack(int argc, VALUE *argv, VALUE obj)
 {
 #ifdef HAVE_NARRAY_H
@@ -1213,16 +1234,14 @@ static VALUE rb_gsl_linalg_QR_unpack(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QRLQ_unpack(argc, argv, obj, LINALG_QR_UNPACK);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_LQ_unpack(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQ_unpack(argc, argv, obj, LINALG_LQ_UNPACK);
 }
-#endif
 
 /* singleton */
 static VALUE rb_gsl_linalg_QRLQ_QRLQsolve(int argc, VALUE *argv, VALUE obj,
-					  int flag)
+                                          int flag)
 {
   gsl_matrix *Q = NULL, *R = NULL;
   gsl_vector *b = NULL, *x = NULL;
@@ -1251,21 +1270,19 @@ static VALUE rb_gsl_linalg_QRLQ_QRLQsolve(int argc, VALUE *argv, VALUE obj,
   }
   switch (flag) {
   case LINALG_QR_DECOMP:
-    if (CLASS_OF(argv[0]) != cgsl_matrix_Q) 
+    if (CLASS_OF(argv[0]) != cgsl_matrix_Q)
       rb_raise(rb_eTypeError, "not a Q matrix");
-    if (CLASS_OF(argv[1]) != cgsl_matrix_R) 
+    if (CLASS_OF(argv[1]) != cgsl_matrix_R)
       rb_raise(rb_eTypeError, "not a R matrix");
     fsolve = &gsl_linalg_QR_QRsolve;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_DECOMP:
-    /*    if (CLASS_OF(argv[0]) != cgsl_matrix_L) 
+    /*    if (CLASS_OF(argv[0]) != cgsl_matrix_L)
       rb_raise(rb_eTypeError, "not a L matrix");
-    if (CLASS_OF(argv[1]) != cgsl_matrix_Q) 
+    if (CLASS_OF(argv[1]) != cgsl_matrix_Q)
     rb_raise(rb_eTypeError, "not a Q matrix");*/
     fsolve = &gsl_linalg_LQ_LQsolve;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1284,7 +1301,7 @@ static VALUE rb_gsl_linalg_QRLQ_QRLQsolve(int argc, VALUE *argv, VALUE obj,
 
 /*****/
 static VALUE rb_gsl_linalg_QRLQ_RLsolve(int argc, VALUE *argv, VALUE obj,
-					  int flag)
+                                        int flag)
 {
   gsl_matrix *QR = NULL, *mtmp;
   gsl_vector *b = NULL, *x = NULL, *tau = NULL;
@@ -1338,7 +1355,6 @@ static VALUE rb_gsl_linalg_QRLQ_RLsolve(int argc, VALUE *argv, VALUE obj,
     }
     fsolve = &gsl_linalg_R_solve;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_LSOLVE:
     if (CLASS_OF(omatrix) != cgsl_matrix_LQ) {
       QR = make_matrix_clone(mtmp);
@@ -1357,7 +1373,6 @@ static VALUE rb_gsl_linalg_QRLQ_RLsolve(int argc, VALUE *argv, VALUE obj,
     }
     fsolve = &gsl_linalg_L_solve_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1379,7 +1394,7 @@ static VALUE rb_gsl_linalg_QRLQ_RLsolve(int argc, VALUE *argv, VALUE obj,
 }
 
 static VALUE rb_gsl_linalg_QRLQ_RLsvx(int argc, VALUE *argv, VALUE obj,
-					  int flag)
+                                      int flag)
 {
   gsl_matrix *QR = NULL, *mtmp;
   gsl_vector *x = NULL, *tau = NULL;
@@ -1424,18 +1439,17 @@ static VALUE rb_gsl_linalg_QRLQ_RLsvx(int argc, VALUE *argv, VALUE obj,
     }
     fsolve = &gsl_linalg_QR_Rsvx;
     break;
-    /*
-  case LINALG_R_SVX:
-    if (CLASS_OF(omatrix) != cgsl_matrix_QR) {
-      QR = make_matrix_clone(mtmp);
-      tau = gsl_vector_alloc(QR->size1);
-      gsl_linalg_QR_decomp(QR, tau);
-      flagq = 1;
-    }
-    fsolve = &gsl_linalg_R_svx;
-    break;
-    */
-#ifdef GSL_1_6_LATER
+  /*
+case LINALG_R_SVX:
+  if (CLASS_OF(omatrix) != cgsl_matrix_QR) {
+    QR = make_matrix_clone(mtmp);
+    tau = gsl_vector_alloc(QR->size1);
+    gsl_linalg_QR_decomp(QR, tau);
+    flagq = 1;
+  }
+  fsolve = &gsl_linalg_R_svx;
+  break;
+  */
   case LINALG_LQ_LSVX:
     if (CLASS_OF(omatrix) != cgsl_matrix_LQ) {
       QR = make_matrix_clone(mtmp);
@@ -1445,7 +1459,6 @@ static VALUE rb_gsl_linalg_QRLQ_RLsvx(int argc, VALUE *argv, VALUE obj,
     }
     fsolve = &gsl_linalg_LQ_Lsvx_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1475,12 +1488,11 @@ static VALUE rb_gsl_linalg_R_solve(int argc, VALUE *argv, VALUE obj)
 
 /* singleton */
 static VALUE rb_gsl_linalg_QR_QRsolve(int argc, VALUE *argv, VALUE obj,
-					  int flag)
+                                      int flag)
 {
   return rb_gsl_linalg_QRLQ_QRLQsolve(argc, argv, obj, LINALG_QR_DECOMP);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_LQ_Lsolve(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQ_RLsolve(argc, argv, obj, LINALG_LQ_LSOLVE);
@@ -1498,14 +1510,13 @@ static VALUE rb_gsl_linalg_L_solve(int argc, VALUE *argv, VALUE obj)
 
 /* singleton */
 static VALUE rb_gsl_linalg_LQ_LQsolve(int argc, VALUE *argv, VALUE obj,
-					  int flag)
+                                      int flag)
 {
   return rb_gsl_linalg_QRLQ_QRLQsolve(argc, argv, obj, LINALG_LQ_DECOMP);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QRLQ_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
-				     VALUE vv, int flag)
+                                       VALUE vv, int flag)
 {
   gsl_matrix *Q = NULL, *R = NULL;
   gsl_vector *w = NULL, *v = NULL;
@@ -1520,11 +1531,9 @@ static VALUE rb_gsl_linalg_QRLQ_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
   case LINALG_QR_DECOMP:
     status = gsl_linalg_QR_update(Q, R, w, v);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_LQ_DECOMP:
     status = gsl_linalg_LQ_update(Q, R, w, v);
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1534,18 +1543,16 @@ static VALUE rb_gsl_linalg_QRLQ_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
 
 /* singleton */
 static VALUE rb_gsl_linalg_QR_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
-				     VALUE vv)
+                                     VALUE vv)
 {
   return rb_gsl_linalg_QRLQ_update(obj, qq, rr, ww, vv, LINALG_QR_DECOMP);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_LQ_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
-				     VALUE vv)
+                                     VALUE vv)
 {
   return rb_gsl_linalg_QRLQ_update(obj, qq, rr, ww, vv, LINALG_LQ_DECOMP);
 }
-#endif
 
 /******/
 enum {
@@ -1564,7 +1571,7 @@ static VALUE rb_gsl_linalg_QRLQPT_decomp(int argc, VALUE *argv, VALUE obj, int f
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     vA = argv[0];
     break;
   default:
@@ -1585,14 +1592,12 @@ static VALUE rb_gsl_linalg_QRLQPT_decomp(int argc, VALUE *argv, VALUE obj, int f
     vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
     gsl_linalg_QRPT_decomp(QR, tau, p, &signum, norm);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     vQR = Data_Wrap_Struct(cgsl_matrix_PTLQ, 0, gsl_matrix_free, QR);
     vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
     vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
     gsl_linalg_PTLQ_decomp(QR, tau, p, &signum, norm);
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1612,7 +1617,7 @@ static VALUE rb_gsl_linalg_QRLQPT_decomp_bang(int argc, VALUE *argv, VALUE obj,
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     vA = argv[0];
     break;
   default:
@@ -1632,14 +1637,12 @@ static VALUE rb_gsl_linalg_QRLQPT_decomp_bang(int argc, VALUE *argv, VALUE obj,
     vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
     gsl_linalg_QRPT_decomp(A, tau, p, &signum, norm);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     RBGSL_SET_CLASS(vA, cgsl_matrix_PTLQ);
     vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
     vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
     gsl_linalg_PTLQ_decomp(A, tau, p, &signum, norm);
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1658,7 +1661,6 @@ static VALUE rb_gsl_linalg_QRPT_decomp_bang(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QRLQPT_decomp_bang(argc, argv, obj, LINALG_QRPT);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_PTLQ_decomp(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_decomp(argc, argv, obj, LINALG_PTLQ);
@@ -1668,7 +1670,6 @@ static VALUE rb_gsl_linalg_PTLQ_decomp_bang(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_decomp_bang(argc, argv, obj, LINALG_PTLQ);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QRLQPT_decomp2(int argc, VALUE *argv, VALUE obj,int flag)
 {
@@ -1706,13 +1707,11 @@ static VALUE rb_gsl_linalg_QRLQPT_decomp2(int argc, VALUE *argv, VALUE obj,int f
     vR = Data_Wrap_Struct(cgsl_matrix_R, 0, gsl_matrix_free, R);
     gsl_linalg_QRPT_decomp2(A, Q, R, tau, p, &signum, norm);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     vR = Data_Wrap_Struct(cgsl_matrix_L, 0, gsl_matrix_free, R);
     vQ = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, Q);
     gsl_linalg_PTLQ_decomp2(A, Q, R, tau, p, &signum, norm);
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
   }
@@ -1725,33 +1724,29 @@ static VALUE rb_gsl_linalg_QRPT_decomp2(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QRLQPT_decomp2(argc, argv, obj, LINALG_QRPT);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_PTLQ_decomp2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_decomp2(argc, argv, obj, LINALG_PTLQ);
 }
-#endif
 
-#ifdef GSL_1_6_LATER
 int gsl_linalg_PTLQ_solve_T(const gsl_matrix * QR, const gsl_vector * tau,
-			    const gsl_permutation * p, const gsl_vector * b, 
-			    gsl_vector * x);
+                            const gsl_permutation * p, const gsl_vector * b,
+                            gsl_vector * x);
 int gsl_linalg_PTLQ_svx_T(const gsl_matrix * LQ,
-                         const gsl_vector * tau,
-                         const gsl_permutation * p,
-                         gsl_vector * x);
+                          const gsl_vector * tau,
+                          const gsl_permutation * p,
+                          gsl_vector * x);
 int gsl_linalg_PTLQ_LQsolve_T (const gsl_matrix * Q, const gsl_matrix * L,
-                           const gsl_permutation * p,
-                           const gsl_vector * b,
-                           gsl_vector * x);
+                               const gsl_permutation * p,
+                               const gsl_vector * b,
+                               gsl_vector * x);
 int gsl_linalg_PTLQ_Lsolve_T (const gsl_matrix * LQ,
-                        const gsl_permutation * p,
-                        const gsl_vector * b,
-			  gsl_vector * x);
+                              const gsl_permutation * p,
+                              const gsl_vector * b,
+                              gsl_vector * x);
 int gsl_linalg_PTLQ_Lsvx_T (const gsl_matrix * LQ,
-                        const gsl_permutation * p,
-                        gsl_vector * x);
-#endif
+                            const gsl_permutation * p,
+                            gsl_vector * x);
 
 static VALUE rb_gsl_linalg_QRLQPT_solve(int argc, VALUE *argv, VALUE obj, int flag)
 {
@@ -1762,21 +1757,19 @@ static VALUE rb_gsl_linalg_QRLQPT_solve(int argc, VALUE *argv, VALUE obj, int fl
   VALUE vtmp, klass;
   size_t size0;
   int (*fdecomp)(gsl_matrix*, gsl_vector*, gsl_permutation*, int *, gsl_vector*);
-  int (*fsolve)(const gsl_matrix*, const gsl_vector*, const gsl_permutation*, 
-		const gsl_vector*, gsl_vector *);
+  int (*fsolve)(const gsl_matrix*, const gsl_vector*, const gsl_permutation*,
+                const gsl_vector*, gsl_vector *);
   switch (flag) {
   case LINALG_QRPT:
     klass = cgsl_matrix_QRPT;
     fdecomp = &gsl_linalg_QRPT_decomp;
     fsolve = &gsl_linalg_QRPT_solve;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     klass = cgsl_matrix_PTLQ;
     fdecomp = &gsl_linalg_PTLQ_decomp;
     fsolve = &gsl_linalg_PTLQ_solve_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1794,11 +1787,11 @@ static VALUE rb_gsl_linalg_QRLQPT_solve(int argc, VALUE *argv, VALUE obj, int fl
   }
   CHECK_MATRIX(vtmp);
   if (CLASS_OF(vtmp) == klass) {
-    if (argc-itmp != 3) rb_raise(rb_eArgError, 
-				 "wrong number of arguments (%d for %d)", 
-				 argc, 4-itmp);
+    if (argc-itmp != 3) rb_raise(rb_eArgError,
+                                 "wrong number of arguments (%d for %d)",
+                                 argc, 4-itmp);
     CHECK_VECTOR(argv[itmp]);
-    if (CLASS_OF(argv[itmp]) != cgsl_vector_tau) 
+    if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
       rb_raise(rb_eTypeError, "not a tau vector");
     CHECK_PERMUTATION(argv[itmp+1]);
     Data_Get_Struct(argv[itmp], gsl_vector, tau);
@@ -1807,8 +1800,8 @@ static VALUE rb_gsl_linalg_QRLQPT_solve(int argc, VALUE *argv, VALUE obj, int fl
     size0 = GSL_MIN(QR->size1, QR->size2);
     itmp += 2;
   } else {
-    if (argc-itmp != 1) rb_raise(rb_eArgError, 
-			    "wrong number of arguments (%d for %d)", argc, 2-itmp);
+    if (argc-itmp != 1) rb_raise(rb_eArgError,
+                                 "wrong number of arguments (%d for %d)", argc, 2-itmp);
     Data_Get_Struct(vtmp, gsl_matrix, A);
     QR = make_matrix_clone(A);
     size0 = GSL_MIN(QR->size1, QR->size2);
@@ -1842,12 +1835,10 @@ static VALUE rb_gsl_linalg_QRPT_solve(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QRLQPT_solve(argc, argv, obj, LINALG_QRPT);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_PTLQ_solve(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_solve(argc, argv, obj, LINALG_PTLQ);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QRLQPT_svx(int argc, VALUE *argv, VALUE obj, int flag)
 {
@@ -1858,21 +1849,19 @@ static VALUE rb_gsl_linalg_QRLQPT_svx(int argc, VALUE *argv, VALUE obj, int flag
   VALUE vtmp, klass;
   size_t size0;
   int (*fdecomp)(gsl_matrix*, gsl_vector*, gsl_permutation*, int *, gsl_vector*);
-  int (*fsvx)(const gsl_matrix*, const gsl_vector*, const gsl_permutation*, 
-	      gsl_vector *);
+  int (*fsvx)(const gsl_matrix*, const gsl_vector*, const gsl_permutation*,
+              gsl_vector *);
   switch (flag) {
   case LINALG_QRPT:
     klass = cgsl_matrix_QRPT;
     fdecomp = &gsl_linalg_QRPT_decomp;
     fsvx = &gsl_linalg_QRPT_svx;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     klass = cgsl_matrix_PTLQ;
     fdecomp = &gsl_linalg_PTLQ_decomp;
     fsvx = &gsl_linalg_PTLQ_svx_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1881,7 +1870,7 @@ static VALUE rb_gsl_linalg_QRLQPT_svx(int argc, VALUE *argv, VALUE obj, int flag
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     vtmp = argv[0];
     itmp = 1;
     break;
@@ -1892,11 +1881,11 @@ static VALUE rb_gsl_linalg_QRLQPT_svx(int argc, VALUE *argv, VALUE obj, int flag
   }
   CHECK_MATRIX(vtmp);
   if (CLASS_OF(vtmp) == klass) {
-    if (argc-itmp != 3) rb_raise(rb_eArgError, 
-				 "wrong number of arguments (%d for %d)", 
-				 argc, 3+itmp);
+    if (argc-itmp != 3) rb_raise(rb_eArgError,
+                                 "wrong number of arguments (%d for %d)",
+                                 argc, 3+itmp);
     CHECK_VECTOR(argv[itmp]);
-    if (CLASS_OF(argv[itmp]) != cgsl_vector_tau) 
+    if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
       rb_raise(rb_eTypeError, "not a tau vector");
     CHECK_PERMUTATION(argv[itmp+1]);
     Data_Get_Struct(argv[itmp], gsl_vector, tau);
@@ -1905,8 +1894,8 @@ static VALUE rb_gsl_linalg_QRLQPT_svx(int argc, VALUE *argv, VALUE obj, int flag
     size0 = GSL_MIN(QR->size1, QR->size2);
     itmp += 2;
   } else {
-    if (argc-itmp != 1) rb_raise(rb_eArgError, 
-			    "wrong number of arguments (%d for %d)", argc, 2+itmp);
+    if (argc-itmp != 1) rb_raise(rb_eArgError,
+                                 "wrong number of arguments (%d for %d)", argc, 2+itmp);
     Data_Get_Struct(vtmp, gsl_matrix, A);
     QR = make_matrix_clone(A);
     size0 = GSL_MIN(QR->size1, QR->size2);
@@ -1933,36 +1922,32 @@ static VALUE rb_gsl_linalg_QRPT_svx(int argc, VALUE *argv, VALUE obj)
   return rb_gsl_linalg_QRLQPT_svx(argc, argv, obj, LINALG_QRPT);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_linalg_PTLQ_svx(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_svx(argc, argv, obj, LINALG_PTLQ);
 }
-#endif
 
 /* singleton */
-static VALUE rb_gsl_linalg_QRLQPT_QRLQsolve(VALUE obj, VALUE qq, VALUE rr, 
-					    VALUE pp, VALUE bb, int flag)
+static VALUE rb_gsl_linalg_QRLQPT_QRLQsolve(VALUE obj, VALUE qq, VALUE rr,
+                                            VALUE pp, VALUE bb, int flag)
 {
   gsl_matrix *Q = NULL, *R = NULL;
   gsl_vector *b = NULL, *x = NULL;
   gsl_permutation *p = NULL;
   int flagb = 0;
-  int (*fsolve)(const gsl_matrix*, const gsl_matrix*, const gsl_permutation*, 
-		const gsl_vector*, gsl_vector*);
+  int (*fsolve)(const gsl_matrix*, const gsl_matrix*, const gsl_permutation*,
+                const gsl_vector*, gsl_vector*);
   switch (flag) {
   case LINALG_QRPT:
     if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
     if (CLASS_OF(rr) != cgsl_matrix_R) rb_raise(rb_eTypeError, "not a R matrix");
     fsolve = &gsl_linalg_QRPT_QRsolve;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
     if (CLASS_OF(rr) != cgsl_matrix_L) rb_raise(rb_eTypeError, "not a L matrix");
     fsolve = &gsl_linalg_PTLQ_LQsolve_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -1984,23 +1969,21 @@ static VALUE rb_gsl_linalg_QRLQPT_QRLQsolve(VALUE obj, VALUE qq, VALUE rr,
   return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
 }
 
-static VALUE rb_gsl_linalg_QRPT_QRsolve(VALUE obj, VALUE qq, VALUE rr, 
-					VALUE pp, VALUE bb)
+static VALUE rb_gsl_linalg_QRPT_QRsolve(VALUE obj, VALUE qq, VALUE rr,
+                                        VALUE pp, VALUE bb)
 {
   return rb_gsl_linalg_QRLQPT_QRLQsolve(obj, qq, rr, pp, bb, LINALG_QRPT);
 }
 
-#ifdef GSL_1_6_LATER
-static VALUE rb_gsl_linalg_PTLQ_LQsolve(VALUE obj, VALUE qq, VALUE rr, 
-					VALUE pp, VALUE bb)
+static VALUE rb_gsl_linalg_PTLQ_LQsolve(VALUE obj, VALUE qq, VALUE rr,
+                                        VALUE pp, VALUE bb)
 {
   return rb_gsl_linalg_QRLQPT_QRLQsolve(obj, qq, rr, pp, bb, LINALG_PTLQ);
 }
-#endif
 
 /* singleton */
-static VALUE rb_gsl_linalg_QRLQPT_update(VALUE obj, VALUE qq, VALUE rr, 
-				       VALUE pp, VALUE ww, VALUE vv, int flag)
+static VALUE rb_gsl_linalg_QRLQPT_update(VALUE obj, VALUE qq, VALUE rr,
+                                         VALUE pp, VALUE ww, VALUE vv, int flag)
 {
   gsl_matrix *Q = NULL, *R = NULL;
   gsl_vector *w = NULL, *v = NULL;
@@ -2010,12 +1993,10 @@ static VALUE rb_gsl_linalg_QRLQPT_update(VALUE obj, VALUE qq, VALUE rr,
     if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
     if (CLASS_OF(rr) != cgsl_matrix_R) rb_raise(rb_eTypeError, "not a R matrix");
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
     if (CLASS_OF(rr) != cgsl_matrix_L) rb_raise(rb_eTypeError, "not a L matrix");
     break;
-#endif
   }
   CHECK_PERMUTATION(pp);
   Data_Get_Struct(qq, gsl_matrix, Q);
@@ -2027,28 +2008,24 @@ static VALUE rb_gsl_linalg_QRLQPT_update(VALUE obj, VALUE qq, VALUE rr,
   case LINALG_QRPT:
     gsl_linalg_QRPT_update(Q, R, p, w, v);
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     gsl_linalg_PTLQ_update(Q, R, p, w, v);
     break;
-#endif
   }
   return obj;
 }
 
-static VALUE rb_gsl_linalg_QRPT_update(VALUE obj, VALUE qq, VALUE rr, 
-				       VALUE pp, VALUE ww, VALUE vv)
+static VALUE rb_gsl_linalg_QRPT_update(VALUE obj, VALUE qq, VALUE rr,
+                                       VALUE pp, VALUE ww, VALUE vv)
 {
   return rb_gsl_linalg_QRLQPT_update(obj, qq, rr, pp, ww, vv, LINALG_QRPT);
 }
 
-#ifdef GSL_1_6_LATER
-static VALUE rb_gsl_linalg_PTLQ_update(VALUE obj, VALUE qq, VALUE rr, 
-				       VALUE pp, VALUE ww, VALUE vv)
+static VALUE rb_gsl_linalg_PTLQ_update(VALUE obj, VALUE qq, VALUE rr,
+                                       VALUE pp, VALUE ww, VALUE vv)
 {
   return rb_gsl_linalg_QRLQPT_update(obj, qq, rr, pp, ww, vv, LINALG_PTLQ);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QRLQPT_RLsolve(int argc, VALUE *argv, VALUE obj, int flag)
 {
@@ -2057,19 +2034,17 @@ static VALUE rb_gsl_linalg_QRLQPT_RLsolve(int argc, VALUE *argv, VALUE obj, int
   gsl_permutation *p = NULL;
   int itmp, flagb = 0;
   VALUE vtmp, klass;
-  int (*fsolve)(const gsl_matrix*, const gsl_permutation*, const gsl_vector*, 
-		gsl_vector*);
+  int (*fsolve)(const gsl_matrix*, const gsl_permutation*, const gsl_vector*,
+                gsl_vector*);
   switch (flag) {
   case LINALG_QRPT:
     klass = cgsl_matrix_QRPT;
     fsolve = &gsl_linalg_QRPT_Rsolve;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     klass = cgsl_matrix_PTLQ;
     fsolve = &gsl_linalg_PTLQ_Lsolve_T;
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -2077,7 +2052,7 @@ static VALUE rb_gsl_linalg_QRLQPT_RLsolve(int argc, VALUE *argv, VALUE obj, int
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     vtmp = argv[0];
     itmp = 1;
     break;
@@ -2113,12 +2088,11 @@ static VALUE rb_gsl_linalg_QRPT_Rsolve(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_RLsolve(argc, argv, obj, LINALG_QRPT);
 }
-#ifdef GSL_1_6_LATER
+
 static VALUE rb_gsl_linalg_PTLQ_Lsolve(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_RLsolve(argc, argv, obj, LINALG_PTLQ);
 }
-#endif
 
 static VALUE rb_gsl_linalg_QRLQPT_RLsvx(int argc, VALUE *argv, VALUE obj, int flag)
 {
@@ -2133,11 +2107,9 @@ static VALUE rb_gsl_linalg_QRLQPT_RLsvx(int argc, VALUE *argv, VALUE obj, int fl
     klass = cgsl_matrix_QRPT;
     fsvx = &gsl_linalg_QRPT_Rsvx;
     break;
-#ifdef GSL_1_6_LATER
   case LINALG_PTLQ:
     klass = cgsl_matrix_PTLQ;
     fsvx = &gsl_linalg_PTLQ_Lsvx_T;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "unknown operation");
     break;
@@ -2145,7 +2117,7 @@ static VALUE rb_gsl_linalg_QRLQPT_RLsvx(int argc, VALUE *argv, VALUE obj, int fl
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     vtmp = argv[0];
     itmp = 1;
     break;
@@ -2178,12 +2150,11 @@ static VALUE rb_gsl_linalg_QRPT_Rsvx(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_RLsvx(argc, argv, obj, LINALG_QRPT);
 }
-#ifdef GSL_1_6_LATER
+
 static VALUE rb_gsl_linalg_PTLQ_Lsvx(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_linalg_QRLQPT_RLsvx(argc, argv, obj, LINALG_PTLQ);
 }
-#endif
 
 /*******/
 #ifdef HAVE_NARRAY_H
@@ -2266,11 +2237,11 @@ static VALUE rb_gsl_linalg_SV_decomp(int argc, VALUE *argv, VALUE obj)
       CHECK_VECTOR(argv[1]);
       Data_Get_Struct(argv[1], gsl_vector, w);
       flag = 0;
-      /* no break, do next */
+    /* no break, do next */
     case 1:
 #ifdef HAVE_NARRAY_H
       if (NA_IsNArray(argv[0]))
-	return rb_gsl_linalg_SV_decomp_narray(argc, argv, obj);
+        return rb_gsl_linalg_SV_decomp_narray(argc, argv, obj);
 #endif
       CHECK_MATRIX(argv[0]);
       Data_Get_Struct(argv[0], gsl_matrix, A);
@@ -2317,7 +2288,7 @@ static VALUE rb_gsl_linalg_SV_decomp_mod(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError,
-			    "wrong number of argument (%d for 1)", argc);
+                            "wrong number of argument (%d for 1)", argc);
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix, A);
     break;
@@ -2347,10 +2318,10 @@ static VALUE rb_gsl_linalg_SV_decomp_jacobi(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError,
-			    "wrong number of argument (%d for 1)", argc);
+                            "wrong number of argument (%d for 1)", argc);
 #ifdef HAVE_NARRAY_H
-      if (NA_IsNArray(argv[0]))
-	return rb_gsl_linalg_SV_decomp_jacobi_narray(argc, argv, obj);
+    if (NA_IsNArray(argv[0]))
+      return rb_gsl_linalg_SV_decomp_jacobi_narray(argc, argv, obj);
 #endif
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix, A);
@@ -2374,7 +2345,7 @@ static VALUE rb_gsl_linalg_SV_solve(int argc, VALUE *argv, VALUE obj)
   gsl_matrix *A = NULL, *U = NULL, *V = NULL;
   gsl_vector *S = NULL, *b = NULL, *x = NULL;
   int flagb = 0, flagv = 0;
-  
+
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
@@ -2385,35 +2356,35 @@ static VALUE rb_gsl_linalg_SV_solve(int argc, VALUE *argv, VALUE obj)
 
     CHECK_MATRIX(argv[0]);
     if (CLASS_OF(argv[0]) == cgsl_matrix_U) {
-      if (argc != 4) rb_raise(rb_eArgError, 
-			      "wrong number of arguments (%d for 4)", argc);
+      if (argc != 4) rb_raise(rb_eArgError,
+                              "wrong number of arguments (%d for 4)", argc);
       Data_Get_Struct(argv[0], gsl_matrix, U);
       CHECK_MATRIX(argv[1]);
-      if (CLASS_OF(argv[1]) != cgsl_matrix_V) 
-	rb_raise(rb_eTypeError, "not a V matrix");
+      if (CLASS_OF(argv[1]) != cgsl_matrix_V)
+        rb_raise(rb_eTypeError, "not a V matrix");
       Data_Get_Struct(argv[1], gsl_matrix, V);
       CHECK_VECTOR(argv[2]);
-      if (CLASS_OF(argv[2]) != cgsl_vector_S) 
-	rb_raise(rb_eTypeError, "not a S vector");
+      if (CLASS_OF(argv[2]) != cgsl_vector_S)
+        rb_raise(rb_eTypeError, "not a S vector");
       Data_Get_Struct(argv[2], gsl_vector, S);
       if (TYPE(argv[3]) == T_ARRAY) {
-	b = make_cvector_from_rarray(argv[3]);
-	flagb = 1;
+        b = make_cvector_from_rarray(argv[3]);
+        flagb = 1;
       } else {
-	CHECK_VECTOR(argv[3]);
-	Data_Get_Struct(argv[3], gsl_vector, b);
+        CHECK_VECTOR(argv[3]);
+        Data_Get_Struct(argv[3], gsl_vector, b);
       }
     } else {
-      if (argc != 2) rb_raise(rb_eArgError, 
-			      "wrong number of arguments (%d for 2)", argc);
+      if (argc != 2) rb_raise(rb_eArgError,
+                              "wrong number of arguments (%d for 2)", argc);
       Data_Get_Struct(argv[0], gsl_matrix, A);
       U = make_matrix_clone(A);
       if (TYPE(argv[1]) == T_ARRAY) {
-	b = make_cvector_from_rarray(argv[1]);
-	flagb = 1;
+        b = make_cvector_from_rarray(argv[1]);
+        flagb = 1;
       } else {
-	CHECK_VECTOR(argv[1]);
-	Data_Get_Struct(argv[1], gsl_vector, b);
+        CHECK_VECTOR(argv[1]);
+        Data_Get_Struct(argv[1], gsl_vector, b);
       }
       S = gsl_vector_alloc(A->size2);   /* see manual p 123 */
       V = gsl_matrix_alloc(A->size2, A->size2);
@@ -2422,8 +2393,8 @@ static VALUE rb_gsl_linalg_SV_solve(int argc, VALUE *argv, VALUE obj)
     }
     break;
   default:
-    if (argc != 1) rb_raise(rb_eArgError, 
-			    "wrong number of arguments (%d for 1)", argc);
+    if (argc != 1) rb_raise(rb_eArgError,
+                            "wrong number of arguments (%d for 1)", argc);
     Data_Get_Struct(obj, gsl_matrix, A);
     U = make_matrix_clone(A);
     if (TYPE(argv[0]) == T_ARRAY) {
@@ -2439,7 +2410,7 @@ static VALUE rb_gsl_linalg_SV_solve(int argc, VALUE *argv, VALUE obj)
     flagv = 1;
     break;
   }
-  //  x = gsl_vector_alloc(b->size);  
+  //  x = gsl_vector_alloc(b->size);
   // Bug report #25842
   x = gsl_vector_alloc(S->size);
   gsl_linalg_SV_solve(U, V, S, b, x);
@@ -2486,8 +2457,8 @@ static VALUE rb_gsl_linalg_cholesky_solve_narray(int argc, VALUE *argv, VALUE ob
     x = argv[2];
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "Usage: Cholesky.solve(chol, b) or Cholesky.solve(chol, b, x)");
+    rb_raise(rb_eArgError,
+             "Usage: Cholesky.solve(chol, b) or Cholesky.solve(chol, b, x)");
     break;
   }
   mv = gsl_matrix_view_array((double*)nm->ptr, nm->shape[1], nm->shape[0]);
@@ -2517,7 +2488,7 @@ static VALUE rb_gsl_linalg_cholesky_decomp(int argc, VALUE *argv, VALUE obj)
   switch(TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_cholesky_decomp_narray(argc, argv, obj);
@@ -2544,7 +2515,7 @@ static VALUE rb_gsl_linalg_cholesky_solve(int argc, VALUE *argv, VALUE obj)
   switch(TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_cholesky_solve_narray(argc, argv, obj);
@@ -2554,7 +2525,7 @@ static VALUE rb_gsl_linalg_cholesky_solve(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     vA = obj;
     vb = argv[0];
     break;
@@ -2592,7 +2563,7 @@ static VALUE rb_gsl_linalg_cholesky_svx(int argc, VALUE *argv, VALUE obj)
   switch(TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_cholesky_svx_narray(argc, argv, obj);
@@ -2602,7 +2573,7 @@ static VALUE rb_gsl_linalg_cholesky_svx(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     vA = obj;
     vb = argv[0];
     break;
@@ -2631,7 +2602,7 @@ static VALUE rb_gsl_linalg_symmtd_decomp(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix, Atmp);
     break;
@@ -2656,7 +2627,7 @@ static VALUE rb_gsl_linalg_symmtd_decomp2(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix, A);
     break;
@@ -2678,14 +2649,14 @@ static VALUE rb_gsl_linalg_symmtd_unpack(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix, A);
     Data_Get_Struct(argv[1], gsl_vector, tau);
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX(obj);
     Data_Get_Struct(obj, gsl_matrix, A);
     Data_Get_Struct(argv[0], gsl_vector, tau);
@@ -2711,7 +2682,7 @@ static VALUE rb_gsl_linalg_symmtd_unpack_T(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix, A);
     break;
@@ -2739,7 +2710,7 @@ static VALUE rb_gsl_linalg_hermtd_decomp(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, Atmp);
     break;
@@ -2763,7 +2734,7 @@ static VALUE rb_gsl_linalg_hermtd_decomp2(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, A);
     break;
@@ -2786,14 +2757,14 @@ static VALUE rb_gsl_linalg_hermtd_unpack(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, A);
     Data_Get_Struct(argv[1], gsl_vector_complex, tau);
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(obj);
     Data_Get_Struct(obj, gsl_matrix_complex, A);
     Data_Get_Struct(argv[0], gsl_vector_complex, tau);
@@ -2819,7 +2790,7 @@ static VALUE rb_gsl_linalg_hermtd_unpack_T(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, A);
     break;
@@ -2851,7 +2822,7 @@ static VALUE rb_gsl_linalg_bidiag_decomp(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Data_Get_Struct(argv[0], gsl_matrix, Atmp);
     break;
   default:
@@ -2879,7 +2850,7 @@ static VALUE rb_gsl_linalg_bidiag_decomp2(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     Data_Get_Struct(argv[0], gsl_matrix, A);
     break;
   default:
@@ -2905,7 +2876,7 @@ static VALUE rb_gsl_linalg_bidiag_unpack(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[0]);
     CHECK_VECTOR(argv[1]);
     CHECK_VECTOR(argv[2]);
@@ -2915,7 +2886,7 @@ static VALUE rb_gsl_linalg_bidiag_unpack(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_MATRIX(obj);
     CHECK_VECTOR(argv[0]);
     CHECK_VECTOR(argv[1]);
@@ -2946,8 +2917,8 @@ static VALUE rb_gsl_linalg_bidiag_unpack2(int argc, VALUE *argv, VALUE obj)
 
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
-       if (argc != 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
-			    argc);
+    if (argc != 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
+                            argc);
     CHECK_MATRIX(argv[0]);
     CHECK_VECTOR(argv[1]);
     CHECK_VECTOR(argv[2]);
@@ -2957,7 +2928,7 @@ static VALUE rb_gsl_linalg_bidiag_unpack2(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_MATRIX(obj);
     CHECK_VECTOR(argv[0]);
     CHECK_VECTOR(argv[1]);
@@ -2965,7 +2936,7 @@ static VALUE rb_gsl_linalg_bidiag_unpack2(int argc, VALUE *argv, VALUE obj)
     Data_Get_Struct(argv[0], gsl_vector, tau_U);
     Data_Get_Struct(argv[1], gsl_vector, tau_V);
     break;
-  } 
+  }
   V = gsl_matrix_alloc(A->size2, A->size2);
   gsl_linalg_bidiag_unpack2(A, tau_U, tau_V, V);
   vv = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, V);
@@ -2982,7 +2953,7 @@ static VALUE rb_gsl_linalg_bidiag_unpack_B(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
-			    argc);
+                            argc);
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix, A);
     break;
@@ -2990,7 +2961,7 @@ static VALUE rb_gsl_linalg_bidiag_unpack_B(int argc, VALUE *argv, VALUE obj)
     CHECK_MATRIX(obj);
     Data_Get_Struct(obj, gsl_matrix, A);
     break;
-  } 
+  }
   size0 = GSL_MIN(A->size1, A->size2);
   d = gsl_vector_alloc(size0);
   s = gsl_vector_alloc(size0);
@@ -3101,7 +3072,7 @@ static VALUE rb_gsl_linalg_HH_solve(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_HH_solve_narray(argc, argv, obj);
@@ -3111,7 +3082,7 @@ static VALUE rb_gsl_linalg_HH_solve(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     vA = obj;
     vb = argv[0];
     break;
@@ -3142,13 +3113,13 @@ static VALUE rb_gsl_linalg_HH_solve_bang(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
     vA = argv[0];
     vb = argv[1];
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     vA = obj;
     vb = argv[0];
     break;
@@ -3176,7 +3147,7 @@ static VALUE rb_gsl_linalg_HH_svx(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0]))
       return rb_gsl_linalg_HH_svx_narray(argc, argv, obj);
@@ -3186,7 +3157,7 @@ static VALUE rb_gsl_linalg_HH_svx(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     vA = obj;
     vb = argv[0];
     break;
@@ -3214,9 +3185,8 @@ static VALUE rb_gsl_linalg_solve_symm_tridiag(VALUE obj, VALUE dd, VALUE ee, VAL
   return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
 }
 
-#ifdef GSL_1_2_LATER
 static VALUE rb_gsl_linalg_solve_tridiag(VALUE obj, VALUE dd, VALUE ee, VALUE ff,
-					 VALUE bb)
+                                         VALUE bb)
 {
   gsl_vector *b = NULL, *x = NULL, *d = NULL, *e = NULL, *f = NULL;
 
@@ -3243,8 +3213,8 @@ static VALUE rb_gsl_linalg_solve_symm_cyc_tridiag(VALUE obj, VALUE dd, VALUE ee,
   return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
 }
 
-static VALUE rb_gsl_linalg_solve_cyc_tridiag(VALUE obj, VALUE dd, VALUE ee, 
-					     VALUE ff, VALUE bb)
+static VALUE rb_gsl_linalg_solve_cyc_tridiag(VALUE obj, VALUE dd, VALUE ee,
+                                             VALUE ff, VALUE bb)
 {
   gsl_vector *b = NULL, *x = NULL, *d = NULL, *e = NULL, *f = NULL;
   Data_Get_Struct(dd, gsl_vector, d);
@@ -3255,11 +3225,10 @@ static VALUE rb_gsl_linalg_solve_cyc_tridiag(VALUE obj, VALUE dd, VALUE ee,
   gsl_linalg_solve_cyc_tridiag(d, e, f, b, x);
   return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
 }
-#endif
 
 static void rb_gsl_linalg_balance_columns_init(int argc, VALUE *argv, VALUE obj,
-						VALUE *mat, VALUE *vec,
-						gsl_matrix **M, gsl_vector **V)
+                                               VALUE *mat, VALUE *vec,
+                                               gsl_matrix **M, gsl_vector **V)
 {
   gsl_matrix *A = NULL;
   gsl_vector *D = NULL;
@@ -3333,92 +3302,6 @@ static VALUE rb_gsl_linalg_balance_columns(int argc, VALUE *argv, VALUE obj)
   return rb_ary_new3(2, mat, vec);
 }
 
-#ifdef HAVE_NARRAY_H
-static VALUE rb_gsl_linalg_QR_decomp_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *na;
-  gsl_matrix_view mv;
-  gsl_vector_view vv;
-  int shapem[2], shapev[1];
-  VALUE qr, tau;
-  if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
-  GetNArray(argv[0], na);
-  shapem[0] = na->shape[1];
-  shapem[1] = na->shape[1];
-  shapev[0] = shapem[0];
-  qr = na_make_object(NA_DFLOAT, 2, shapem, CLASS_OF(argv[0]));
-  tau = na_make_object(NA_DFLOAT, 1, shapev, cNVector);
-  memcpy(NA_PTR_TYPE(qr,double*),na->ptr,sizeof(double)*shapem[0]*shapem[1]);
-  mv = gsl_matrix_view_array(NA_PTR_TYPE(qr,double*), shapem[0], shapem[1]);
-  vv = gsl_vector_view_array(NA_PTR_TYPE(tau,double*), shapev[0]);
-  gsl_linalg_QR_decomp(&mv.matrix, &vv.vector);
-  return rb_ary_new3(2, qr, tau);
-}
-
-static VALUE rb_gsl_linalg_QR_unpack_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *m, *tau;
-  gsl_matrix_view mv, mq, mr;
-  gsl_vector_view vv;
-  int shape[2];
-  VALUE q, r;
-  if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			  argc);
-  GetNArray(argv[0], m);
-  GetNArray(argv[1], tau);
-  mv = gsl_matrix_view_array((double*)m->ptr, m->shape[1], m->shape[0]);
-  vv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
-  shape[0] = m->shape[1];
-  shape[1] = m->shape[1];
-  q = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
-  shape[0] = m->shape[1];
-  shape[1] = m->shape[0];
-  r = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
-  mq = gsl_matrix_view_array(NA_PTR_TYPE(q,double*), m->shape[1], m->shape[1]);
-  mr = gsl_matrix_view_array(NA_PTR_TYPE(r,double*), m->shape[1], m->shape[0]);
-  //  printf("OK 4 %d %d\n", mq.matrix.size1, mr.matrix.size2);
-  gsl_linalg_QR_unpack(&mv.matrix, &vv.vector, &mq.matrix, &mr.matrix);
-  //  printf("OK 5\n");
-  return rb_ary_new3(2, q, r);
-}
-
-static VALUE rb_gsl_linalg_QR_solve_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *qr, *tau, *b;
-  VALUE x;
-  gsl_matrix_view mv;
-  gsl_vector_view tv, bv, xv;
-  if (argc != 3) rb_raise(rb_eArgError, "Usage: QR.solve(qr, tau, b)");
-  GetNArray(argv[0], qr);
-  GetNArray(argv[1], tau);
-  GetNArray(argv[2], b);
-  x = na_make_object(NA_DFLOAT, 1, b->shape, CLASS_OF(argv[2]));
-  mv = gsl_matrix_view_array((double*)qr->ptr, qr->shape[1], qr->shape[0]);
-  tv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
-  bv = gsl_vector_view_array((double*)b->ptr, b->shape[0]);
-  xv = gsl_vector_view_array(NA_PTR_TYPE(x,double*), b->shape[0]);
-  gsl_linalg_QR_solve(&mv.matrix, &tv.vector, &bv.vector, &xv.vector);
-  return x;
-}
-static VALUE rb_gsl_linalg_QR_svx_narray(int argc, VALUE *argv, VALUE obj)
-{
-  struct NARRAY *qr, *tau, *b;
-  gsl_matrix_view mv;
-  gsl_vector_view tv, bv;
-  if (argc != 3) rb_raise(rb_eArgError, "Usage: QR.solve(qr, tau, b)");
-  GetNArray(argv[0], qr);
-  GetNArray(argv[1], tau);
-  GetNArray(argv[2], b);
-  mv = gsl_matrix_view_array((double*)qr->ptr, qr->shape[1], qr->shape[0]);
-  tv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
-  bv = gsl_vector_view_array((double*)b->ptr, b->shape[0]);
-  gsl_linalg_QR_svx(&mv.matrix, &tv.vector, &bv.vector);
-  return argv[2];
-}
-
-#endif
-
-#ifdef GSL_1_9_LATER
 static VALUE rb_gsl_linalg_hessenberg_decomp(VALUE module, VALUE AA)
 {
   gsl_matrix *A = NULL, *Atmp = NULL;
@@ -3500,7 +3383,7 @@ static VALUE rb_gsl_linalg_hesstri_decomp(int argc, VALUE *argv, VALUE module)
     break;
   case 3:
     CHECK_VECTOR(argv[2]);
-    Data_Get_Struct(argv[2], gsl_vector, work); 
+    Data_Get_Struct(argv[2], gsl_vector, work);
     break;
   case 4:
     CHECK_MATRIX(argv[2]);
@@ -3508,7 +3391,7 @@ static VALUE rb_gsl_linalg_hesstri_decomp(int argc, VALUE *argv, VALUE module)
     Data_Get_Struct(argv[2], gsl_matrix, U);
     Data_Get_Struct(argv[3], gsl_matrix, V);
     flag = 1;
-    break;  
+    break;
   case 5:
     CHECK_MATRIX(argv[2]);
     CHECK_MATRIX(argv[3]);
@@ -3523,17 +3406,17 @@ static VALUE rb_gsl_linalg_hesstri_decomp(int argc, VALUE *argv, VALUE module)
     rb_raise(rb_eArgError, "Wrong number of arguments (%d for 2-55)", argc);
   }
   CHECK_MATRIX(argv[0]);
-  CHECK_MATRIX(argv[1]);      
+  CHECK_MATRIX(argv[1]);
   Data_Get_Struct(argv[0], gsl_matrix, A);
   Data_Get_Struct(argv[1], gsl_matrix, B);
   Anew = make_matrix_clone(A);
-  Bnew = make_matrix_clone(B);  
+  Bnew = make_matrix_clone(B);
   if (flag == 1) work = gsl_vector_alloc(A->size1);
   gsl_linalg_hesstri_decomp(Anew, Bnew, U, V, work);
   if (flag == 1) gsl_vector_free(work);
   vH = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Anew);
-  vR = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Bnew);  
-  if (argc == 2 || argc == 3) {    
+  vR = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Bnew);
+  if (argc == 2 || argc == 3) {
     ary = rb_ary_new3(2, vH, vR);
   } else {
     ary = rb_ary_new3(4, vH, vR, vU, vV);
@@ -3553,7 +3436,7 @@ static VALUE rb_gsl_linalg_hesstri_decomp_bang(int argc, VALUE *argv, VALUE modu
     break;
   case 3:
     CHECK_VECTOR(argv[2]);
-    Data_Get_Struct(argv[2], gsl_vector, work); 
+    Data_Get_Struct(argv[2], gsl_vector, work);
     break;
   case 4:
     CHECK_MATRIX(argv[2]);
@@ -3561,7 +3444,7 @@ static VALUE rb_gsl_linalg_hesstri_decomp_bang(int argc, VALUE *argv, VALUE modu
     Data_Get_Struct(argv[2], gsl_matrix, U);
     Data_Get_Struct(argv[3], gsl_matrix, V);
     flag = 1;
-    break;  
+    break;
   case 5:
     CHECK_MATRIX(argv[2]);
     CHECK_MATRIX(argv[3]);
@@ -3576,7 +3459,7 @@ static VALUE rb_gsl_linalg_hesstri_decomp_bang(int argc, VALUE *argv, VALUE modu
     rb_raise(rb_eArgError, "Wrong number of arguments (%d for 2-55)", argc);
   }
   CHECK_MATRIX(argv[0]);
-  CHECK_MATRIX(argv[1]);      
+  CHECK_MATRIX(argv[1]);
   Data_Get_Struct(argv[0], gsl_matrix, A);
   Data_Get_Struct(argv[1], gsl_matrix, B);
   if (flag == 1) work = gsl_vector_alloc(A->size1);
@@ -3584,7 +3467,7 @@ static VALUE rb_gsl_linalg_hesstri_decomp_bang(int argc, VALUE *argv, VALUE modu
   if (flag == 1) gsl_vector_free(work);
   vH = argv[0];
   vR = argv[1];
-  if (argc == 2 || argc == 3) {    
+  if (argc == 2 || argc == 3) {
     ary = rb_ary_new3(2, vH, vR);
   } else {
     ary = rb_ary_new3(4, vH, vR, vU, vV);
@@ -3610,7 +3493,7 @@ static VALUE rb_gsl_linalg_balance_matrix(int argc, VALUE *argv, VALUE module)
     CHECK_VECTOR(argv[1]);
     Data_Get_Struct(argv[0], gsl_matrix, A);
     Data_Get_Struct(argv[1], gsl_vector, D);
-    Anew = make_matrix_clone(A);  
+    Anew = make_matrix_clone(A);
     vD = argv[1];
     break;
   default:
@@ -3645,7 +3528,6 @@ static VALUE rb_gsl_linalg_balance_matrix2(int argc, VALUE *argv, VALUE module)
   }
   return Qtrue;
 }
-#endif
 
 void Init_gsl_linalg_complex(VALUE module);
 void Init_gsl_linalg(VALUE module)
@@ -3664,9 +3546,7 @@ void Init_gsl_linalg(VALUE module)
   VALUE mgsl_linalg_tridiag;
   VALUE mgsl_linalg_HH;
   VALUE mgsl_linalg_Householder;
-#ifdef GSL_1_9_LATER
   VALUE mhessen;
-#endif
 
   mgsl_linalg = rb_define_module_under(module, "Linalg");
   mgsl_linalg_LU = rb_define_module_under(mgsl_linalg, "LU");
@@ -3769,7 +3649,7 @@ void Init_gsl_linalg(VALUE module)
 
   rb_define_module_function(mgsl_linalg_QR, "QTvec", rb_gsl_linalg_QR_QTvec, -1);
   rb_define_method(cgsl_matrix_QR, "QTvec", rb_gsl_linalg_QR_QTvec, -1);
- rb_define_module_function(mgsl_linalg_QR, "Qvec", rb_gsl_linalg_QR_Qvec, -1);
+  rb_define_module_function(mgsl_linalg_QR, "Qvec", rb_gsl_linalg_QR_Qvec, -1);
   rb_define_method(cgsl_matrix_QR, "Qvec", rb_gsl_linalg_QR_Qvec, -1);
 
   rb_define_module_function(mgsl_linalg_QR, "Rsolve", rb_gsl_linalg_QR_Rsolve, -1);
@@ -3795,7 +3675,7 @@ void Init_gsl_linalg(VALUE module)
   rb_define_module_function(mgsl_linalg_QRPT, "decomp!", rb_gsl_linalg_QRPT_decomp_bang, -1);
   rb_define_method(cgsl_matrix, "QRPT_decomp!", rb_gsl_linalg_QRPT_decomp_bang, -1);
 
- rb_define_module_function(mgsl_linalg_QRPT, "decomp2", rb_gsl_linalg_QRPT_decomp2, -1);
+  rb_define_module_function(mgsl_linalg_QRPT, "decomp2", rb_gsl_linalg_QRPT_decomp2, -1);
   rb_define_method(cgsl_matrix, "QRPT_decomp2", rb_gsl_linalg_QRPT_decomp2, -1);
 
   rb_define_module_function(mgsl_linalg_QRPT, "solve", rb_gsl_linalg_QRPT_solve, -1);
@@ -3854,9 +3734,9 @@ void Init_gsl_linalg(VALUE module)
   /*****/
   rb_define_module_function(mgsl_linalg_hermtd, "decomp", rb_gsl_linalg_hermtd_decomp, -1);
   rb_define_method(cgsl_matrix, "hermtd_decomp", rb_gsl_linalg_hermtd_decomp, -1);
-   rb_define_module_function(mgsl_linalg_hermtd, "decomp!", rb_gsl_linalg_hermtd_decomp2, -1);
+  rb_define_module_function(mgsl_linalg_hermtd, "decomp!", rb_gsl_linalg_hermtd_decomp2, -1);
   rb_define_method(cgsl_matrix, "hermtd_decomp!", rb_gsl_linalg_hermtd_decomp2, -1);
- 
+
   rb_define_method(cgsl_matrix_complex, "hermtd_unpack", rb_gsl_linalg_hermtd_unpack, -1);
   rb_define_module_function(mgsl_linalg_hermtd, "unpack", rb_gsl_linalg_hermtd_unpack, -1);
   rb_define_method(cgsl_matrix_complex, "hermtd_unpack_T", rb_gsl_linalg_hermtd_unpack_T, -1);
@@ -3882,35 +3762,35 @@ void Init_gsl_linalg(VALUE module)
   rb_define_module_function(mgsl_linalg, "bidiag_unpack_B", rb_gsl_linalg_bidiag_unpack_B, -1);
   rb_define_module_function(mgsl_linalg_bidiag, "unpack_B", rb_gsl_linalg_bidiag_unpack_B, -1);
   /*****/
-  rb_define_module_function(mgsl_linalg, "householder_transform", 
-			     rb_gsl_linalg_householder_transform, -1);
-  rb_define_module_function(mgsl_linalg_Householder, "transform", 
-			     rb_gsl_linalg_householder_transform, -1);
-  rb_define_module_function(mgsl_linalg_HH, "transform", 
-			     rb_gsl_linalg_householder_transform, -1);
-  rb_define_method(cgsl_vector, "householder_transform", 
-		   rb_gsl_linalg_householder_transform, -1);
-
-  rb_define_module_function(mgsl_linalg, "householder_hm", 
-			     rb_gsl_linalg_householder_hm, 3);
-  rb_define_module_function(mgsl_linalg_Householder, "hm", 
-			     rb_gsl_linalg_householder_hm, 3);
-  rb_define_module_function(mgsl_linalg_HH, "hm", 
-			     rb_gsl_linalg_householder_hm, 3);
-
-  rb_define_module_function(mgsl_linalg, "householder_mh", 
-			     rb_gsl_linalg_householder_mh, 3);
-  rb_define_module_function(mgsl_linalg_Householder, "mh", 
-			     rb_gsl_linalg_householder_mh, 3);
-  rb_define_module_function(mgsl_linalg_HH, "mh", 
-			     rb_gsl_linalg_householder_mh, 3);
-
-  rb_define_module_function(mgsl_linalg, "householder_hv", 
-			     rb_gsl_linalg_householder_hv, 3);
-  rb_define_module_function(mgsl_linalg_Householder, "hv", 
-			     rb_gsl_linalg_householder_hv, 3);
-  rb_define_module_function(mgsl_linalg_HH, "hv", 
-			     rb_gsl_linalg_householder_hv, 3);
+  rb_define_module_function(mgsl_linalg, "householder_transform",
+                            rb_gsl_linalg_householder_transform, -1);
+  rb_define_module_function(mgsl_linalg_Householder, "transform",
+                            rb_gsl_linalg_householder_transform, -1);
+  rb_define_module_function(mgsl_linalg_HH, "transform",
+                            rb_gsl_linalg_householder_transform, -1);
+  rb_define_method(cgsl_vector, "householder_transform",
+                   rb_gsl_linalg_householder_transform, -1);
+
+  rb_define_module_function(mgsl_linalg, "householder_hm",
+                            rb_gsl_linalg_householder_hm, 3);
+  rb_define_module_function(mgsl_linalg_Householder, "hm",
+                            rb_gsl_linalg_householder_hm, 3);
+  rb_define_module_function(mgsl_linalg_HH, "hm",
+                            rb_gsl_linalg_householder_hm, 3);
+
+  rb_define_module_function(mgsl_linalg, "householder_mh",
+                            rb_gsl_linalg_householder_mh, 3);
+  rb_define_module_function(mgsl_linalg_Householder, "mh",
+                            rb_gsl_linalg_householder_mh, 3);
+  rb_define_module_function(mgsl_linalg_HH, "mh",
+                            rb_gsl_linalg_householder_mh, 3);
+
+  rb_define_module_function(mgsl_linalg, "householder_hv",
+                            rb_gsl_linalg_householder_hv, 3);
+  rb_define_module_function(mgsl_linalg_Householder, "hv",
+                            rb_gsl_linalg_householder_hv, 3);
+  rb_define_module_function(mgsl_linalg_HH, "hv",
+                            rb_gsl_linalg_householder_hv, 3);
 
   rb_define_module_function(mgsl_linalg_HH, "solve", rb_gsl_linalg_HH_solve, -1);
   rb_define_module_function(mgsl_linalg_HH, "solve!", rb_gsl_linalg_HH_solve_bang, -1);
@@ -3925,32 +3805,29 @@ void Init_gsl_linalg(VALUE module)
 
   rb_define_module_function(mgsl_linalg_tridiag, "solve_symm", rb_gsl_linalg_solve_symm_tridiag, 3);
 
-#ifdef GSL_1_2_LATER
   rb_define_module_function(mgsl_linalg, "solve_tridiag", rb_gsl_linalg_solve_tridiag, 4);
   rb_define_module_function(mgsl_linalg_tridiag, "solve", rb_gsl_linalg_solve_tridiag, 4);
   rb_define_module_function(mgsl_linalg, "solve_symm_cyc_tridiag", rb_gsl_linalg_solve_symm_cyc_tridiag, 3);
   rb_define_module_function(mgsl_linalg, "solve_cyc_tridiag", rb_gsl_linalg_solve_cyc_tridiag, 4);
   rb_define_module_function(mgsl_linalg_tridiag, "solve_symm_cyc", rb_gsl_linalg_solve_symm_cyc_tridiag, 3);
   rb_define_module_function(mgsl_linalg_tridiag, "solve_cyc", rb_gsl_linalg_solve_cyc_tridiag, 4);
-#endif
 
   /*****/
-  rb_define_module_function(mgsl_linalg, "balance_columns!", 
-			     rb_gsl_linalg_balance_columns_bang, -1);
-  rb_define_method(cgsl_matrix, "balance_columns!", 
-			     rb_gsl_linalg_balance_columns_bang, -1);
-  rb_define_module_function(mgsl_linalg, "balance_columns", 
-			     rb_gsl_linalg_balance_columns, -1);
-  rb_define_method(cgsl_matrix, "balance_columns", 
-			     rb_gsl_linalg_balance_columns, -1);
+  rb_define_module_function(mgsl_linalg, "balance_columns!",
+                            rb_gsl_linalg_balance_columns_bang, -1);
+  rb_define_method(cgsl_matrix, "balance_columns!",
+                   rb_gsl_linalg_balance_columns_bang, -1);
+  rb_define_module_function(mgsl_linalg, "balance_columns",
+                            rb_gsl_linalg_balance_columns, -1);
+  rb_define_method(cgsl_matrix, "balance_columns",
+                   rb_gsl_linalg_balance_columns, -1);
   rb_define_alias(cgsl_matrix, "balance", "balance_columns");
   rb_define_alias(cgsl_matrix, "balanc", "balance_columns");
   /*****/
 
-  Init_gsl_linalg_complex(mgsl_linalg);			     
+  Init_gsl_linalg_complex(mgsl_linalg);
 
   /** GSL-1.6 **/
-#ifdef GSL_1_6_LATER
   rb_define_module_function(mgsl_linalg, "LQ_decomp", rb_gsl_linalg_LQ_decomp, -1);
   rb_define_module_function(mgsl_linalg_LQ, "decomp", rb_gsl_linalg_LQ_decomp, -1);
   rb_define_method(cgsl_matrix, "LQ_decomp", rb_gsl_linalg_LQ_decomp, -1);
@@ -3999,7 +3876,7 @@ void Init_gsl_linalg(VALUE module)
   rb_define_module_function(mgsl_linalg_PTLQ, "decomp!", rb_gsl_linalg_PTLQ_decomp_bang, -1);
   rb_define_method(cgsl_matrix, "PTLQ_decomp!", rb_gsl_linalg_PTLQ_decomp_bang, -1);
 
- rb_define_module_function(mgsl_linalg_PTLQ, "decomp2", rb_gsl_linalg_PTLQ_decomp2, -1);
+  rb_define_module_function(mgsl_linalg_PTLQ, "decomp2", rb_gsl_linalg_PTLQ_decomp2, -1);
   rb_define_method(cgsl_matrix, "PTLQ_decomp2", rb_gsl_linalg_PTLQ_decomp2, -1);
 
   rb_define_module_function(mgsl_linalg_PTLQ, "solve_T", rb_gsl_linalg_PTLQ_solve, -1);
@@ -4018,26 +3895,21 @@ void Init_gsl_linalg(VALUE module)
   rb_define_module_function(mgsl_linalg_PTLQ, "Lsvx_T", rb_gsl_linalg_PTLQ_Lsvx, -1);
   rb_define_method(cgsl_matrix_PTLQ, "Lsvx_T", rb_gsl_linalg_PTLQ_Lsvx, -1);
 
-#endif
-
-#ifdef GSL_1_9_LATER
   mhessen = rb_define_module_under(mgsl_linalg, "Hessenberg");
   rb_define_module_function(mhessen, "decomp", rb_gsl_linalg_hessenberg_decomp, 1);
-  rb_define_module_function(mgsl_linalg, "heesenberg_decomp", rb_gsl_linalg_hessenberg_decomp, 1);  
-  rb_define_module_function(mhessen, "unpack", rb_gsl_linalg_hessenberg_unpack, 2);  
-  rb_define_module_function(mgsl_linalg, "hessenberg_unpack", rb_gsl_linalg_hessenberg_unpack, 2);    
-  rb_define_module_function(mhessen, "unpack_accum", rb_gsl_linalg_hessenberg_unpack_accum, -1);    
-  rb_define_module_function(mgsl_linalg, "hessenberg_unpack_accum", rb_gsl_linalg_hessenberg_unpack_accum, -1);      
-  rb_define_module_function(mhessen, "set_zero", rb_gsl_linalg_hessenberg_set_zero, 1);    
-  rb_define_module_function(mgsl_linalg, "hessenberg_set_zero", rb_gsl_linalg_hessenberg_set_zero, 1);      
-  
+  rb_define_module_function(mgsl_linalg, "heesenberg_decomp", rb_gsl_linalg_hessenberg_decomp, 1);
+  rb_define_module_function(mhessen, "unpack", rb_gsl_linalg_hessenberg_unpack, 2);
+  rb_define_module_function(mgsl_linalg, "hessenberg_unpack", rb_gsl_linalg_hessenberg_unpack, 2);
+  rb_define_module_function(mhessen, "unpack_accum", rb_gsl_linalg_hessenberg_unpack_accum, -1);
+  rb_define_module_function(mgsl_linalg, "hessenberg_unpack_accum", rb_gsl_linalg_hessenberg_unpack_accum, -1);
+  rb_define_module_function(mhessen, "set_zero", rb_gsl_linalg_hessenberg_set_zero, 1);
+  rb_define_module_function(mgsl_linalg, "hessenberg_set_zero", rb_gsl_linalg_hessenberg_set_zero, 1);
+
   rb_define_module_function(mgsl_linalg, "hesstri_decomp", rb_gsl_linalg_hesstri_decomp, -1);
   rb_define_module_function(mgsl_linalg, "hesstri_decomp!", rb_gsl_linalg_hesstri_decomp_bang, -1);
-  
-  rb_define_module_function(mgsl_linalg, "balance_matrix", rb_gsl_linalg_balance_matrix, -1);  
-  rb_define_module_function(mgsl_linalg, "balance_matrix!", rb_gsl_linalg_balance_matrix2, -1);    
-  rb_define_module_function(mgsl_linalg, "balance", rb_gsl_linalg_balance_matrix, -1);    
-  rb_define_module_function(mgsl_linalg, "balance!", rb_gsl_linalg_balance_matrix2, -1);      
-#endif
 
+  rb_define_module_function(mgsl_linalg, "balance_matrix", rb_gsl_linalg_balance_matrix, -1);
+  rb_define_module_function(mgsl_linalg, "balance_matrix!", rb_gsl_linalg_balance_matrix2, -1);
+  rb_define_module_function(mgsl_linalg, "balance", rb_gsl_linalg_balance_matrix, -1);
+  rb_define_module_function(mgsl_linalg, "balance!", rb_gsl_linalg_balance_matrix2, -1);
 }
diff --git a/ext/gsl/linalg_complex.c b/ext/gsl_native/linalg_complex.c
similarity index 84%
rename from ext/gsl/linalg_complex.c
rename to ext/gsl_native/linalg_complex.c
index 3bb47a0..491ad0c 100644
--- a/ext/gsl/linalg_complex.c
+++ b/ext/gsl_native/linalg_complex.c
@@ -18,9 +18,7 @@ EXTERN VALUE mgsl_linalg;
 EXTERN VALUE cgsl_complex;
 
 static VALUE cgsl_matrix_complex_LU;
-#ifdef GSL_1_10_LATER
 static VALUE cgsl_matrix_complex_C;
-#endif
 
 VALUE rb_gsl_linalg_complex_LU_decomp(int argc, VALUE *argv, VALUE obj)
 {
@@ -35,7 +33,7 @@ VALUE rb_gsl_linalg_complex_LU_decomp(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, m);
     itmp = 1;
@@ -81,7 +79,7 @@ VALUE rb_gsl_linalg_complex_LU_decomp2(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, m);
     itmp = 1;
@@ -100,13 +98,13 @@ VALUE rb_gsl_linalg_complex_LU_decomp2(int argc, VALUE *argv, VALUE obj)
     p = gsl_permutation_alloc(size);
     gsl_linalg_complex_LU_decomp(mnew, p, &signum);
     obj2 = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
-    return rb_ary_new3(3, objm ,obj2, INT2FIX(signum));
+    return rb_ary_new3(3, objm,obj2, INT2FIX(signum));
     break;
   case 1:  /* when a permutation object is given */
     CHECK_PERMUTATION(argv[itmp]);
     Data_Get_Struct(argv[itmp], gsl_permutation, p);
     gsl_linalg_complex_LU_decomp(m, p, &signum);
-    return rb_ary_new3(3, objm , argv[itmp], INT2FIX(signum));
+    return rb_ary_new3(3, objm, argv[itmp], INT2FIX(signum));
     break;
   default:
     rb_raise(rb_eArgError, "Usage: LU_decomp!() or LU_decomp!(permutation)");
@@ -119,14 +117,13 @@ static VALUE rb_gsl_linalg_complex_LU_solve(int argc, VALUE *argv, VALUE obj)
   gsl_permutation *p = NULL;
   gsl_vector_complex *b = NULL, *x = NULL;
   int flagm = 0, flagx = 0, itmp, signum;
-  
+
   switch (TYPE(obj)) {
   case T_MODULE:
   case T_CLASS:
   case T_OBJECT:
-    if (argc < 2 || argc > 4) 
+    if (argc < 2 || argc > 4)
       rb_raise(rb_eArgError, "Usage: solve(m, b), solve(m, b, x), solve(lu, p, b), solve(lu, p, b, x)");
-
     CHECK_MATRIX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, m);
     if (CLASS_OF(argv[0]) != cgsl_matrix_complex_LU) {
@@ -139,7 +136,7 @@ static VALUE rb_gsl_linalg_complex_LU_solve(int argc, VALUE *argv, VALUE obj)
     itmp = 1;
     break;
   default:
-    if (argc < 1 || argc > 3) 
+    if (argc < 1 || argc > 3)
       rb_raise(rb_eArgError, "Usage: LU_solve(b), LU_solve(p, b), LU_solve(b, x), solve(p, b, x)");
     Data_Get_Struct(obj, gsl_matrix_complex, m);
     if (CLASS_OF(obj) != cgsl_matrix_complex_LU) {
@@ -185,7 +182,7 @@ static VALUE rb_gsl_linalg_complex_LU_svx(int argc, VALUE *argv, VALUE obj)
   gsl_permutation *p = NULL;
   gsl_vector_complex *x = NULL;
   int flagm = 0, itmp, signum;
-  
+
   switch (TYPE(obj)) {
   case T_MODULE:
   case T_CLASS:
@@ -232,8 +229,8 @@ static VALUE rb_gsl_linalg_complex_LU_svx(int argc, VALUE *argv, VALUE obj)
 }
 
 static VALUE rb_gsl_linalg_complex_LU_refine(VALUE obj, VALUE vm,
-					     VALUE lu, VALUE pp, VALUE bb,
-					     VALUE xx)
+                                             VALUE lu, VALUE pp, VALUE bb,
+                                             VALUE xx)
 {
   gsl_matrix_complex *m = NULL, *mlu = NULL;
   gsl_permutation *p = NULL;
@@ -306,7 +303,6 @@ static VALUE rb_gsl_linalg_complex_LU_invert(int argc, VALUE *argv, VALUE obj)
   }
   return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, inverse);
 }
-#ifdef GSL_1_1_1_LATER
 static VALUE rb_gsl_linalg_complex_LU_det(int argc, VALUE *argv, VALUE obj)
 {
   gsl_matrix_complex *m = NULL, *mtmp = NULL;
@@ -389,7 +385,7 @@ static VALUE rb_gsl_linalg_complex_LU_lndet(int argc, VALUE *argv, VALUE obj)
   if (flagm == 1) {
     p = gsl_permutation_alloc(m->size1);
     gsl_linalg_complex_LU_decomp(mtmp, p, &signum);
-  } 
+  }
   lndet = gsl_linalg_complex_LU_lndet(mtmp);
   if (flagm == 1) {
     gsl_matrix_complex_free(mtmp);
@@ -446,9 +442,6 @@ static VALUE rb_gsl_linalg_complex_LU_sgndet(int argc, VALUE *argv, VALUE obj)
   }
   return vz;
 }
-#endif
-
-#ifdef GSL_1_10_LATER
 
 static VALUE rb_gsl_linalg_cholesky_decomp(int argc, VALUE *argv, VALUE obj)
 {
@@ -456,7 +449,7 @@ static VALUE rb_gsl_linalg_cholesky_decomp(int argc, VALUE *argv, VALUE obj)
   switch(TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     CHECK_MATRIX_COMPLEX(argv[0]);
     Data_Get_Struct(argv[0], gsl_matrix_complex, Atmp);
     break;
@@ -479,13 +472,13 @@ static VALUE rb_gsl_linalg_cholesky_solve(int argc, VALUE *argv, VALUE obj)
   switch(TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
     vA = argv[0];
     vb = argv[1];
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     vA = obj;
     vb = argv[0];
     break;
@@ -519,13 +512,13 @@ static VALUE rb_gsl_linalg_cholesky_svx(int argc, VALUE *argv, VALUE obj)
   switch(TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
-			    argc);
+                            argc);
     vA = argv[0];
     vb = argv[1];
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
-			    argc);
+                            argc);
     vA = obj;
     vb = argv[0];
     break;
@@ -572,7 +565,7 @@ static VALUE rb_gsl_linalg_complex_householder_hm(VALUE obj, VALUE t, VALUE vv,
   gsl_vector_complex *v = NULL;
   gsl_complex *tau;
   gsl_matrix_complex *A = NULL;
-  CHECK_COMPLEX(t);  
+  CHECK_COMPLEX(t);
   CHECK_VECTOR_COMPLEX(vv);
   CHECK_MATRIX_COMPLEX(aa);
   Data_Get_Struct(t, gsl_complex, tau);
@@ -587,7 +580,7 @@ static VALUE rb_gsl_linalg_complex_householder_mh(VALUE obj, VALUE t, VALUE vv,
   gsl_vector_complex *v = NULL;
   gsl_complex *tau;
   gsl_matrix_complex *A = NULL;
-  CHECK_COMPLEX(t);  
+  CHECK_COMPLEX(t);
   CHECK_VECTOR_COMPLEX(vv);
   CHECK_MATRIX_COMPLEX(aa);
   Data_Get_Struct(t, gsl_complex, tau);
@@ -601,7 +594,7 @@ static VALUE rb_gsl_linalg_complex_householder_hv(VALUE obj, VALUE t, VALUE vv,
 {
   gsl_vector_complex *v = NULL, *w = NULL;
   gsl_complex *tau;
-  CHECK_COMPLEX(t);    
+  CHECK_COMPLEX(t);
   CHECK_VECTOR_COMPLEX(vv);
   CHECK_VECTOR_COMPLEX(ww);
   Data_Get_Struct(t, gsl_complex, tau);
@@ -610,103 +603,97 @@ static VALUE rb_gsl_linalg_complex_householder_hv(VALUE obj, VALUE t, VALUE vv,
   gsl_linalg_complex_householder_hv(*tau, v, w);
   return ww;
 }
-#endif
 
 void Init_gsl_linalg_complex(VALUE module)
 {
   VALUE mgsl_linalg_complex;
   VALUE mgsl_linalg_complex_LU;
-#ifdef GSL_1_10_LATER
   VALUE mgsl_linalg_complex_chol, mgsl_linalg_complex_Householder;
-#endif
 
   mgsl_linalg_complex = rb_define_module_under(module, "Complex");
   mgsl_linalg_complex_LU = rb_define_module_under(mgsl_linalg_complex, "LU");
 
   cgsl_matrix_complex_LU = rb_define_class_under(mgsl_linalg_complex_LU,
-						 "LUMatrix", cgsl_matrix_complex);
+                                                 "LUMatrix", cgsl_matrix_complex);
 
   rb_define_singleton_method(mgsl_linalg_complex, "LU_decomp!",
-			     rb_gsl_linalg_complex_LU_decomp, -1);
+                             rb_gsl_linalg_complex_LU_decomp, -1);
   rb_define_singleton_method(mgsl_linalg_complex_LU, "decomp!",
-			     rb_gsl_linalg_complex_LU_decomp, -1);
-  rb_define_method(cgsl_matrix_complex, "LU_decomp!", 
-		   rb_gsl_linalg_complex_LU_decomp, -1);
+                             rb_gsl_linalg_complex_LU_decomp, -1);
+  rb_define_method(cgsl_matrix_complex, "LU_decomp!",
+                   rb_gsl_linalg_complex_LU_decomp, -1);
   rb_define_alias(cgsl_matrix_complex, "decomp!", "LU_decomp!");
 
   rb_define_singleton_method(mgsl_linalg_complex, "LU_decomp",
-			     rb_gsl_linalg_complex_LU_decomp2, -1);
+                             rb_gsl_linalg_complex_LU_decomp2, -1);
   rb_define_singleton_method(mgsl_linalg_complex_LU, "decomp",
-			     rb_gsl_linalg_complex_LU_decomp2, -1);
-  rb_define_method(cgsl_matrix_complex, "LU_decomp", 
-		   rb_gsl_linalg_complex_LU_decomp2, -1);
+                             rb_gsl_linalg_complex_LU_decomp2, -1);
+  rb_define_method(cgsl_matrix_complex, "LU_decomp",
+                   rb_gsl_linalg_complex_LU_decomp2, -1);
   rb_define_alias(cgsl_matrix_complex, "decomp", "LU_decomp");
 
   rb_define_singleton_method(mgsl_linalg_complex, "LU_solve",
-			     rb_gsl_linalg_complex_LU_solve, -1);
+                             rb_gsl_linalg_complex_LU_solve, -1);
   rb_define_singleton_method(mgsl_linalg_complex_LU, "solve",
-			     rb_gsl_linalg_complex_LU_solve, -1);
-  rb_define_method(cgsl_matrix_complex, "LU_solve", 
-		   rb_gsl_linalg_complex_LU_solve, -1);
-  rb_define_method(cgsl_matrix_complex_LU, "solve", 
-		   rb_gsl_linalg_complex_LU_solve, -1);
+                             rb_gsl_linalg_complex_LU_solve, -1);
+  rb_define_method(cgsl_matrix_complex, "LU_solve",
+                   rb_gsl_linalg_complex_LU_solve, -1);
+  rb_define_method(cgsl_matrix_complex_LU, "solve",
+                   rb_gsl_linalg_complex_LU_solve, -1);
 
   rb_define_singleton_method(mgsl_linalg_complex, "LU_svx",
-			     rb_gsl_linalg_complex_LU_svx, -1);
+                             rb_gsl_linalg_complex_LU_svx, -1);
   rb_define_singleton_method(mgsl_linalg_complex_LU, "svx",
-			     rb_gsl_linalg_complex_LU_svx, -1);
-  rb_define_method(cgsl_matrix_complex, "LU_svx", 
-		   rb_gsl_linalg_complex_LU_svx, -1);
-  rb_define_method(cgsl_matrix_complex_LU, "svx", 
-		   rb_gsl_linalg_complex_LU_svx, -1);
+                             rb_gsl_linalg_complex_LU_svx, -1);
+  rb_define_method(cgsl_matrix_complex, "LU_svx",
+                   rb_gsl_linalg_complex_LU_svx, -1);
+  rb_define_method(cgsl_matrix_complex_LU, "svx",
+                   rb_gsl_linalg_complex_LU_svx, -1);
 
   rb_define_singleton_method(mgsl_linalg_complex, "LU_refine",
-			     rb_gsl_linalg_complex_LU_refine, 5);
+                             rb_gsl_linalg_complex_LU_refine, 5);
   rb_define_singleton_method(mgsl_linalg_complex_LU, "refine",
-			     rb_gsl_linalg_complex_LU_refine, 5);
+                             rb_gsl_linalg_complex_LU_refine, 5);
 
   rb_define_singleton_method(mgsl_linalg_complex, "LU_invert",
-			     rb_gsl_linalg_complex_LU_invert, -1);
+                             rb_gsl_linalg_complex_LU_invert, -1);
   rb_define_singleton_method(mgsl_linalg_complex_LU, "invert",
-			     rb_gsl_linalg_complex_LU_invert, -1);
-  rb_define_method(cgsl_matrix_complex, "LU_invert", 
-		   rb_gsl_linalg_complex_LU_invert, -1);
+                             rb_gsl_linalg_complex_LU_invert, -1);
+  rb_define_method(cgsl_matrix_complex, "LU_invert",
+                   rb_gsl_linalg_complex_LU_invert, -1);
   rb_define_alias(cgsl_matrix_complex, "invert", "LU_invert");
   rb_define_alias(cgsl_matrix_complex, "inv", "LU_invert");
-  rb_define_method(cgsl_matrix_complex_LU, "invert", 
-		   rb_gsl_linalg_complex_LU_invert, -1);
-
-#ifdef GSL_1_1_1_LATER
-  rb_define_singleton_method(mgsl_linalg_complex, "LU_det", 
-			     rb_gsl_linalg_complex_LU_det, -1);
-  rb_define_singleton_method(mgsl_linalg_complex_LU, "det", 
-			     rb_gsl_linalg_complex_LU_det, -1);
+  rb_define_method(cgsl_matrix_complex_LU, "invert",
+                   rb_gsl_linalg_complex_LU_invert, -1);
+
+  rb_define_singleton_method(mgsl_linalg_complex, "LU_det",
+                             rb_gsl_linalg_complex_LU_det, -1);
+  rb_define_singleton_method(mgsl_linalg_complex_LU, "det",
+                             rb_gsl_linalg_complex_LU_det, -1);
   rb_define_method(cgsl_matrix_complex, "LU_det", rb_gsl_linalg_complex_LU_det, -1);
   rb_define_alias(cgsl_matrix_complex, "det", "LU_det");
   rb_define_method(cgsl_matrix_complex_LU, "det", rb_gsl_linalg_complex_LU_det, -1);
 
-  rb_define_singleton_method(mgsl_linalg_complex, "LU_lndet", 
-			     rb_gsl_linalg_complex_LU_lndet, -1);
-  rb_define_singleton_method(mgsl_linalg_complex_LU, "lndet", 
-			     rb_gsl_linalg_complex_LU_lndet, -1);
+  rb_define_singleton_method(mgsl_linalg_complex, "LU_lndet",
+                             rb_gsl_linalg_complex_LU_lndet, -1);
+  rb_define_singleton_method(mgsl_linalg_complex_LU, "lndet",
+                             rb_gsl_linalg_complex_LU_lndet, -1);
   rb_define_method(cgsl_matrix_complex, "LU_lndet", rb_gsl_linalg_complex_LU_lndet, -1);
   rb_define_alias(cgsl_matrix_complex, "lndet", "LU_lndet");
   rb_define_method(cgsl_matrix_complex_LU, "LU_lndet", rb_gsl_linalg_complex_LU_lndet, -1);
 
-  rb_define_singleton_method(mgsl_linalg_complex, "LU_sgndet", 
-			     rb_gsl_linalg_complex_LU_sgndet, -1);
-  rb_define_singleton_method(mgsl_linalg_complex_LU, "sgndet", 
-			     rb_gsl_linalg_complex_LU_sgndet, -1);
+  rb_define_singleton_method(mgsl_linalg_complex, "LU_sgndet",
+                             rb_gsl_linalg_complex_LU_sgndet, -1);
+  rb_define_singleton_method(mgsl_linalg_complex_LU, "sgndet",
+                             rb_gsl_linalg_complex_LU_sgndet, -1);
   rb_define_method(cgsl_matrix_complex, "LU_sgndet", rb_gsl_linalg_complex_LU_sgndet, -1);
   rb_define_alias(cgsl_matrix_complex, "sgndet", "LU_sgndet");
   rb_define_method(cgsl_matrix_complex_LU, "LU_sgndet", rb_gsl_linalg_complex_LU_sgndet, -1);
-#endif
 
-#ifdef GSL_1_10_LATER
   mgsl_linalg_complex_chol = rb_define_module_under(mgsl_linalg_complex, "Cholesky");
-  cgsl_matrix_complex_C = rb_define_class_under(mgsl_linalg_complex_chol, "CholeskyMatrix", cgsl_matrix_complex);    
+  cgsl_matrix_complex_C = rb_define_class_under(mgsl_linalg_complex_chol, "CholeskyMatrix", cgsl_matrix_complex);
   rb_define_singleton_method(mgsl_linalg_complex_chol, "decomp", rb_gsl_linalg_cholesky_decomp, -1);
-  rb_define_method(cgsl_matrix_complex, "cholesky_decomp", rb_gsl_linalg_cholesky_decomp, -1);  
+  rb_define_method(cgsl_matrix_complex, "cholesky_decomp", rb_gsl_linalg_cholesky_decomp, -1);
   rb_define_singleton_method(mgsl_linalg_complex_chol, "solve", rb_gsl_linalg_cholesky_solve, -1);
   rb_define_method(cgsl_matrix_complex, "cholesky_solve", rb_gsl_linalg_cholesky_solve, -1);
   rb_define_method(cgsl_matrix_complex_C, "solve", rb_gsl_linalg_cholesky_solve, -1);
@@ -715,26 +702,25 @@ void Init_gsl_linalg_complex(VALUE module)
   rb_define_method(cgsl_matrix_complex_C, "svx", rb_gsl_linalg_cholesky_svx, -1);
 
   mgsl_linalg_complex_Householder = rb_define_module_under(mgsl_linalg_complex, "Householder");
- rb_define_singleton_method(mgsl_linalg_complex, "householder_transform", 
-			     rb_gsl_linalg_complex_householder_transform, -1);
-  rb_define_singleton_method(mgsl_linalg_complex_Householder, "transform", 
-			     rb_gsl_linalg_complex_householder_transform, -1);
-  rb_define_method(cgsl_vector_complex, "householder_transform", 
-		   rb_gsl_linalg_complex_householder_transform, -1);
-
-  rb_define_singleton_method(mgsl_linalg_complex, "householder_hm", 
-			     rb_gsl_linalg_complex_householder_hm, 3);
-  rb_define_singleton_method(mgsl_linalg_complex_Householder, "hm", 
-			     rb_gsl_linalg_complex_householder_hm, 3);
-
-  rb_define_singleton_method(mgsl_linalg_complex, "householder_mh", 
-			     rb_gsl_linalg_complex_householder_mh, 3);
-  rb_define_singleton_method(mgsl_linalg_complex_Householder, "mh", 
-			     rb_gsl_linalg_complex_householder_mh, 3);
-
-  rb_define_singleton_method(mgsl_linalg_complex, "householder_hv", 
-			     rb_gsl_linalg_complex_householder_hv, 3);
-  rb_define_singleton_method(mgsl_linalg_complex_Householder, "hv", 
-			     rb_gsl_linalg_complex_householder_hv, 3);
-#endif			     
+  rb_define_singleton_method(mgsl_linalg_complex, "householder_transform",
+                             rb_gsl_linalg_complex_householder_transform, -1);
+  rb_define_singleton_method(mgsl_linalg_complex_Householder, "transform",
+                             rb_gsl_linalg_complex_householder_transform, -1);
+  rb_define_method(cgsl_vector_complex, "householder_transform",
+                   rb_gsl_linalg_complex_householder_transform, -1);
+
+  rb_define_singleton_method(mgsl_linalg_complex, "householder_hm",
+                             rb_gsl_linalg_complex_householder_hm, 3);
+  rb_define_singleton_method(mgsl_linalg_complex_Householder, "hm",
+                             rb_gsl_linalg_complex_householder_hm, 3);
+
+  rb_define_singleton_method(mgsl_linalg_complex, "householder_mh",
+                             rb_gsl_linalg_complex_householder_mh, 3);
+  rb_define_singleton_method(mgsl_linalg_complex_Householder, "mh",
+                             rb_gsl_linalg_complex_householder_mh, 3);
+
+  rb_define_singleton_method(mgsl_linalg_complex, "householder_hv",
+                             rb_gsl_linalg_complex_householder_hv, 3);
+  rb_define_singleton_method(mgsl_linalg_complex_Householder, "hv",
+                             rb_gsl_linalg_complex_householder_hv, 3);
 }
diff --git a/ext/gsl/math.c b/ext/gsl_native/math.c
similarity index 92%
rename from ext/gsl/math.c
rename to ext/gsl_native/math.c
index 3577536..69a6bf3 100644
--- a/ext/gsl/math.c
+++ b/ext/gsl_native/math.c
@@ -12,9 +12,6 @@
 
 #include "include/rb_gsl_math.h"
 #include "include/rb_gsl_complex.h"
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 static void rb_gsl_define_const(VALUE module);
 
@@ -124,15 +121,15 @@ VALUE rb_gsl_math_complex_eval(gsl_complex (*func)(gsl_complex), VALUE obj)
     mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
     for (i = 0; i < m->size1; i++) {
       for (j = 0; j < m->size2; j++) {
-	gsl_matrix_complex_set(mnew, i, j, (*func)(gsl_matrix_complex_get(m, i, j)));
+        gsl_matrix_complex_set(mnew, i, j, (*func)(gsl_matrix_complex_get(m, i, j)));
       }
     }
     return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
   } else {
-    rb_raise(rb_eTypeError, 
-	     "wrong argument type %s "
-	     " (GSL::Complex or GSL::Vector::Complex expected)", 
-	     rb_class2name(CLASS_OF(obj)));
+    rb_raise(rb_eTypeError,
+             "wrong argument type %s "
+             " (GSL::Complex or GSL::Vector::Complex expected)",
+             rb_class2name(CLASS_OF(obj)));
   }
 }
 
@@ -140,10 +137,6 @@ static VALUE rb_gsl_math_eval(double (*func)(const double), VALUE xx)
 {
   VALUE x, ary;
   size_t i, size;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
   case T_FIXNUM:
@@ -165,6 +158,8 @@ static VALUE rb_gsl_math_eval(double (*func)(const double), VALUE xx)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
       size = na->total;
@@ -188,18 +183,14 @@ static VALUE rb_gsl_math_eval(double (*func)(const double), VALUE xx)
 }
 
 static VALUE rb_gsl_math_eval2(double (*func)(const double, const double), VALUE xx,
-			       VALUE yy);
+                               VALUE yy);
 static VALUE rb_gsl_math_eval2(double (*func)(const double, const double), VALUE xx,
-			       VALUE yy)
+                               VALUE yy)
 {
   VALUE x, y, ary;
   size_t i, j, size;
   gsl_vector *v = NULL, *v2 = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *m2 = NULL, *mnew = NULL;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *nax, *nay;
-  double *ptr1, *ptr2, *ptr3;
-#endif
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
   case T_FIXNUM:
@@ -226,6 +217,8 @@ static VALUE rb_gsl_math_eval2(double (*func)(const double, const double), VALUE
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *nax, *nay;
+      double *ptr1, *ptr2, *ptr3;
       GetNArray(xx, nax);
       GetNArray(yy, nay);
       ptr1 = (double*) nax->ptr;
@@ -243,7 +236,7 @@ static VALUE rb_gsl_math_eval2(double (*func)(const double, const double), VALUE
       Data_Get_Struct(yy, gsl_vector, v2);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, (*func)(gsl_vector_get(v, i), gsl_vector_get(v2, i)));
+        gsl_vector_set(vnew, i, (*func)(gsl_vector_get(v, i), gsl_vector_get(v2, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
@@ -252,15 +245,15 @@ static VALUE rb_gsl_math_eval2(double (*func)(const double, const double), VALUE
       Data_Get_Struct(yy, gsl_matrix, m2);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, (*func)(gsl_matrix_get(m, i, j), gsl_matrix_get(m2, i, j)));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, (*func)(gsl_matrix_get(m, i, j), gsl_matrix_get(m2, i, j)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s "
-	       "(Array or Vector or Matrix expected)", rb_class2name(CLASS_OF(xx)));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s "
+               "(Array or Vector or Matrix expected)", rb_class2name(CLASS_OF(xx)));
     }
     break;
   }
@@ -287,32 +280,32 @@ static VALUE rb_gsl_hypot(VALUE obj, VALUE x, VALUE y)
 {
   return rb_gsl_math_eval2(gsl_hypot, x, y);
 }
-#ifdef GSL_1_10_LATER
+
 static VALUE rb_gsl_hypot3(VALUE obj, VALUE x, VALUE y, VALUE z)
 {
   Need_Float(x);
   Need_Float(y);
-  Need_Float(z);    
+  Need_Float(z);
   return rb_float_new(gsl_hypot3(NUM2DBL(x), NUM2DBL(y), NUM2DBL(z)));
 }
-#endif
+
 static VALUE rb_gsl_acosh(VALUE obj, VALUE x)
 {
-  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) 
+  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x))
     return rb_gsl_math_complex_eval(gsl_complex_arccosh, x);
   return rb_gsl_math_eval(gsl_acosh, x);
 }
 
 static VALUE rb_gsl_asinh(VALUE obj, VALUE x)
 {
-  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) 
+  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x))
     return rb_gsl_math_complex_eval(gsl_complex_arcsinh, x);
   return rb_gsl_math_eval(gsl_asinh, x);
 }
 
 static VALUE rb_gsl_atanh(VALUE obj, VALUE x)
 {
-  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) 
+  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x))
     return rb_gsl_math_complex_eval(gsl_complex_arctanh, x);
   return rb_gsl_math_eval(gsl_atanh, x);
 }
@@ -328,10 +321,6 @@ VALUE rb_gsl_pow(VALUE obj, VALUE xx, VALUE nn)
   double n;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
   case T_FIXNUM:
@@ -353,6 +342,8 @@ VALUE rb_gsl_pow(VALUE obj, VALUE xx, VALUE nn)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       n = NUM2DBL(nn);
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
@@ -368,21 +359,21 @@ VALUE rb_gsl_pow(VALUE obj, VALUE xx, VALUE nn)
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, pow(gsl_vector_get(v, i), n));
+        gsl_vector_set(vnew, i, pow(gsl_vector_get(v, i), n));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
-    } 
+    }
     if (MATRIX_P(xx)) {
       n = NUM2DBL(nn);
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, pow(gsl_matrix_get(m, i, j), n));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, pow(gsl_matrix_get(m, i, j), n));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
-    } 
+    }
     if (COMPLEX_P(xx) || VECTOR_COMPLEX_P(xx) || MATRIX_COMPLEX_P(xx)) {
       argv[0] = xx;
       argv[1] = nn;
@@ -402,10 +393,6 @@ static VALUE rb_gsl_pow_int(VALUE obj, VALUE xx, VALUE nn)
   int n;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
 
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
@@ -430,6 +417,8 @@ static VALUE rb_gsl_pow_int(VALUE obj, VALUE xx, VALUE nn)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       CHECK_FIXNUM(nn);
       n = FIX2INT(nn);
       GetNArray(xx, na);
@@ -447,7 +436,7 @@ static VALUE rb_gsl_pow_int(VALUE obj, VALUE xx, VALUE nn)
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, gsl_pow_int(gsl_vector_get(v, i), n));
+        gsl_vector_set(vnew, i, gsl_pow_int(gsl_vector_get(v, i), n));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
@@ -456,9 +445,9 @@ static VALUE rb_gsl_pow_int(VALUE obj, VALUE xx, VALUE nn)
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, gsl_pow_int(gsl_matrix_get(m, i, j), n));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, gsl_pow_int(gsl_matrix_get(m, i, j), n));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else if (COMPLEX_P(xx) || VECTOR_COMPLEX_P(xx) || MATRIX_COMPLEX_P(xx)) {
@@ -556,7 +545,6 @@ static VALUE rb_GSL_MAX(VALUE obj, VALUE aa, VALUE bb)
   max = GSL_MAX_DBL(a, b);
   if (gsl_fcmp(max, a, 1.0e-10) == 0) return aa;
   else return bb;
-
 }
 
 static VALUE rb_GSL_MIN(VALUE obj, VALUE aa, VALUE bb)
@@ -587,7 +575,7 @@ static VALUE rb_GSL_MAX_INT(VALUE obj, VALUE aa, VALUE bb)
 {
   if (TYPE(aa) != T_FIXNUM || TYPE(bb) != T_FIXNUM)
     return rb_GSL_MAX(obj, aa, bb);
-  else 
+  else
     return INT2FIX(GSL_MAX_INT(FIX2INT(aa), FIX2INT(bb)));
 }
 
@@ -595,11 +583,10 @@ static VALUE rb_GSL_MIN_INT(VALUE obj, VALUE aa, VALUE bb)
 {
   if (TYPE(aa) != T_FIXNUM || TYPE(bb) != T_FIXNUM)
     return rb_GSL_MIN(obj, aa, bb);
-  return 
+  return
     INT2FIX(GSL_MIN_INT(FIX2INT(aa), FIX2INT(bb)));
 }
 
-#ifdef GSL_1_3_LATER
 static VALUE rb_gsl_ldexp(VALUE obj, VALUE x, VALUE e)
 {
   return rb_float_new(gsl_ldexp(NUM2DBL(x), FIX2INT(e)));
@@ -613,7 +600,6 @@ static VALUE rb_gsl_frexp(VALUE obj, VALUE x)
   val = gsl_frexp(NUM2DBL(x), &e);
   return rb_ary_new3(2, rb_float_new(val), INT2FIX(e));
 }
-#endif
 
 static VALUE rb_gsl_fcmp(int argc, VALUE *argv, VALUE obj)
 {
@@ -621,7 +607,7 @@ static VALUE rb_gsl_fcmp(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 3:
     epsilon = NUM2DBL(argv[2]);
-    /* no break, do next */
+  /* no break, do next */
   case 2:
     a = NUM2DBL(argv[0]);
     b = NUM2DBL(argv[1]);
@@ -641,7 +627,7 @@ static VALUE rb_gsl_equal(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 3:
     epsilon = NUM2DBL(argv[2]);
-    /* no break, do next */
+  /* no break, do next */
   case 2:
     a = NUM2DBL(argv[0]);
     b = NUM2DBL(argv[1]);
@@ -668,14 +654,12 @@ void Init_gsl_math(VALUE module)
   rb_define_module_function(module, "isinf?", rb_gsl_isinf2, 1);
   rb_define_module_function(module, "finite", rb_gsl_finite, 1);
   rb_define_module_function(module, "finite?", rb_gsl_finite2, 1);
-			    
+
   rb_define_module_function(module, "sqrt", rb_gsl_sqrt, 1);
   rb_define_module_function(module, "log1p", rb_gsl_log1p, 1);
   rb_define_module_function(module, "expm1", rb_gsl_expm1, 1);
   rb_define_module_function(module, "hypot", rb_gsl_hypot, 2);
-#ifdef GSL_1_10_LATER
-  rb_define_module_function(module, "hypot3", rb_gsl_hypot3, 3);  
-#endif
+  rb_define_module_function(module, "hypot3", rb_gsl_hypot3, 3);
   rb_define_module_function(module, "acosh", rb_gsl_acosh, 1);
   rb_define_module_function(module, "asinh", rb_gsl_asinh, 1);
   rb_define_module_function(module, "atanh", rb_gsl_atanh, 1);
@@ -691,7 +675,7 @@ void Init_gsl_math(VALUE module)
   rb_define_module_function(module, "pow_9", rb_gsl_pow_9, 1);
   rb_define_module_function(module, "sign", rb_GSL_SIGN, 1);
   rb_define_module_function(module, "SIGN", rb_GSL_SIGN, 1);
-  
+
   rb_define_module_function(module, "is_odd", rb_GSL_IS_ODD, 1);
   rb_define_module_function(module, "IS_ODD", rb_GSL_IS_ODD, 1);
   rb_define_module_function(module, "is_odd?", rb_GSL_IS_ODD2, 1);
@@ -717,8 +701,6 @@ void Init_gsl_math(VALUE module)
 
   rb_define_module_function(module, "fcmp", rb_gsl_fcmp, -1);
   rb_define_singleton_method(module, "equal?", rb_gsl_equal, -1);
-#ifdef GSL_1_3_LATER
   rb_define_module_function(module, "ldexp", rb_gsl_ldexp, 2);
   rb_define_module_function(module, "frexp", rb_gsl_frexp, 1);
-#endif
 }
diff --git a/ext/gsl/matrix.c b/ext/gsl_native/matrix.c
similarity index 82%
rename from ext/gsl/matrix.c
rename to ext/gsl_native/matrix.c
index f457263..4c92be4 100644
--- a/ext/gsl/matrix.c
+++ b/ext/gsl_native/matrix.c
@@ -18,21 +18,19 @@
 #include "include/rb_gsl_histogram.h"
 #include "include/rb_gsl_complex.h"
 #include "include/rb_gsl_poly.h"
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
-int gsl_linalg_matmult_int(const gsl_matrix_int *A, 
-			   const gsl_matrix_int *B, gsl_matrix_int *C);
+int gsl_linalg_matmult_int(const gsl_matrix_int *A,
+                           const gsl_matrix_int *B, gsl_matrix_int *C);
 
 #define BASE_DOUBLE
 #include "include/templates_on.h"
-#include "matrix_source.c"
+#include "matrix_source.h"
 #include "include/templates_off.h"
 #undef  BASE_DOUBLE
 
 #define BASE_INT
 #include "include/templates_on.h"
-#include "matrix_source.c"
+#include "matrix_source.h"
 #include "include/templates_off.h"
 #undef  BASE_INT
diff --git a/ext/gsl/matrix_complex.c b/ext/gsl_native/matrix_complex.c
similarity index 92%
rename from ext/gsl/matrix_complex.c
rename to ext/gsl_native/matrix_complex.c
index b0b058c..5c28767 100644
--- a/ext/gsl/matrix_complex.c
+++ b/ext/gsl_native/matrix_complex.c
@@ -27,7 +27,7 @@ void get_range_beg_en_n(VALUE range, double *beg, double *en, size_t *n, int *st
 
 // From ext/matrix_source.c
 void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
-    size_t *i, size_t *j, size_t *n1, size_t *n2);
+                          size_t *i, size_t *j, size_t *n1, size_t *n2);
 
 static VALUE rb_gsl_matrix_complex_arithmetics(int flag, VALUE obj, VALUE bb)
 {
@@ -73,28 +73,28 @@ static VALUE rb_gsl_matrix_complex_arithmetics(int flag, VALUE obj, VALUE bb)
       Data_Get_Struct(bb, gsl_matrix_complex, cmb);
       switch (flag) {
       case GSL_MATRIX_COMPLEX_ADD:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_add(cmnew, cmb);
-	return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_add(cmnew, cmb);
+        return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
+        break;
       case GSL_MATRIX_COMPLEX_SUB:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_sub(cmnew,cmb);
-	return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_sub(cmnew,cmb);
+        return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
+        break;
       case GSL_MATRIX_COMPLEX_MUL:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_mul_elements(cmnew, cmb);
-	return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_mul_elements(cmnew, cmb);
+        return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
+        break;
       case GSL_MATRIX_COMPLEX_DIV:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_div_elements(cmnew, cmb);
-	return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_div_elements(cmnew, cmb);
+        return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation not defined");
-	break;
+        rb_raise(rb_eRuntimeError, "operation not defined");
+        break;
       }
     } else if (rb_obj_is_kind_of(bb, cgsl_matrix)) {
       Data_Get_Struct(bb, gsl_matrix, m);
@@ -102,80 +102,80 @@ static VALUE rb_gsl_matrix_complex_arithmetics(int flag, VALUE obj, VALUE bb)
       cmnew = make_matrix_complex_clone(cm);
       switch (flag) {
       case GSL_MATRIX_COMPLEX_ADD:
-	gsl_matrix_complex_add(cmnew, cmb);
-	break;
+        gsl_matrix_complex_add(cmnew, cmb);
+        break;
       case GSL_MATRIX_COMPLEX_SUB:
-	gsl_matrix_complex_sub(cmnew,cmb);
-	break;
+        gsl_matrix_complex_sub(cmnew,cmb);
+        break;
       case GSL_MATRIX_COMPLEX_MUL:
-	gsl_matrix_complex_mul_elements(cmnew, cmb);
-	break;
+        gsl_matrix_complex_mul_elements(cmnew, cmb);
+        break;
       case GSL_MATRIX_COMPLEX_DIV:
-	gsl_matrix_complex_div_elements(cmnew, cmb);
-	break;
+        gsl_matrix_complex_div_elements(cmnew, cmb);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation not defined");
-	break;
+        rb_raise(rb_eRuntimeError, "operation not defined");
+        break;
       }
       return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
     } else if (rb_obj_is_kind_of(bb, cgsl_complex)) {
       Data_Get_Struct(bb, gsl_complex, c);
       switch (flag) {
       case GSL_MATRIX_COMPLEX_ADD:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_add_constant(cmnew, *c);
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_add_constant(cmnew, *c);
+        break;
       case GSL_MATRIX_COMPLEX_SUB:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_add_constant(cmnew, gsl_complex_negative(*c));
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_add_constant(cmnew, gsl_complex_negative(*c));
+        break;
       case GSL_MATRIX_COMPLEX_MUL:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_scale(cmnew, *c);
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_scale(cmnew, *c);
+        break;
       case GSL_MATRIX_COMPLEX_DIV:
-	cmnew = make_matrix_complex_clone(cm);
-	gsl_matrix_complex_scale(cmnew, gsl_complex_inverse(*c));
-	break;
+        cmnew = make_matrix_complex_clone(cm);
+        gsl_matrix_complex_scale(cmnew, gsl_complex_inverse(*c));
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation not defined");
-	break;
+        rb_raise(rb_eRuntimeError, "operation not defined");
+        break;
       }
       return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
     } else if (rb_obj_is_kind_of(bb, cgsl_vector)) {
       Data_Get_Struct(bb, gsl_vector, v);
       switch (flag) {
       case GSL_MATRIX_COMPLEX_MUL:
-	cvb = vector_to_complex(v);
-	cvnew = gsl_vector_complex_alloc(v->size);
-	if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
-	gsl_matrix_complex_mul_vector(cvnew, cm, cvb);
-	gsl_vector_complex_free(cvb);
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
-	break;
+        cvb = vector_to_complex(v);
+        cvnew = gsl_vector_complex_alloc(v->size);
+        if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
+        gsl_matrix_complex_mul_vector(cvnew, cm, cvb);
+        gsl_vector_complex_free(cvb);
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, 
-		 "operation is not defined %s and Matrix_Complex",
-		 rb_class2name(CLASS_OF(bb)));
-	break;
+        rb_raise(rb_eRuntimeError,
+                 "operation is not defined %s and Matrix_Complex",
+                 rb_class2name(CLASS_OF(bb)));
+        break;
       }
     } else if (rb_obj_is_kind_of(bb, cgsl_vector_complex)) {
       if (!VECTOR_COMPLEX_COL_P(bb))
-	rb_raise(rb_eTypeError, 
-		 "Operation is not defined with %s (Vector::Complex::Col expected)", 
-		 rb_class2name(CLASS_OF(bb)));
+        rb_raise(rb_eTypeError,
+                 "Operation is not defined with %s (Vector::Complex::Col expected)",
+                 rb_class2name(CLASS_OF(bb)));
       Data_Get_Struct(bb, gsl_vector_complex, cv);
       switch (flag) {
       case GSL_MATRIX_COMPLEX_MUL:
-	cvnew = gsl_vector_complex_alloc(cv->size);
-	if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
-	gsl_matrix_complex_mul_vector(cvnew, cm, cv);
-	return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cvnew);;
+        cvnew = gsl_vector_complex_alloc(cv->size);
+        if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
+        gsl_matrix_complex_mul_vector(cvnew, cm, cv);
+        return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cvnew);
       default:
-	rb_raise(rb_eRuntimeError, 
-		 "operation is not defined %s and Matrix_Complex",
-		 rb_class2name(CLASS_OF(bb)));
-	break;
+        rb_raise(rb_eRuntimeError,
+                 "operation is not defined %s and Matrix_Complex",
+                 rb_class2name(CLASS_OF(bb)));
+        break;
       }
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
@@ -218,15 +218,15 @@ static VALUE rb_gsl_matrix_complex_eye(int argc, VALUE *argv, VALUE klass)
       //      if (RARRAY(argv[1])->len < 2) rb_raise(rb_eArgError, "wrong argument");
       if (RARRAY_LEN(argv[1]) < 2) rb_raise(rb_eArgError, "wrong argument");
       z = gsl_complex_rect(NUM2DBL(rb_ary_entry(argv[1], 0)),
-			   NUM2DBL(rb_ary_entry(argv[1], 1)));
+                           NUM2DBL(rb_ary_entry(argv[1], 1)));
       break;
     default:
       if (rb_obj_is_kind_of(argv[1], cgsl_complex)) {
-	Data_Get_Struct(argv[1], gsl_complex, pz);
+        Data_Get_Struct(argv[1], gsl_complex, pz);
         z = *pz;
       } else {
-	rb_raise(rb_eTypeError, 
-		 "wrong argument type %s", rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError,
+                 "wrong argument type %s", rb_class2name(CLASS_OF(argv[1])));
       }
       break;
     }
@@ -244,7 +244,7 @@ static VALUE rb_gsl_matrix_complex_eye(int argc, VALUE *argv, VALUE klass)
   m = gsl_matrix_complex_calloc(n, n);
   if (m == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_complex_alloc failed");
   for (i = 0; i < n; i++) gsl_matrix_complex_set(m, i, i, z);
-  return  Data_Wrap_Struct(klass, 0, gsl_matrix_complex_free, m);
+  return Data_Wrap_Struct(klass, 0, gsl_matrix_complex_free, m);
 }
 
 static VALUE rb_gsl_matrix_complex_identity(VALUE klass, VALUE nn)
@@ -258,7 +258,7 @@ static VALUE rb_gsl_matrix_complex_identity(VALUE klass, VALUE nn)
   if (m == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_complex_calloc failed");
   z = gsl_complex_rect(1.0, 0.0);
   for (i = 0; i < n; i++) gsl_matrix_complex_set(m, i, i, z);
-  return  Data_Wrap_Struct(klass, 0, gsl_matrix_complex_free, m);
+  return Data_Wrap_Struct(klass, 0, gsl_matrix_complex_free, m);
 }
 
 static VALUE rb_gsl_matrix_complex_set_zero(VALUE obj)
@@ -300,8 +300,8 @@ static VALUE rb_gsl_matrix_complex_set_all(VALUE obj, VALUE s)
       Data_Get_Struct(s, gsl_complex, z);
       gsl_matrix_complex_set_all(m, *z);
     } else {
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s", rb_class2name(CLASS_OF(s)));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s", rb_class2name(CLASS_OF(s)));
     }
     break;
   }
@@ -323,7 +323,6 @@ static VALUE rb_gsl_matrix_complex_set(int argc, VALUE *argv, VALUE obj)
   if(argc < 1 || argc > 5) {
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-5)", argc);
   }
-
   Data_Get_Struct(obj, gsl_matrix_complex, m);
   other = argv[argc-1];
 
@@ -357,7 +356,7 @@ static VALUE rb_gsl_matrix_complex_set(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(other, gsl_matrix_complex, mother);
       if(n1 * n2 != mother->size1 * mother->size2) {
         rb_raise(rb_eRangeError, "sizes do not match (%d x %d != %d x %d)",
-		 (int) n1, (int) n2, (int) mother->size1, (int) mother->size2);
+                 (int) n1, (int) n2, (int) mother->size1, (int) mother->size2);
       }
       // TODO Change to gsl_matrix_memmove if/when GSL has such a function
       // because gsl_matrix_memcpy does not handle overlapping regions (e.g.
@@ -375,7 +374,7 @@ static VALUE rb_gsl_matrix_complex_set(int argc, VALUE *argv, VALUE obj)
         // m[...] = [[row0], [row1], ...] # multiple rows
         if((int) n1 != RARRAY_LEN(other)) {
           rb_raise(rb_eRangeError, "row counts do not match (%d != %d)",
-		   (int) n1, (int) RARRAY_LEN(other));
+                   (int) n1, (int) RARRAY_LEN(other));
         }
         for(k = 0; k < n1; k++) {
           vv = gsl_matrix_complex_row(&mv.matrix, k);
@@ -399,7 +398,6 @@ static VALUE rb_gsl_matrix_complex_set(int argc, VALUE *argv, VALUE obj)
       gsl_matrix_complex_set_all(&mv.matrix, rb_gsl_obj_to_gsl_complex(other, NULL));
     }
   }
-
   return obj;
 }
 
@@ -409,7 +407,7 @@ static VALUE rb_gsl_matrix_complex_set_row(int argc, VALUE *argv, VALUE obj)
   size_t i, k;
   gsl_complex z, *pz = &z;
   if (argc < 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 2)",
-			 argc);
+                         argc);
   CHECK_FIXNUM(argv[0]);
   Data_Get_Struct(obj, gsl_matrix_complex, A);
   i = FIX2INT(argv[0]);
@@ -436,7 +434,7 @@ static VALUE rb_gsl_matrix_complex_set_col(int argc, VALUE *argv, VALUE obj)
   int j, k;
   gsl_complex z, *pz = &z;
   if (argc < 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 2)",
-			 argc);
+                         argc);
   CHECK_FIXNUM(argv[0]);
   Data_Get_Struct(obj, gsl_matrix_complex, A);
   j = FIX2INT(argv[0]);
@@ -473,7 +471,7 @@ static VALUE rb_gsl_matrix_complex_get(int argc, VALUE *argv, VALUE obj)
     if(ii < 0) ii += m->size1;
     if(ij < 0) ij += m->size2;
     c = ALLOC(gsl_complex);
-    *c = gsl_matrix_complex_get(m, (size_t)ii, (size_t)ij); 
+    *c = gsl_matrix_complex_get(m, (size_t)ii, (size_t)ij);
     retval = Data_Wrap_Struct(cgsl_complex, 0, free, c);
   } else if(argc == 1 && TYPE(argv[0]) == T_FIXNUM) {
     // m[i]
@@ -492,7 +490,7 @@ static VALUE rb_gsl_matrix_complex_get(int argc, VALUE *argv, VALUE obj)
       if(ii < 0) ii += m->size1;
       if(ij < 0) ij += m->size2;
       c = ALLOC(gsl_complex);
-      *c = gsl_matrix_complex_get(m, (size_t)ii, (size_t)ij); 
+      *c = gsl_matrix_complex_get(m, (size_t)ii, (size_t)ij);
       retval = Data_Wrap_Struct(cgsl_complex, 0, free, c);
     } else {
       rb_raise(rb_eArgError, "Array index must have length 2, not %d", (int) RARRAY_LEN(argv[0]));
@@ -500,7 +498,6 @@ static VALUE rb_gsl_matrix_complex_get(int argc, VALUE *argv, VALUE obj)
   } else {
     retval = rb_gsl_matrix_complex_submatrix(argc, argv, obj);
   }
-
   return retval;
 }
 
@@ -546,12 +543,12 @@ static VALUE rb_gsl_matrix_complex_to_a(VALUE obj)
   size_t i, j;
   Data_Get_Struct(obj, gsl_matrix_complex, m);
   ma = rb_ary_new2(m->size1);
-  for(i=0; i < m->size1; i++) {
+  for(i = 0; i < m->size1; i++) {
     ra = rb_ary_new2(m->size2);
     rb_ary_store(ma, i, ra);
-    for(j=0; j < m->size2; j++) {
+    for(j = 0; j < m->size2; j++) {
       c = ALLOC(gsl_complex);
-      *c = gsl_matrix_complex_get(m, i, j); 
+      *c = gsl_matrix_complex_get(m, i, j);
       rb_ary_store(ra, j, Data_Wrap_Struct(cgsl_complex, 0, free, c));
     }
   }
@@ -610,11 +607,11 @@ static VALUE rb_gsl_matrix_complex_to_s(int argc, VALUE *argv, VALUE obj)
   int max_rows = 4;
   int max_cols = 4;
 
-  switch(argc){
-    case 2: max_cols = NUM2INT(argv[1]);
-    case 1: max_rows = NUM2INT(argv[0]);
-    case 0: break;
-    default:
+  switch(argc) {
+  case 2: max_cols = NUM2INT(argv[1]);
+  case 1: max_rows = NUM2INT(argv[0]);
+  case 0: break;
+  default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 0, 1, or 2)", argc);
   }
 
@@ -628,7 +625,7 @@ static VALUE rb_gsl_matrix_complex_to_s(int argc, VALUE *argv, VALUE obj)
     for (j = 0; j < m->size2; j++) {
       z = gsl_matrix_complex_get(m, i, j);
       sprintf(buf,
-          "%s[ %4.3e %4.3e ]", (j==0) ? "" : " ", GSL_REAL(z), GSL_IMAG(z));
+              "%s[ %4.3e %4.3e ]", (j==0) ? "" : " ", GSL_REAL(z), GSL_IMAG(z));
       rb_str_cat(str, buf, strlen(buf));
       // if too many cols
       if ((int) j >= max_cols-1 && j != m->size2-1) {
@@ -926,8 +923,8 @@ static VALUE rb_gsl_matrix_complex_add_diagonal(VALUE obj, VALUE s)
       Data_Get_Struct(s, gsl_complex, z);
       gsl_matrix_complex_add_diagonal(m, *z);
     } else {
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s", rb_class2name(CLASS_OF(s)));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s", rb_class2name(CLASS_OF(s)));
     }
     break;
   }
@@ -1001,7 +998,7 @@ static VALUE rb_gsl_matrix_complex_set_diagonal(VALUE obj, VALUE diag)
     for (i = 0; i < m->size1; i++) gsl_matrix_complex_set(m, i, i, gsl_vector_complex_get(v, i));
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector_Complex or Array expected)",
-	     rb_class2name(CLASS_OF(diag)));
+             rb_class2name(CLASS_OF(diag)));
   }
   return obj;
 }
@@ -1055,7 +1052,7 @@ static VALUE rb_gsl_matrix_complex_coerce(VALUE obj, VALUE other)
       return rb_ary_new3(2, vcm, obj);
     } else {
       rb_raise(rb_eTypeError, "cannot coerce %s to GSL::Matrix::Complex",
-	       rb_class2name(CLASS_OF(other)));
+               rb_class2name(CLASS_OF(other)));
     }
     break;
   }
@@ -1273,8 +1270,8 @@ static VALUE rb_gsl_matrix_complex_logabs(VALUE obj)
   return rb_gsl_matrix_complex_XXX(obj, gsl_complex_logabs);
 }
 
-static VALUE rb_gsl_matrix_complex_XXX_complex(VALUE obj, 
-					       gsl_complex (*f)(gsl_complex))
+static VALUE rb_gsl_matrix_complex_XXX_complex(VALUE obj,
+                                               gsl_complex (*f)(gsl_complex))
 {
   gsl_matrix_complex *m, *mnew;
   size_t i, j;
@@ -1525,14 +1522,14 @@ static VALUE rb_gsl_matrix_complex_indgen_singleton(int argc, VALUE *argv, VALUE
 // function, but it only determines absolute equality (i.e. is has no epsilon
 // argument).
 static int gsl_matrix_complex_equal_eps(const gsl_matrix_complex *m1,
-  const gsl_matrix_complex *m2, double eps)
+                                        const gsl_matrix_complex *m2, double eps)
 {
   gsl_complex z1, z2;
   size_t i, j;
   if (m1->size1 != m2->size1) return 0;
-  if (m1->size2 != m2->size2) return 0;  
+  if (m1->size2 != m2->size2) return 0;
   for (i = 0; i < m1->size1; i++) {
-    for (j = 0; j < m1->size2; j++) {    
+    for (j = 0; j < m1->size2; j++) {
       z1 = gsl_matrix_complex_get(m1, i, j);
       z2 = gsl_matrix_complex_get(m2, i, j);
       if (!rbgsl_complex_equal(&z1, &z2, eps)) return 0;
@@ -1602,7 +1599,7 @@ void Init_gsl_matrix_complex(VALUE module)
   rb_define_method(cgsl_matrix_complex, "fwrite", rb_gsl_matrix_complex_fwrite, 1);
   rb_define_method(cgsl_matrix_complex, "fread", rb_gsl_matrix_complex_fread, 1);
   rb_define_method(cgsl_matrix_complex, "fscanf", rb_gsl_matrix_complex_fscanf, 1);
-  
+
   rb_define_singleton_method(cgsl_matrix_complex, "memcpy", rb_gsl_matrix_complex_memcpy, 2);
   rb_define_method(cgsl_matrix_complex, "clone", rb_gsl_matrix_complex_clone, 0);
   rb_define_alias(cgsl_matrix_complex, "duplicate", "clone");
@@ -1610,10 +1607,10 @@ void Init_gsl_matrix_complex(VALUE module)
   rb_define_method(cgsl_matrix_complex, "swap_rows", rb_gsl_matrix_complex_swap_rows, 2);
   rb_define_method(cgsl_matrix_complex, "swap_columns", rb_gsl_matrix_complex_swap_columns, 2);
   rb_define_method(cgsl_matrix_complex, "swap_rowcol", rb_gsl_matrix_complex_swap_rowcol, 2);
-  
+
   rb_define_method(cgsl_matrix_complex, "transpose", rb_gsl_matrix_complex_transpose, 0);
   rb_define_method(cgsl_matrix_complex, "isnull", rb_gsl_matrix_complex_isnull, 0);
-  
+
   rb_define_method(cgsl_matrix_complex, "add", rb_gsl_matrix_complex_add, 1);
   rb_define_alias(cgsl_matrix_complex, "add_constant", "add");
   rb_define_alias(cgsl_matrix_complex, "+", "add");
@@ -1624,13 +1621,13 @@ void Init_gsl_matrix_complex(VALUE module)
   rb_define_alias(cgsl_matrix_complex, "/", "div_elements");
   rb_define_method(cgsl_matrix_complex, "scale", rb_gsl_matrix_complex_scale, 1);
   rb_define_method(cgsl_matrix_complex, "scale!", rb_gsl_matrix_complex_scale_bang, 1);
-  
+
   rb_define_method(cgsl_matrix_complex, "add_diagonal", rb_gsl_matrix_complex_add_diagonal, 1);
-  
+
   rb_define_method(cgsl_matrix_complex, "set_zero", rb_gsl_matrix_complex_set_zero, 0);
   rb_define_method(cgsl_matrix_complex, "set_identity", rb_gsl_matrix_complex_set_identity, 0);
   rb_define_method(cgsl_matrix_complex, "set_all", rb_gsl_matrix_complex_set_all, 1);
-  
+
   rb_define_method(cgsl_matrix_complex, "submatrix", rb_gsl_matrix_complex_submatrix, -1);
   rb_define_alias(cgsl_matrix_complex, "view", "submatrix");
   rb_define_method(cgsl_matrix_complex, "row", rb_gsl_matrix_complex_row, 1);
@@ -1642,13 +1639,13 @@ void Init_gsl_matrix_complex(VALUE module)
   rb_define_method(cgsl_matrix_complex, "set_diagonal", rb_gsl_matrix_complex_set_diagonal, 1);
   rb_define_method(cgsl_matrix_complex, "subdiagonal", rb_gsl_matrix_complex_subdiagonal, 1);
   rb_define_method(cgsl_matrix_complex, "superdiagonal", rb_gsl_matrix_complex_superdiagonal, 1);
-  
+
   rb_define_method(cgsl_matrix_complex, "coerce", rb_gsl_matrix_complex_coerce, 1);
-  
+
   rb_define_method(cgsl_matrix_complex, "mul", rb_gsl_matrix_complex_mul, 1);
   rb_define_alias(cgsl_matrix_complex, "*", "mul");
   rb_define_method(cgsl_matrix_complex, "mul!", rb_gsl_matrix_complex_mul2, 1);
-  
+
   rb_define_method(cgsl_matrix_complex, "real", rb_gsl_matrix_complex_real, 0);
   rb_define_alias(cgsl_matrix_complex, "to_real", "real");
   rb_define_alias(cgsl_matrix_complex, "re", "real");
@@ -1662,7 +1659,7 @@ void Init_gsl_matrix_complex(VALUE module)
   rb_define_alias(cgsl_matrix_complex, "conj", "conjugate");
   rb_define_method(cgsl_matrix_complex, "dagger!", rb_gsl_matrix_complex_dagger, 0);
   rb_define_method(cgsl_matrix_complex, "dagger", rb_gsl_matrix_complex_dagger2, 0);
-  
+
   rb_define_method(cgsl_matrix_complex, "trace", rb_gsl_matrix_complex_trace, 0);
   rb_define_method(cgsl_matrix_complex, "each_row", rb_gsl_matrix_complex_each_row, 0);
   rb_define_method(cgsl_matrix_complex, "each_col", rb_gsl_matrix_complex_each_col, 0);
@@ -1671,14 +1668,14 @@ void Init_gsl_matrix_complex(VALUE module)
   rb_define_method(cgsl_matrix_complex, "collect!", rb_gsl_matrix_complex_collect_bang, 0);
   rb_define_alias(cgsl_matrix_complex, "map", "collect");
   rb_define_alias(cgsl_matrix_complex, "map!", "collect!");
-  
+
   rb_define_method(cgsl_matrix_complex, "to_a", rb_gsl_matrix_complex_to_a, 0);
 
   rb_define_method(cgsl_matrix_complex, "size1", rb_gsl_matrix_complex_size1, 0);
   rb_define_method(cgsl_matrix_complex, "size2", rb_gsl_matrix_complex_size2, 0);
   rb_define_method(cgsl_matrix_complex, "shape", rb_gsl_matrix_complex_shape, 0);
   rb_define_alias(cgsl_matrix_complex, "size", "shape");
-  
+
   /*****/
   rb_define_method(cgsl_matrix_complex, "-@", rb_gsl_matrix_complex_uminus, 0);
   rb_define_method(cgsl_matrix_complex, "+@", rb_gsl_matrix_complex_uplus, 0);
@@ -1728,9 +1725,9 @@ void Init_gsl_matrix_complex(VALUE module)
   rb_define_method(cgsl_matrix_complex, "indgen", rb_gsl_matrix_complex_indgen, -1);
   rb_define_method(cgsl_matrix_complex, "indgen!", rb_gsl_matrix_complex_indgen_bang, -1);
   rb_define_singleton_method(cgsl_matrix_complex, "indgen", rb_gsl_matrix_complex_indgen_singleton, -1);
-  
+
   rb_define_method(cgsl_matrix_complex, "equal?", rb_gsl_matrix_complex_equal, -1);
   rb_define_alias(cgsl_matrix_complex, "==", "equal?");
   rb_define_method(cgsl_matrix_complex, "not_equal?", rb_gsl_matrix_complex_not_equal, -1);
-  rb_define_alias(cgsl_matrix_complex, "!=", "not_equal?");    
+  rb_define_alias(cgsl_matrix_complex, "!=", "not_equal?");
 }
diff --git a/ext/gsl/matrix_double.c b/ext/gsl_native/matrix_double.c
similarity index 82%
rename from ext/gsl/matrix_double.c
rename to ext/gsl_native/matrix_double.c
index 3c11852..42c3120 100644
--- a/ext/gsl/matrix_double.c
+++ b/ext/gsl_native/matrix_double.c
@@ -2,7 +2,7 @@
   matrix_double.c
   Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
     (C) Copyright 2001-2006 by Yoshiki Tsunesada
-  
+
   Ruby/GSL is free software: you can redistribute it and/or modify it
   under the terms of the GNU General Public License.
   This library is distributed in the hope that it will be useful, but
@@ -11,9 +11,7 @@
 
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_complex.h"
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
 enum {
   GSL_MATRIX_ADD,
@@ -62,29 +60,28 @@ static VALUE rb_gsl_matrix_arithmetics(int flag, VALUE obj, VALUE bb)
   default:
     if (MATRIX_INT_P(bb)) bb = rb_gsl_matrix_int_to_f(bb);
     if (VECTOR_INT_P(bb)) bb = rb_gsl_vector_int_to_f(bb);
-
     if (rb_obj_is_kind_of(bb, cgsl_matrix)) {
       Data_Get_Struct(bb, gsl_matrix, mb);
       switch (flag) {
       case GSL_MATRIX_ADD:
-	mnew = make_matrix_clone(m);
-	gsl_matrix_add(mnew, mb);
-	break;
+        mnew = make_matrix_clone(m);
+        gsl_matrix_add(mnew, mb);
+        break;
       case GSL_MATRIX_SUB:
-	mnew = make_matrix_clone(m);
-	gsl_matrix_sub(mnew,mb);
-	break;
+        mnew = make_matrix_clone(m);
+        gsl_matrix_sub(mnew,mb);
+        break;
       case GSL_MATRIX_MUL:
-	mnew = make_matrix_clone(m);
-	gsl_matrix_mul_elements(mnew, mb);
-	break;
+        mnew = make_matrix_clone(m);
+        gsl_matrix_mul_elements(mnew, mb);
+        break;
       case GSL_MATRIX_DIV:
-	mnew = make_matrix_clone(m);
-	gsl_matrix_div_elements(mnew, mb);
-	break;
+        mnew = make_matrix_clone(m);
+        gsl_matrix_div_elements(mnew, mb);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation not defined");
-	break;
+        rb_raise(rb_eRuntimeError, "operation not defined");
+        break;
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else if (rb_obj_is_kind_of(bb, cgsl_matrix_complex)) {
@@ -92,20 +89,20 @@ static VALUE rb_gsl_matrix_arithmetics(int flag, VALUE obj, VALUE bb)
       cmnew = matrix_to_complex(m);
       switch (flag) {
       case GSL_MATRIX_ADD:
-	gsl_matrix_complex_add(cmnew, cmb);
-	break;
+        gsl_matrix_complex_add(cmnew, cmb);
+        break;
       case GSL_MATRIX_SUB:
-	gsl_matrix_complex_sub(cmnew,cmb);
-	break;
+        gsl_matrix_complex_sub(cmnew,cmb);
+        break;
       case GSL_MATRIX_MUL:
-	gsl_matrix_complex_mul_elements(cmnew, cmb);
-	break;
+        gsl_matrix_complex_mul_elements(cmnew, cmb);
+        break;
       case GSL_MATRIX_DIV:
-	gsl_matrix_complex_div_elements(cmnew, cmb);
-	break;
+        gsl_matrix_complex_div_elements(cmnew, cmb);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation not defined");
-	break;
+        rb_raise(rb_eRuntimeError, "operation not defined");
+        break;
       }
       return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
     } else if (rb_obj_is_kind_of(bb, cgsl_complex)) {
@@ -113,60 +110,60 @@ static VALUE rb_gsl_matrix_arithmetics(int flag, VALUE obj, VALUE bb)
       cmnew = matrix_to_complex(m);
       switch (flag) {
       case GSL_MATRIX_ADD:
-	gsl_matrix_complex_add_constant(cmnew, *c);
-	break;
+        gsl_matrix_complex_add_constant(cmnew, *c);
+        break;
       case GSL_MATRIX_SUB:
-	gsl_matrix_complex_add_constant(cmnew, gsl_complex_negative(*c));
-	break;
+        gsl_matrix_complex_add_constant(cmnew, gsl_complex_negative(*c));
+        break;
       case GSL_MATRIX_MUL:
-	gsl_matrix_complex_scale(cmnew, *c);
-	break;
+        gsl_matrix_complex_scale(cmnew, *c);
+        break;
       case GSL_MATRIX_DIV:
-	gsl_matrix_complex_scale(cmnew, gsl_complex_inverse(*c));
-	break;
+        gsl_matrix_complex_scale(cmnew, gsl_complex_inverse(*c));
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation not defined");
-	break;
+        rb_raise(rb_eRuntimeError, "operation not defined");
+        break;
       }
       return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cmnew);
     } else if (rb_obj_is_kind_of(bb, cgsl_vector)) {
       if (!VECTOR_COL_P(bb))
-	rb_raise(rb_eTypeError, 
-		 "Operation with %s is not defined (GSL::Vector::Col expected)", 
-		 rb_class2name(CLASS_OF(bb)));
+        rb_raise(rb_eTypeError,
+                 "Operation with %s is not defined (GSL::Vector::Col expected)",
+                 rb_class2name(CLASS_OF(bb)));
       Data_Get_Struct(bb, gsl_vector, v);
       switch (flag) {
       case GSL_MATRIX_MUL:
-	//	vnew = gsl_vector_alloc(v->size);
-	vnew = gsl_vector_alloc(m->size1);
-	if (vnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
-	gsl_matrix_mul_vector(vnew, m, v);
-	return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, vnew);
-	break;
+        //  vnew = gsl_vector_alloc(v->size);
+        vnew = gsl_vector_alloc(m->size1);
+        if (vnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
+        gsl_matrix_mul_vector(vnew, m, v);
+        return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, vnew);
+        break;
       case GSL_MATRIX_DIV:
-	return rb_gsl_linalg_LU_solve(1, &bb, obj);
-	break;
+        return rb_gsl_linalg_LU_solve(1, &bb, obj);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation is not defined %s and Matrix",
-		 rb_class2name(CLASS_OF(bb)));
-	break;
+        rb_raise(rb_eRuntimeError, "operation is not defined %s and Matrix",
+                 rb_class2name(CLASS_OF(bb)));
+        break;
       }
     } else if (rb_obj_is_kind_of(bb, cgsl_vector_complex)) {
       Data_Get_Struct(bb, gsl_vector_complex, cv);
       switch (flag) {
       case GSL_MATRIX_MUL:
-	cm = matrix_to_complex(m);
-	//	cvnew = gsl_vector_complex_alloc(cv->size);
-	cvnew = gsl_vector_complex_alloc(m->size1);
-	if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
-	gsl_matrix_complex_mul_vector(cvnew, cm, cv);
-	gsl_matrix_complex_free(cm);
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
-	break;
+        cm = matrix_to_complex(m);
+        //  cvnew = gsl_vector_complex_alloc(cv->size);
+        cvnew = gsl_vector_complex_alloc(m->size1);
+        if (cvnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
+        gsl_matrix_complex_mul_vector(cvnew, cm, cv);
+        gsl_matrix_complex_free(cm);
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "operation is not defined %s and Matrix",
-		 rb_class2name(CLASS_OF(bb)));
-	break;
+        rb_raise(rb_eRuntimeError, "operation is not defined %s and Matrix",
+                 rb_class2name(CLASS_OF(bb)));
+        break;
       }
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
@@ -236,8 +233,8 @@ static VALUE rb_gsl_matrix_mul(VALUE obj, VALUE bb)
       return rb_gsl_matrix_mul_elements(obj, bb);
       break;
     default:
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
       break;
     }
   }
@@ -271,8 +268,8 @@ static VALUE rb_gsl_matrix_mul_bang(VALUE obj, VALUE bb)
       return obj;
       break;
     default:
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s", rb_class2name(CLASS_OF(bb)));
       break;
     }
   }
@@ -336,8 +333,8 @@ static VALUE rb_gsl_matrix_coerce(VALUE obj, VALUE other)
       vcm = Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, cm);
       return rb_ary_new3(2, other, vcm);
     } else {
-      rb_raise(rb_eTypeError, "cannot coerce %s to Matrix", 
-	       rb_class2name(CLASS_OF(other)));
+      rb_raise(rb_eTypeError, "cannot coerce %s to Matrix",
+               rb_class2name(CLASS_OF(other)));
     }
     break;
   }
@@ -384,7 +381,7 @@ static VALUE rb_gsl_matrix_clean(int argc, VALUE *argv, VALUE obj)
   mnew = make_matrix_clone(m);
   n = m->size1*m->size2;
   for (i = 0; i < n; i++) if (fabs(mnew->data[i]) < eps) mnew->data[i] = 0.0;
-  return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);;
+  return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
 }
 
 static VALUE rb_gsl_matrix_clean_bang(int argc, VALUE *argv, VALUE obj)
@@ -411,8 +408,8 @@ static VALUE rb_gsl_matrix_clean_bang(int argc, VALUE *argv, VALUE obj)
 }
 
 
-static VALUE rb_gsl_matrix_op_inplace(VALUE mm1, VALUE mm2, 
-				      int (*f)(gsl_matrix*, const gsl_matrix*))
+static VALUE rb_gsl_matrix_op_inplace(VALUE mm1, VALUE mm2,
+                                      int (*f)(gsl_matrix*, const gsl_matrix*))
 {
   gsl_matrix *m1, *m2;
   Data_Get_Struct(mm1, gsl_matrix, m1);
@@ -467,7 +464,7 @@ static VALUE rb_gsl_matrix_log10(VALUE obj)
 #include <gsl/gsl_randist.h>
 #include "include/rb_gsl_rng.h"
 static VALUE rb_gsl_matrix_randx(int argc, VALUE *argv, VALUE klass,
-				 double (*f)(const gsl_rng*));
+                                 double (*f)(const gsl_rng*));
 static VALUE rb_gsl_matrix_rand(int argc, VALUE *argv, VALUE klass)
 {
   return rb_gsl_matrix_randx(argc, argv, klass, gsl_rng_uniform);
@@ -479,7 +476,7 @@ static VALUE rb_gsl_matrix_randn(int argc, VALUE *argv, VALUE klass)
 }
 
 static VALUE rb_gsl_matrix_randx(int argc, VALUE *argv, VALUE klass,
-				 double (*f)(const gsl_rng*))
+                                 double (*f)(const gsl_rng*))
 {
   gsl_matrix *m;
   gsl_rng *rng;
@@ -488,8 +485,8 @@ static VALUE rb_gsl_matrix_randx(int argc, VALUE *argv, VALUE klass,
   switch (argc) {
   case 3:
     if (!rb_obj_is_kind_of(argv[2], cgsl_rng)) {
-      rb_raise(rb_eTypeError, 
-	       "Wrong argument type (GSL::Rng expected)");
+      rb_raise(rb_eTypeError,
+               "Wrong argument type (GSL::Rng expected)");
     }
     Data_Get_Struct(argv[2], gsl_rng, rng);
     size1 = FIX2INT(argv[0]);
@@ -530,7 +527,7 @@ void Init_gsl_matrix(VALUE module)
   rb_define_alias(cgsl_matrix, "*", "mul");
   rb_define_method(cgsl_matrix, "mul!", rb_gsl_matrix_mul_bang, 1);
   /***/
- 
+
   rb_define_method(cgsl_matrix, "to_complex", rb_gsl_matrix_to_complex, 0);
 
   rb_define_method(cgsl_matrix, "coerce", rb_gsl_matrix_coerce, 1);
diff --git a/ext/gsl/matrix_int.c b/ext/gsl_native/matrix_int.c
similarity index 78%
rename from ext/gsl/matrix_int.c
rename to ext/gsl_native/matrix_int.c
index 1e0ea01..a7a2dc0 100644
--- a/ext/gsl/matrix_int.c
+++ b/ext/gsl_native/matrix_int.c
@@ -2,7 +2,7 @@
   matrix_int.c
   Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
     (C) Copyright 2001-2006 by Yoshiki Tsunesada
-  
+
   Ruby/GSL is free software: you can redistribute it and/or modify it
   under the terms of the GNU General Public License.
   This library is distributed in the hope that it will be useful, but
@@ -15,8 +15,8 @@
 #include "include/rb_gsl_with_narray.h"
 #endif
 
-int gsl_linalg_matmult_int(const gsl_matrix_int *A, 
-			   const gsl_matrix_int *B, gsl_matrix_int *C);
+int gsl_linalg_matmult_int(const gsl_matrix_int *A,
+                           const gsl_matrix_int *B, gsl_matrix_int *C);
 
 
 VALUE rb_gsl_matrix_to_i(VALUE obj);
@@ -85,16 +85,16 @@ static VALUE rb_gsl_matrix_int_operation1(VALUE obj, VALUE other, int flag)
     bval = NUM2INT(other);
     anew = make_matrix_int_clone(a);
     switch (flag) {
-    case GSL_MATRIX_INT_ADD: 
+    case GSL_MATRIX_INT_ADD:
       /*result =*/ gsl_matrix_int_add_constant(anew, bval);
       break;
-    case GSL_MATRIX_INT_SUB: 
+    case GSL_MATRIX_INT_SUB:
       /*result =*/ gsl_matrix_int_add_constant(anew, -bval);
       break;
-    case GSL_MATRIX_INT_MUL: 
+    case GSL_MATRIX_INT_MUL:
       /*result =*/ gsl_matrix_int_scale(anew, bval);
       break;
-    case GSL_MATRIX_INT_DIV: 
+    case GSL_MATRIX_INT_DIV:
       /*result =*/ gsl_matrix_int_scale(anew, 1.0/bval);
       break;
     default:
@@ -109,34 +109,34 @@ static VALUE rb_gsl_matrix_int_operation1(VALUE obj, VALUE other, int flag)
       Data_Get_Struct(other, gsl_matrix_int, b);
       switch (flag) {
       case GSL_MATRIX_INT_ADD:
-	/*result =*/ gsl_matrix_int_add(anew, b);
-	break;
+        /*result =*/ gsl_matrix_int_add(anew, b);
+        break;
       case GSL_MATRIX_INT_SUB:
-	/*result =*/ gsl_matrix_int_sub(anew, b);
-	break;
+        /*result =*/ gsl_matrix_int_sub(anew, b);
+        break;
       case GSL_MATRIX_INT_MUL:
-	/*result =*/ gsl_matrix_int_mul_elements(anew, b);
-	break;
+        /*result =*/ gsl_matrix_int_mul_elements(anew, b);
+        break;
       case GSL_MATRIX_INT_DIV:
-	/*result =*/ gsl_matrix_int_div_elements(anew, b);
-	break;
+        /*result =*/ gsl_matrix_int_div_elements(anew, b);
+        break;
       default:
-	break;
+        break;
       }
     } else if (VECTOR_INT_COL_P(other)) {
       switch (flag) {
       case GSL_MATRIX_INT_MUL:
-	Data_Get_Struct(other, gsl_vector_int, vi);
-	vinew = gsl_vector_int_alloc(vi->size);
-	gsl_matrix_int_mul_vector(vinew, a, vi);
-	return Data_Wrap_Struct(cgsl_vector_int_col, 0, gsl_vector_int_free, vinew);
-	break;
+        Data_Get_Struct(other, gsl_vector_int, vi);
+        vinew = gsl_vector_int_alloc(vi->size);
+        gsl_matrix_int_mul_vector(vinew, a, vi);
+        return Data_Wrap_Struct(cgsl_vector_int_col, 0, gsl_vector_int_free, vinew);
+        break;
       default:
-	rb_raise(rb_eRuntimeError, "Operation not defined");
+        rb_raise(rb_eRuntimeError, "Operation not defined");
       }
     } else {
       rb_raise(rb_eTypeError, "Operation not defined with %s",
-	       rb_class2name(CLASS_OF(other)));
+               rb_class2name(CLASS_OF(other)));
     }
     break;
   }
@@ -183,48 +183,47 @@ static VALUE rb_gsl_matrix_int_matrix_mul(VALUE obj, VALUE bb)
     switch (TYPE(bb)) {
     case T_FIXNUM:
       return rb_gsl_matrix_int_mul(obj, bb);
-	/*      return rb_gsl_matrix_int_power(obj, bb);*/
+      /*      return rb_gsl_matrix_int_power(obj, bb);*/
       break;
     default:
       rb_raise(rb_eTypeError, "wrong argument type %s (Matrix::Int, Vector::Int::Col or Fixnum expected)",
-	       rb_class2name(CLASS_OF(bb)));
+               rb_class2name(CLASS_OF(bb)));
       break;
     }
   }
 }
 
-int gsl_linalg_matmult_int(const gsl_matrix_int *A, 
-			   const gsl_matrix_int *B, gsl_matrix_int *C)
+int gsl_linalg_matmult_int(const gsl_matrix_int *A,
+                           const gsl_matrix_int *B, gsl_matrix_int *C)
 {
   if (A->size2 != B->size1 || A->size1 != C->size1 || B->size2 != C->size2)
-    {
-      GSL_ERROR ("matrix sizes are not conformant", GSL_EBADLEN);
-    }
+  {
+    GSL_ERROR ("matrix sizes are not conformant", GSL_EBADLEN);
+  }
   else
+  {
+    int a, b;
+    int temp;
+    size_t i, j, k;
+
+    for (i = 0; i < C->size1; i++)
     {
-      int a, b;
-      int temp;
-      size_t i, j, k;
-      
-      for (i = 0; i < C->size1; i++)
+      for (j = 0; j < C->size2; j++)
+      {
+        a = gsl_matrix_int_get(A, i, 0);
+        b = gsl_matrix_int_get(B, 0, j);
+        temp = a * b;
+        for (k = 1; k < A->size2; k++)
         {
-          for (j = 0; j < C->size2; j++)
-            {
-              a = gsl_matrix_int_get(A, i, 0);
-              b = gsl_matrix_int_get(B, 0, j);
-              temp = a * b;
-              for (k = 1; k < A->size2; k++)
-                {
-                  a = gsl_matrix_int_get(A, i, k);
-                  b = gsl_matrix_int_get(B, k, j);
-                  temp += a * b;
-                }
-              gsl_matrix_int_set(C, i, j, temp);
-            }
+          a = gsl_matrix_int_get(A, i, k);
+          b = gsl_matrix_int_get(B, k, j);
+          temp += a * b;
         }
-
-      return GSL_SUCCESS;
+        gsl_matrix_int_set(C, i, j, temp);
+      }
     }
+    return GSL_SUCCESS;
+  }
 }
 
 void Init_gsl_matrix_int_init(VALUE module);
diff --git a/ext/gsl/matrix_source.c b/ext/gsl_native/matrix_source.h
similarity index 84%
rename from ext/gsl/matrix_source.c
rename to ext/gsl_native/matrix_source.h
index b6acac0..d6f312b 100644
--- a/ext/gsl/matrix_source.c
+++ b/ext/gsl_native/matrix_source.h
@@ -52,14 +52,14 @@ void FUNCTION(get_range,beg_en_n)(VALUE range, BASE *beg, BASE *en, size_t *n, i
 
 // From ext/vector_source.c
 void get_range_beg_en_n_for_size(VALUE range,
-    int *beg, int *en, size_t *n, int *step, size_t size);
+                                 int *beg, int *en, size_t *n, int *step, size_t size);
 
 void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
-    size_t *i, size_t *j, size_t *n1, size_t *n2);
+                          size_t *i, size_t *j, size_t *n1, size_t *n2);
 
 #ifdef BASE_DOUBLE
 void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
-    size_t *i, size_t *j, size_t *n1, size_t *n2)
+                          size_t *i, size_t *j, size_t *n1, size_t *n2)
 {
   int ii, ij, in1, in2, end, step;
 
@@ -91,7 +91,7 @@ void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
   // Fixnum, nil -> single row, all cols (Vector::View)
   // Fixnum, Range -> single row, Range cols (Vector::View)
   // Fixnum, Fixnum -> single row, single col (Matrix::View)
-  case 2: 
+  case 2:
     // nil, ...
     if(NIL_P(argv[0])) {
       // Parse second arg
@@ -114,7 +114,7 @@ void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
         *i = 0; *j = (size_t)ij;
         *n1 = size1; *n2 = 0; // *n2 == 0 tells #submatrix to return Vector::Col::View
       }
-    // Range, ...
+      // Range, ...
     } else if(rb_obj_is_kind_of(argv[0], rb_cRange)) {
       get_range_beg_en_n_for_size(argv[0], &ii, &end, n1, &step, size1);
       if(step < 0 || *n1 <= 0) {
@@ -139,7 +139,7 @@ void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
         *j = (size_t) ij;
         *n2 = 0; // *n2 == 0 tells #submatrix to return Vector::Col::View
       }
-    // Fixnum, ...
+      // Fixnum, ...
     } else {
       ii = NUM2INT(argv[0]);
       if(ii < 0) ii += size1;
@@ -182,7 +182,7 @@ void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
       if(ij < 0) ij += size2;
       *j = (size_t) ij;
       *n2 = (size_t) in2;
-    // Range, Fixnum, Fixnum
+      // Range, Fixnum, Fixnum
     } else if(rb_obj_is_kind_of(argv[0], rb_cRange)) {
       // Range, Fixnum, Fixnum -> Range rows, some cols
       CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
@@ -196,11 +196,11 @@ void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
       *i = (size_t)ii;
       *j = (size_t) ij;
       *n2 = (size_t) in2;
-    // Fixnum, Fixnum, ...
+      // Fixnum, Fixnum, ...
     } else {
       CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]);
       ii = FIX2INT(argv[0]);
-      if(ii < 0) ii += size1; 
+      if(ii < 0) ii += size1;
       in1 = FIX2INT(argv[1]);
       *i = (size_t)ii;
       *n1 = (size_t)in1;
@@ -218,7 +218,7 @@ void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
         *j = (size_t)ij;
       } else {
         rb_raise(rb_eArgError, "expected third argument to be nil or Range, not %s",
-           rb_class2name(CLASS_OF(argv[2])));
+                 rb_class2name(CLASS_OF(argv[2])));
       }
     }
     break;
@@ -241,7 +241,7 @@ void parse_submatrix_args(int argc, VALUE *argv, size_t size1, size_t size2,
 }
 #endif
 
-VALUE FUNCTION(rb_gsl_matrix,do_something)(VALUE obj, void (*f)(GSL_TYPE(gsl_matrix) *))
+VALUE FUNCTION(rb_gsl_matrix,do_something)(VALUE obj, void (*f)(GSL_TYPE (gsl_matrix) *))
 {
   GSL_TYPE(gsl_matrix) *m = NULL;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
@@ -257,16 +257,13 @@ static VALUE FUNCTION(rb_gsl_matrix,alloc)(int argc, VALUE *argv, VALUE klass)
 {
   GSL_TYPE(gsl_matrix) *m = NULL;
   size_t n1, n2;
-#ifdef HAVE_NARRAY_H
-  size_t n;
-  VALUE ary;
-  struct NARRAY *na;
-#endif
-  if (argc < 1) rb_raise(rb_eArgError, 
-			 "wrong number of arguments (%d for >= 1)", argc);
-
+  if (argc < 1) rb_raise(rb_eArgError,
+                         "wrong number of arguments (%d for >= 1)", argc);
 #ifdef HAVE_NARRAY_H
   if (NA_IsNArray(argv[0])) {
+    size_t n;
+    VALUE ary;
+    struct NARRAY *na;
     GetNArray(argv[0], na);
     n = na->shape[0]*na->shape[1];
     m = FUNCTION(gsl_matrix,alloc)(na->shape[1], na->shape[0]);
@@ -282,8 +279,8 @@ static VALUE FUNCTION(rb_gsl_matrix,alloc)(int argc, VALUE *argv, VALUE klass)
 #endif
   switch (TYPE(argv[0])) {
   case T_FIXNUM:
-    if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", 
-			    argc);
+    if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
+                            argc);
     CHECK_FIXNUM(argv[1]);
     n1 = FIX2INT(argv[0]); n2 = FIX2INT(argv[1]);
     m = FUNCTION(gsl_matrix,calloc)(n1, n2);
@@ -300,38 +297,38 @@ static VALUE FUNCTION(rb_gsl_matrix,alloc)(int argc, VALUE *argv, VALUE klass)
       break;
     case T_FIXNUM:
       if (argc != 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
-			      argc);
+                              argc);
       CHECK_FIXNUM(argv[2]);
       m = FUNCTION(gsl_matrix,alloc_from_array_sizes)(argv[0], argv[1], argv[2]);
       break;
     default:
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s\nUsage: new(n1, n2), "
-	       "new([], [], [], ...), new([], n1, n2)", 
-	       rb_class2name(CLASS_OF(argv[1])));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s\nUsage: new(n1, n2), "
+               "new([], [], [], ...), new([], n1, n2)",
+               rb_class2name(CLASS_OF(argv[1])));
       break;
     }
     break;
   default:
     if (CLASS_OF(argv[0]) == rb_cRange) {
       if (argc==3 && TYPE(argv[1]) == T_FIXNUM && TYPE(argv[2]) == T_FIXNUM)
-	return FUNCTION(create_matrix,from_range_shape)(argv[0], argv[1], argv[2]);
+        return FUNCTION(create_matrix,from_range_shape)(argv[0], argv[1], argv[2]);
       else
-	return FUNCTION(create_matrix,from_ranges)(argc, argv);
+        return FUNCTION(create_matrix,from_ranges)(argc, argv);
     } else if (VEC_P(argv[0])) {
       if (argc == 3 && FIXNUM_P(argv[1]) && FIXNUM_P(argv[2])) {
-	m = FUNCTION(gsl_matrix,alloc_from_vector_sizes)(argv[0], argv[1], argv[2]);
+        m = FUNCTION(gsl_matrix,alloc_from_vector_sizes)(argv[0], argv[1], argv[2]);
       } else {
-	if (VEC_COL_P(argv[0])) {
-	  m = FUNCTION(gsl_matrix,alloc_from_colvectors)(argc, argv);
-	} else {
-	  m = FUNCTION(gsl_matrix,alloc_from_vectors)(argc, argv);
-	}
+        if (VEC_COL_P(argv[0])) {
+          m = FUNCTION(gsl_matrix,alloc_from_colvectors)(argc, argv);
+        } else {
+          m = FUNCTION(gsl_matrix,alloc_from_vectors)(argc, argv);
+        }
       }
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s\n"
-	       "Usage: new(n1, n2), new([], [], [], ...), new([], n1, n2)", 
-	       rb_class2name(CLASS_OF(argv[0])));
+               "Usage: new(n1, n2), new([], [], [], ...), new([], n1, n2)",
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   }
@@ -350,9 +347,9 @@ static GSL_TYPE(gsl_matrix)* FUNCTION(cr_matrix,from_ranges)(int argc, VALUE *ar
   m = FUNCTION(gsl_matrix,calloc)(argc, n);
   FUNCTION(set_ptr_data,by_range)(m->data, n, argv[0]);
   for (i = 1; (int) i < argc; i++) {
-    if (CLASS_OF(argv[i]) != rb_cRange) 
+    if (CLASS_OF(argv[i]) != rb_cRange)
       rb_raise(rb_eTypeError, "wrong argument type %s (Range expected)",
-	       rb_class2name(CLASS_OF(argv[i])));
+               rb_class2name(CLASS_OF(argv[i])));
     FUNCTION(set_ptr_data,by_range)(m->data+i*n, n, argv[i]);
   }
   return m;
@@ -430,7 +427,7 @@ GSL_TYPE(gsl_matrix)* FUNCTION(gsl_matrix,alloc_from_colvectors)(int argc, VALUE
   CHECK_VEC(argv[0]);
   Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
 //  m = FUNCTION(gsl_matrix,alloc)(argc, v->size);
-  m = FUNCTION(gsl_matrix,alloc)(v->size, argc);  
+  m = FUNCTION(gsl_matrix,alloc)(v->size, argc);
   if (m == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_alloc failed");
   for (i = 0; (int) i < argc; i++) {
     CHECK_VEC(argv[i]);
@@ -442,7 +439,7 @@ GSL_TYPE(gsl_matrix)* FUNCTION(gsl_matrix,alloc_from_colvectors)(int argc, VALUE
 
 /* create a matrix from two sizes and an array */
 GSL_TYPE(gsl_matrix)* FUNCTION(gsl_matrix,alloc_from_array_sizes)(VALUE ary,
-								  VALUE nn1, VALUE nn2)
+                                                                  VALUE nn1, VALUE nn2)
 {
   size_t n1, n2, len;
   GSL_TYPE(gsl_matrix) *m = NULL;
@@ -458,17 +455,16 @@ GSL_TYPE(gsl_matrix)* FUNCTION(gsl_matrix,alloc_from_array_sizes)(VALUE ary,
   for (i = 0; i < n1; i++) {
     for (j = 0; j < n2; j++, k++) {
       if (k >= len)
-	FUNCTION(gsl_matrix,set)(m, i, j, (BASE) 0);
+        FUNCTION(gsl_matrix,set)(m, i, j, (BASE) 0);
       else
-	FUNCTION(gsl_matrix,set)(m, i, j, (BASE) NUMCONV2(rb_ary_entry(ary, k)));
-      
+        FUNCTION(gsl_matrix,set)(m, i, j, (BASE) NUMCONV2(rb_ary_entry(ary, k)));
     }
   }
   return m;
 }
 
 GSL_TYPE(gsl_matrix)* FUNCTION(gsl_matrix,alloc_from_vector_sizes)(VALUE ary,
-								   VALUE nn1, VALUE nn2)
+                                                                   VALUE nn1, VALUE nn2)
 {
   size_t n1, n2;
   GSL_TYPE(gsl_matrix) *m = NULL;
@@ -483,10 +479,10 @@ GSL_TYPE(gsl_matrix)* FUNCTION(gsl_matrix,alloc_from_vector_sizes)(VALUE ary,
   k = 0;
   for (i = 0; i < n1; i++) {
     for (j = 0; j < n2; j++, k++) {
-      if (k >= v->size) 
-	FUNCTION(gsl_matrix,set)(m, i, j, (BASE) 0);
+      if (k >= v->size)
+        FUNCTION(gsl_matrix,set)(m, i, j, (BASE) 0);
       else
-	FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, k));
+        FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, k));
     }
   }
   return m;
@@ -515,7 +511,7 @@ static VALUE FUNCTION(rb_gsl_matrix,diagonal_singleton)(int argc, VALUE *argv, V
       len = FIX2INT(argv[0]);
       m = FUNCTION(gsl_matrix,alloc)(len, len);
       for (i = 0; i < len; i++)
-	FUNCTION(gsl_matrix,set)(m, i, i, 1);
+        FUNCTION(gsl_matrix,set)(m, i, i, 1);
       return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_matrix,free), m);
       break;
     default:
@@ -530,8 +526,8 @@ static VALUE FUNCTION(rb_gsl_matrix,diagonal_singleton)(int argc, VALUE *argv, V
       len = RARRAY_LEN(ary);
       m = FUNCTION(gsl_matrix,calloc)(len, len);
       for (i = 0; i < len; i++) {
-	tmp = rb_ary_entry(ary, i);
-	FUNCTION(gsl_matrix,set)(m, i, i, NUMCONV2(tmp));
+        tmp = rb_ary_entry(ary, i);
+        FUNCTION(gsl_matrix,set)(m, i, i, NUMCONV2(tmp));
       }
       break;
     default:
@@ -540,7 +536,7 @@ static VALUE FUNCTION(rb_gsl_matrix,diagonal_singleton)(int argc, VALUE *argv, V
       len = v->size;
       m = FUNCTION(gsl_matrix,calloc)(len, len);
       for (i = 0; i < len; i++) {
-	FUNCTION(gsl_matrix,set)(m, i, i, FUNCTION(gsl_vector,get)(v, i));
+        FUNCTION(gsl_matrix,set)(m, i, i, FUNCTION(gsl_vector,get)(v, i));
       }
       break;
     }
@@ -711,7 +707,6 @@ static VALUE FUNCTION(rb_gsl_matrix,get)(int argc, VALUE *argv, VALUE obj)
   } else {
     retval = FUNCTION(rb_gsl_matrix,submatrix)(argc, argv, obj);
   }
-
   return retval;
 }
 
@@ -729,7 +724,6 @@ static VALUE FUNCTION(rb_gsl_matrix,set)(int argc, VALUE *argv, VALUE obj)
   if(argc < 1 || argc > 5) {
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-5)", argc);
   }
-
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   other = argv[argc-1];
 
@@ -783,7 +777,7 @@ static VALUE FUNCTION(rb_gsl_matrix,set)(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(other, GSL_TYPE(gsl_matrix), mother);
       if(n1 * n2 != mother->size1 * mother->size2) {
         rb_raise(rb_eRangeError, "sizes do not match (%d x %d != %d x %d)",
-		 (int) n1, (int) n2, (int) mother->size1, (int) mother->size2);
+                 (int) n1, (int) n2, (int) mother->size1, (int) mother->size2);
       }
       // TODO Change to gsl_matrix_memmove if/when GSL has such a function
       // because gsl_matrix_memcpy does not handle overlapping regions (e.g.
@@ -801,7 +795,7 @@ static VALUE FUNCTION(rb_gsl_matrix,set)(int argc, VALUE *argv, VALUE obj)
         // m[...] = [[row0], [row1], ...] # multiple rows
         if((int) n1 != RARRAY_LEN(other)) {
           rb_raise(rb_eRangeError, "row counts do not match (%d != %d)",
-		   (int) n1, (int) RARRAY_LEN(other));
+                   (int) n1, (int) RARRAY_LEN(other));
         }
         for(k = 0; k < n1; k++) {
           vv = FUNCTION(gsl_matrix,row)(&mv.matrix, k);
@@ -824,7 +818,6 @@ static VALUE FUNCTION(rb_gsl_matrix,set)(int argc, VALUE *argv, VALUE obj)
       FUNCTION(gsl_matrix,set_all)(&mv.matrix, NUMCONV2(other));
     }
   }
-
   return obj;
 }
 
@@ -893,7 +886,7 @@ static VALUE FUNCTION(rb_gsl_matrix,to_s)(VALUE obj)
   strcpy(format2, format);
 #else
   strcpy(format, PRINTF_FORMAT);
-  strcpy(format2, " "PRINTF_FORMAT);
+  strcpy(format2, " " PRINTF_FORMAT);
 #endif
   str = rb_str_new2("[ ");
   for (i = 0; i < m->size1; i++) {
@@ -904,9 +897,9 @@ static VALUE FUNCTION(rb_gsl_matrix,to_s)(VALUE obj)
     for (j = 0; j < m->size2; j++) {
       x = FUNCTION(gsl_matrix,get)(m, i, j);
       if (x < 0)
-	sprintf(buf, format, x); 
+        sprintf(buf, format, x);
       else
-	sprintf(buf, format2, x); 
+        sprintf(buf, format2, x);
       rb_str_cat(str, buf, strlen(buf));
       if ((int) j >= (55/dig)) {
         strcpy(buf, "... ");
@@ -1015,11 +1008,11 @@ static VALUE FUNCTION(rb_gsl_matrix,set_diagonal)(VALUE obj, VALUE diag)
       Data_Get_Struct(diag, GSL_TYPE(gsl_vector), v);
       len = GSL_MIN_INT(m->size1, v->size);
       for (i = 0; i < len; i++) {
-	FUNCTION(gsl_matrix,set)(m, i, i, FUNCTION(gsl_vector,get)(v, i));
+        FUNCTION(gsl_matrix,set)(m, i, i, FUNCTION(gsl_vector,get)(v, i));
       }
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector or Array expected)",
-	       rb_class2name(CLASS_OF(diag)));
+               rb_class2name(CLASS_OF(diag)));
     }
     break;
   }
@@ -1268,7 +1261,7 @@ static VALUE FUNCTION(rb_gsl_matrix,minmax_index)(VALUE obj)
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   FUNCTION(gsl_matrix,minmax_index)(m, &imin, &jmin, &imax, &jmax);
   return rb_ary_new3(2, rb_ary_new3(2, INT2FIX(imin), INT2FIX(jmin)),
-		     rb_ary_new3(2, INT2FIX(imax), INT2FIX(jmax)));
+                     rb_ary_new3(2, INT2FIX(imax), INT2FIX(jmax)));
 }
 
 static VALUE FUNCTION(rb_gsl_matrix,fwrite)(VALUE obj, VALUE io)
@@ -1333,7 +1326,7 @@ VALUE FUNCTION(rb_gsl_matrix,power)(VALUE obj, VALUE bb)
   size_t i, b;
   CHECK_FIXNUM(bb);
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
-  b = FIX2INT(bb); 
+  b = FIX2INT(bb);
   mtmp = FUNCTION(gsl_matrix,alloc)(m->size1, m->size2);
   mnew = FUNCTION(gsl_matrix,alloc)(m->size1, m->size2);
   FUNCTION(gsl_matrix,memcpy)(mnew, m);
@@ -1374,8 +1367,8 @@ static VALUE FUNCTION(rb_gsl_matrix,submatrix)(int argc, VALUE *argv, VALUE obj)
 }
 
 static VALUE FUNCTION(rb_gsl_matrix,return_vector_view)(VALUE obj, VALUE index,
-					      QUALIFIED_VIEW(gsl_vector,view) (*f)(GSL_TYPE(gsl_matrix)*,
-								   size_t))
+                                                        QUALIFIED_VIEW(gsl_vector,view) (*f)(GSL_TYPE(gsl_matrix)*,
+                                                                                             size_t))
 {
   GSL_TYPE(gsl_matrix) *m = NULL;
   QUALIFIED_VIEW(gsl_vector,view) *vv = NULL;
@@ -1402,9 +1395,8 @@ static VALUE FUNCTION(rb_gsl_matrix,column)(VALUE obj, VALUE j)
   return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,col_view), 0, free, vv);
 }
 
-#ifdef GSL_1_10_LATER
 static VALUE FUNCTION(rb_gsl_matrix,subrow)(VALUE obj, VALUE i, VALUE offset,
-  VALUE n)
+                                            VALUE n)
 {
   GSL_TYPE(gsl_matrix) *m = NULL;
   QUALIFIED_VIEW(gsl_vector,view) *vv = NULL;
@@ -1414,7 +1406,7 @@ static VALUE FUNCTION(rb_gsl_matrix,subrow)(VALUE obj, VALUE i, VALUE offset,
   return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,view), 0, free, vv);
 }
 static VALUE FUNCTION(rb_gsl_matrix,subcolumn)(VALUE obj, VALUE j, VALUE offset,
-  VALUE n)
+                                               VALUE n)
 {
   GSL_TYPE(gsl_matrix) *m = NULL;
   QUALIFIED_VIEW(gsl_vector,view) *vv = NULL;
@@ -1423,7 +1415,6 @@ static VALUE FUNCTION(rb_gsl_matrix,subcolumn)(VALUE obj, VALUE j, VALUE offset,
   *vv = FUNCTION(gsl_matrix,subcolumn)(m, FIX2INT(j), FIX2INT(offset), FIX2INT(n));
   return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,col_view), 0, free, vv);
 }
-#endif
 
 static VALUE FUNCTION(rb_gsl_matrix,diagonal)(VALUE obj)
 {
@@ -1499,7 +1490,7 @@ static VALUE FUNCTION(rb_gsl_matrix,scale_bang)(VALUE obj, VALUE x)
 {
   GSL_TYPE(gsl_matrix) *m;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
-  FUNCTION(gsl_matrix,scale)(m, NUMCONV(x));
+  FUNCTION(gsl_matrix,scale)(m, NUMCONV2(x));
   return obj;
 }
 
@@ -1508,7 +1499,7 @@ static VALUE FUNCTION(rb_gsl_matrix,scale)(VALUE obj, VALUE b)
   GSL_TYPE(gsl_matrix) *m = NULL, *mnew;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   mnew = FUNCTION(make_matrix,clone)(m);
-  FUNCTION(gsl_matrix,scale)(mnew, NUMCONV(b));
+  FUNCTION(gsl_matrix,scale)(mnew, NUMCONV2(b));
   return Data_Wrap_Struct(GSL_TYPE(cgsl_matrix), 0, FUNCTION(gsl_matrix,free), mnew);
 }
 
@@ -1516,7 +1507,7 @@ static VALUE FUNCTION(rb_gsl_matrix,add_constant_bang)(VALUE obj, VALUE x)
 {
   GSL_TYPE(gsl_matrix) *m;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
-  FUNCTION(gsl_matrix,add_constant)(m, NUMCONV(x));
+  FUNCTION(gsl_matrix,add_constant)(m, NUMCONV2(x));
   return obj;
 }
 
@@ -1525,7 +1516,7 @@ static VALUE FUNCTION(rb_gsl_matrix,add_constant)(VALUE obj, VALUE b)
   GSL_TYPE(gsl_matrix) *m = NULL, *mnew;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   mnew = FUNCTION(make_matrix,clone)(m);
-  FUNCTION(gsl_matrix,add_constant)(mnew, NUMCONV(b));
+  FUNCTION(gsl_matrix,add_constant)(mnew, NUMCONV2(b));
   return Data_Wrap_Struct(GSL_TYPE(cgsl_matrix), 0, FUNCTION(gsl_matrix,free), mnew);
 }
 
@@ -1543,7 +1534,7 @@ static int FUNCTION(mygsl_matrix,equal)(GSL_TYPE(gsl_matrix) *a, GSL_TYPE(gsl_ma
   }
   return 1;
 }
- 
+
 #ifdef HAVE_TENSOR_TENSOR_H
 EXTERN VALUE cgsl_tensor, cgsl_tensor_int;
 VALUE rb_gsl_tensor_equal(int argc, VALUE *argv, VALUE obj);
@@ -1711,7 +1702,7 @@ static VALUE FUNCTION(rb_gsl_matrix,pascal1)(VALUE obj, VALUE n)
   for (i = 1; i < dim; i++) {
     FUNCTION(gsl_matrix,set)(m, i, 0, (BASE) 1);
     for (j = 1; j < dim; j++) {
-      x=FUNCTION(gsl_matrix,get)(m,i-1,j)+FUNCTION(gsl_matrix,get)(m,i,j-1);
+      x = FUNCTION(gsl_matrix,get)(m,i-1,j)+FUNCTION(gsl_matrix,get)(m,i,j-1);
       FUNCTION(gsl_matrix,set)(m, i, j, x);
     }
   }
@@ -1785,7 +1776,7 @@ static VALUE FUNCTION(rb_gsl_matrix,vandermonde)(VALUE obj, VALUE vv)
     Data_Get_Struct(vv, GSL_TYPE(gsl_vector), v);
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Array or Vector expected)",
-	     rb_class2name(CLASS_OF(vv)));
+             rb_class2name(CLASS_OF(vv)));
   }
   m = FUNCTION(gsl_matrix,alloc)(v->size, v->size);
   FUNCTION(mygsl_matrix,vandermonde)(m, v);
@@ -1798,10 +1789,10 @@ static void FUNCTION(mygsl_matrix,toeplitz)(GSL_TYPE(gsl_matrix) *m, GSL_TYPE(gs
   size_t i, j;
   for (i = 0; i < v->size; i++) {
     for (j = 0; j < v->size; j++) {
-      if (j >= i) 
-	FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, j-i));
+      if (j >= i)
+        FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, j-i));
       else
-	FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, i-j));
+        FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, i-j));
     }
   }
 }
@@ -1818,7 +1809,7 @@ static VALUE FUNCTION(rb_gsl_matrix,toeplitz)(VALUE obj, VALUE vv)
     Data_Get_Struct(vv, GSL_TYPE(gsl_vector), v);
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Array or Vector expected)",
-	     rb_class2name(CLASS_OF(vv)));
+             rb_class2name(CLASS_OF(vv)));
   }
   m = FUNCTION(gsl_matrix,alloc)(v->size, v->size);
   FUNCTION(mygsl_matrix,toeplitz)(m, v);
@@ -1839,7 +1830,7 @@ static VALUE FUNCTION(rb_gsl_matrix,circulant)(VALUE obj, VALUE vv)
     Data_Get_Struct(vv, GSL_TYPE(gsl_vector), v);
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Array or Vector expected)",
-	     rb_class2name(CLASS_OF(vv)));
+             rb_class2name(CLASS_OF(vv)));
   }
   m = FUNCTION(gsl_matrix,alloc)(v->size, v->size);
   FUNCTION(mygsl_vector,to_m_circulant)(m, v);
@@ -1848,7 +1839,7 @@ static VALUE FUNCTION(rb_gsl_matrix,circulant)(VALUE obj, VALUE vv)
 }
 
 static void FUNCTION(mygsl_matrix,indgen)(GSL_TYPE(gsl_matrix) *m,
-					  BASE start, BASE step)
+                                          BASE start, BASE step)
 {
   size_t i, j;
   BASE n;
@@ -1869,10 +1860,10 @@ static VALUE FUNCTION(rb_gsl_matrix,indgen_singleton)(int argc, VALUE *argv, VAL
   switch (argc) {
   case 4:
     step = NUMCONV2(argv[3]);
-    /* no break */
+  /* no break */
   case 3:
     start = NUMCONV2(argv[2]);
-    /* no break */
+  /* no break */
   case 2:
     n1 = NUM2INT(argv[0]);
     n2 = NUM2INT(argv[1]);
@@ -1893,7 +1884,7 @@ static VALUE FUNCTION(rb_gsl_matrix,indgen)(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 2:
     step = NUMCONV2(argv[1]);
-    /* no break */
+  /* no break */
   case 1:
     start = NUMCONV2(argv[0]);
     break;
@@ -1916,7 +1907,7 @@ static VALUE FUNCTION(rb_gsl_matrix,indgen_bang)(int argc, VALUE *argv, VALUE ob
   switch (argc) {
   case 2:
     step = NUMCONV2(argv[1]);
-    /* no break */
+  /* no break */
   case 1:
     start = NUMCONV2(argv[0]);
     break;
@@ -1938,10 +1929,10 @@ static VALUE FUNCTION(rb_gsl_matrix,to_a)(VALUE obj)
   size_t i, j;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   ma = rb_ary_new2(m->size1);
-  for(i=0; i < m->size1; i++) {
+  for(i = 0; i < m->size1; i++) {
     ra = rb_ary_new2(m->size2);
     rb_ary_store(ma, i, ra);
-    for(j=0; j < m->size2; j++) {
+    for(j = 0; j < m->size2; j++) {
       rb_ary_store(ra, j, C_TO_VALUE(FUNCTION(gsl_matrix,get)(m, i, j)));
     }
   }
@@ -1961,7 +1952,6 @@ static VALUE FUNCTION(rb_gsl_matrix,to_v)(VALUE obj)
       FUNCTION(gsl_vector,set)(v, k, FUNCTION(gsl_matrix,get)(m, i, j));
     }
   }
-
   if(m->size1 > 1 && m->size2 == 1) {
     return Data_Wrap_Struct(CONCAT2(GSL_TYPE(cgsl_vector),col), 0, FUNCTION(gsl_vector,free), v);
   } else {
@@ -1994,7 +1984,7 @@ static VALUE FUNCTION(rb_gsl_matrix,norm)(VALUE obj)
 }
 
 static int FUNCTION(mygsl_matrix,reverse_columns)(GSL_TYPE(gsl_matrix) *dst,
-						   GSL_TYPE(gsl_matrix) *src)
+                                                  GSL_TYPE(gsl_matrix) *src)
 {
   size_t j;
   QUALIFIED_VIEW(gsl_vector,view) col;
@@ -2008,7 +1998,7 @@ static int FUNCTION(mygsl_matrix,reverse_columns)(GSL_TYPE(gsl_matrix) *dst,
 }
 
 static int FUNCTION(mygsl_matrix,reverse_rows)(GSL_TYPE(gsl_matrix) *dst,
-						   GSL_TYPE(gsl_matrix) *src)
+                                               GSL_TYPE(gsl_matrix) *src)
 {
   size_t i;
   QUALIFIED_VIEW(gsl_vector,view) row;
@@ -2112,14 +2102,14 @@ static VALUE FUNCTION(rb_gsl_matrix,all)(VALUE obj)
     vv = FUNCTION(gsl_matrix,column)(m, j);
     v = &vv.vector;
     /*    if (FUNCTION(gsl_vector,isnull(v))) gsl_vector_int_set(vnew, j, 0);
-	  else gsl_vector_int_set(vnew, j, 1);*/
+    else gsl_vector_int_set(vnew, j, 1);*/
     for (i = 0; i < v->size; i++) {
       if (FUNCTION(gsl_vector,get)(v, i) == (BASE) 0) {
-	gsl_vector_int_set(vnew, j, 0);
-	flag = 0;
-	break;
+        gsl_vector_int_set(vnew, j, 0);
+        flag = 0;
+        break;
       } else {
-	flag = 1;
+        flag = 1;
       }
     }
     if (flag == 1) gsl_vector_int_set(vnew, j, 1);
@@ -2181,7 +2171,7 @@ static VALUE FUNCTION(rb_gsl_matrix,rot90)(int argc, VALUE *argv, VALUE obj)
 }
 
 void FUNCTION(mygsl_vector,diff)(GSL_TYPE(gsl_vector) *vdst,
-				 GSL_TYPE(gsl_vector) *vsrc, size_t n);
+                                 GSL_TYPE(gsl_vector) *vsrc, size_t n);
 
 static VALUE FUNCTION(rb_gsl_matrix,diff)(int argc, VALUE *argv, VALUE obj)
 {
@@ -2254,7 +2244,6 @@ static VALUE FUNCTION(rb_gsl_matrix,sgn)(VALUE obj)
       FUNCTION(gsl_matrix,set)(mnew, i, j, (BASE)(x>0 ? 1 : (x<0 ? -1 : 0)));
     }
   }
-
   return Data_Wrap_Struct(GSL_TYPE(cgsl_matrix), 0, FUNCTION(gsl_matrix,free), mnew);
 }
 
@@ -2269,7 +2258,6 @@ static VALUE FUNCTION(rb_gsl_matrix,abs)(VALUE obj)
       FUNCTION(gsl_matrix,set)(mnew, i, j, (BASE) fabs(FUNCTION(gsl_matrix,get)(m, i, j)));
     }
   }
-
   return Data_Wrap_Struct(GSL_TYPE(cgsl_matrix), 0, FUNCTION(gsl_matrix,free), mnew);
 }
 
@@ -2281,9 +2269,9 @@ static VALUE FUNCTION(rb_gsl_matrix,horzcat)(VALUE obj, VALUE mm2)
   CHECK_MAT(mm2);
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   Data_Get_Struct(mm2, GSL_TYPE(gsl_matrix), m2);
-  if (m->size1 != m2->size1) 
+  if (m->size1 != m2->size1)
     rb_raise(rb_eRuntimeError, "Different number of rows (%d and %d).",
-	     (int) m->size1, (int) m2->size1);
+             (int) m->size1, (int) m2->size1);
   mnew = FUNCTION(gsl_matrix,alloc)(m->size1, m->size2 + m2->size2);
   for (j = 0, k = 0; j < m->size2; j++, k++) {
     v = FUNCTION(gsl_matrix,column)(m, j);
@@ -2311,9 +2299,9 @@ static VALUE FUNCTION(rb_gsl_matrix,vertcat)(VALUE obj, VALUE mm2)
   CHECK_MAT(mm2);
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   Data_Get_Struct(mm2, GSL_TYPE(gsl_matrix), m2);
-  if (m->size2 != m2->size2) 
+  if (m->size2 != m2->size2)
     rb_raise(rb_eRuntimeError, "Different number of columns (%d and %d).",
-	     (int) m->size2, (int) m2->size2);
+             (int) m->size2, (int) m2->size2);
   mnew = FUNCTION(gsl_matrix,alloc)(m->size1 + m2->size1, m->size2);
   for (i = 0, k = 0; i < m->size1; i++, k++) {
     v = FUNCTION(gsl_matrix,row)(m, i);
@@ -2332,17 +2320,16 @@ static VALUE FUNCTION(rb_gsl_matrix,vertcat_singleton)(VALUE klass, VALUE mm, VA
   return FUNCTION(rb_gsl_matrix,vertcat)(mm, mm2);
 }
 
-#ifdef GSL_1_9_LATER
 static VALUE FUNCTION(rb_gsl_matrix,property)(VALUE obj,
-  int (*f)(const GSL_TYPE(gsl_matrix)*)) {
+                                              int (*f)(const GSL_TYPE (gsl_matrix)*)) {
   GSL_TYPE(gsl_matrix) *m;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
-  return INT2FIX((*f)(m));  
+  return INT2FIX((*f)(m));
 }
 
 static VALUE FUNCTION(rb_gsl_matrix,property2)(VALUE obj,
-  int (*f)(const GSL_TYPE(gsl_matrix) *)) {
-  GSL_TYPE(gsl_matrix) *m;  
+                                               int (*f)(const GSL_TYPE (gsl_matrix) *)) {
+  GSL_TYPE(gsl_matrix) *m;
   Data_Get_Struct(obj, GSL_TYPE(gsl_matrix), m);
   if ((*f)(m)) return Qtrue;
   else return Qfalse;
@@ -2353,28 +2340,25 @@ static VALUE FUNCTION(rb_gsl_matrix,ispos)(VALUE obj)
 }
 static VALUE FUNCTION(rb_gsl_matrix,ispos2)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_matrix,property2)(obj, FUNCTION(gsl_matrix,ispos));  
+  return FUNCTION(rb_gsl_matrix,property2)(obj, FUNCTION(gsl_matrix,ispos));
 }
 static VALUE FUNCTION(rb_gsl_matrix,isneg)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_matrix,property)(obj, FUNCTION(gsl_matrix,isneg));  
+  return FUNCTION(rb_gsl_matrix,property)(obj, FUNCTION(gsl_matrix,isneg));
 }
 static VALUE FUNCTION(rb_gsl_matrix,isneg2)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_matrix,property2)(obj, FUNCTION(gsl_matrix,isneg));  
+  return FUNCTION(rb_gsl_matrix,property2)(obj, FUNCTION(gsl_matrix,isneg));
 }
-#endif
 
-#ifdef GSL_1_10_LATER
 static VALUE FUNCTION(rb_gsl_matrix,isnonneg)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_matrix,property)(obj, FUNCTION(gsl_matrix,isnonneg));  
+  return FUNCTION(rb_gsl_matrix,property)(obj, FUNCTION(gsl_matrix,isnonneg));
 }
 static VALUE FUNCTION(rb_gsl_matrix,isnonneg2)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_matrix,property2)(obj, FUNCTION(gsl_matrix,isnonneg));  
+  return FUNCTION(rb_gsl_matrix,property2)(obj, FUNCTION(gsl_matrix,isnonneg));
 }
-#endif
 
 static VALUE FUNCTION(rb_gsl_matrix,symmetrize)(VALUE obj)
 {
@@ -2419,26 +2403,26 @@ void FUNCTION(Init_gsl_matrix,init)(VALUE module)
   rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "eye", FUNCTION(rb_gsl_matrix,eye), -1);
   rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "ones", FUNCTION(rb_gsl_matrix,ones), -1);
   rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "zeros", FUNCTION(rb_gsl_matrix,zeros), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "diagonal", 
-			     FUNCTION(rb_gsl_matrix,diagonal_singleton), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "diag", 
-			     FUNCTION(rb_gsl_matrix,diagonal_singleton), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "identity", 
-			     FUNCTION(rb_gsl_matrix,identity), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "scalar", 
-			     FUNCTION(rb_gsl_matrix,identity), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "unit", 
-			     FUNCTION(rb_gsl_matrix,identity), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "I", 
-			     FUNCTION(rb_gsl_matrix,identity), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "diagonal",
+                             FUNCTION(rb_gsl_matrix,diagonal_singleton), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "diag",
+                             FUNCTION(rb_gsl_matrix,diagonal_singleton), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "identity",
+                             FUNCTION(rb_gsl_matrix,identity), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "scalar",
+                             FUNCTION(rb_gsl_matrix,identity), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "unit",
+                             FUNCTION(rb_gsl_matrix,identity), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "I",
+                             FUNCTION(rb_gsl_matrix,identity), 1);
 
   /*****/
-  rb_define_method(GSL_TYPE(cgsl_matrix), "size1", 
-		   FUNCTION(rb_gsl_matrix,size1), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "size2", 
-		   FUNCTION(rb_gsl_matrix,size2), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "shape", 
-		   FUNCTION(rb_gsl_matrix,shape), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "size1",
+                   FUNCTION(rb_gsl_matrix,size1), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "size2",
+                   FUNCTION(rb_gsl_matrix,size2), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "shape",
+                   FUNCTION(rb_gsl_matrix,shape), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "size", "shape");
 
   rb_define_method(GSL_TYPE(cgsl_matrix), "get", FUNCTION(rb_gsl_matrix,get), -1);
@@ -2446,238 +2430,236 @@ void FUNCTION(Init_gsl_matrix,init)(VALUE module)
   rb_define_method(GSL_TYPE(cgsl_matrix), "set", FUNCTION(rb_gsl_matrix,set), -1);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "[]=", "set");
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "set_all", 
-		   FUNCTION(rb_gsl_matrix,set_all), 1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "set_zero",  
-		   FUNCTION(rb_gsl_matrix,set_zero), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "set_identity",  
-		   FUNCTION(rb_gsl_matrix,set_identity), 0);
-
-  rb_define_method(GSL_TYPE(cgsl_matrix), "print", 
-		   FUNCTION(rb_gsl_matrix,print), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "inspect",  
-		   FUNCTION(rb_gsl_matrix,inspect), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "to_s", 
-		   FUNCTION(rb_gsl_matrix,to_s), 0);
-  
-  rb_define_method(GSL_TYPE(cgsl_matrix), "set_diagonal", 
-		   FUNCTION(rb_gsl_matrix,set_diagonal), 1);
-  
-  rb_define_method(GSL_TYPE(cgsl_matrix), "get_row", 
-		   FUNCTION(rb_gsl_matrix,get_row), 1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "get_column", 
-		   FUNCTION(rb_gsl_matrix,get_col), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "set_all",
+                   FUNCTION(rb_gsl_matrix,set_all), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "set_zero",
+                   FUNCTION(rb_gsl_matrix,set_zero), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "set_identity",
+                   FUNCTION(rb_gsl_matrix,set_identity), 0);
+
+  rb_define_method(GSL_TYPE(cgsl_matrix), "print",
+                   FUNCTION(rb_gsl_matrix,print), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "inspect",
+                   FUNCTION(rb_gsl_matrix,inspect), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "to_s",
+                   FUNCTION(rb_gsl_matrix,to_s), 0);
+
+  rb_define_method(GSL_TYPE(cgsl_matrix), "set_diagonal",
+                   FUNCTION(rb_gsl_matrix,set_diagonal), 1);
+
+  rb_define_method(GSL_TYPE(cgsl_matrix), "get_row",
+                   FUNCTION(rb_gsl_matrix,get_row), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "get_column",
+                   FUNCTION(rb_gsl_matrix,get_col), 1);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "get_col", "get_column");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "set_column", 
-		   FUNCTION(rb_gsl_matrix,set_col), 2);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "set_column",
+                   FUNCTION(rb_gsl_matrix,set_col), 2);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "set_col", "set_column");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "set_row", 
-		   FUNCTION(rb_gsl_matrix,set_row), 2);
-  
-  rb_define_method(GSL_TYPE(cgsl_matrix), "clone", 
-		   FUNCTION(rb_gsl_matrix,clone), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "set_row",
+                   FUNCTION(rb_gsl_matrix,set_row), 2);
+
+  rb_define_method(GSL_TYPE(cgsl_matrix), "clone",
+                   FUNCTION(rb_gsl_matrix,clone), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "duplicate", "clone");
   rb_define_alias(GSL_TYPE(cgsl_matrix), "dup", "clone");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "isnull", 
-		   FUNCTION(rb_gsl_matrix,isnull), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "isnull?", 
-		   FUNCTION(rb_gsl_matrix,isnull2), 0);
-  
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "memcpy", 
-			     FUNCTION(rb_gsl_matrix,memcpy), 2);
-  
-  rb_define_method(GSL_TYPE(cgsl_matrix), "swap_rows", 
-		   FUNCTION(rb_gsl_matrix,swap_rows), 2);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "isnull",
+                   FUNCTION(rb_gsl_matrix,isnull), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "isnull?",
+                   FUNCTION(rb_gsl_matrix,isnull2), 0);
+
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "memcpy",
+                             FUNCTION(rb_gsl_matrix,memcpy), 2);
+
+  rb_define_method(GSL_TYPE(cgsl_matrix), "swap_rows",
+                   FUNCTION(rb_gsl_matrix,swap_rows), 2);
   rb_define_method(GSL_TYPE(cgsl_matrix), "swap_rows!",
-		   FUNCTION(rb_gsl_matrix,swap_rows_bang), 2);
+                   FUNCTION(rb_gsl_matrix,swap_rows_bang), 2);
   rb_define_method(GSL_TYPE(cgsl_matrix), "swap_columns",
-		   FUNCTION(rb_gsl_matrix,swap_columns), 2);
+                   FUNCTION(rb_gsl_matrix,swap_columns), 2);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "swap_cols", "swap_columns");
   rb_define_method(GSL_TYPE(cgsl_matrix), "swap_columns!",
-		   FUNCTION(rb_gsl_matrix,swap_columns_bang), 2);
+                   FUNCTION(rb_gsl_matrix,swap_columns_bang), 2);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "swap_cols!", "swap_columns!");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "swap_rowcol", 
-		   FUNCTION(rb_gsl_matrix,swap_rowcol), 2);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "swap_rowcol!", 
-		   FUNCTION(rb_gsl_matrix,swap_rowcol_bang), 2);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "swap_rowcol",
+                   FUNCTION(rb_gsl_matrix,swap_rowcol), 2);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "swap_rowcol!",
+                   FUNCTION(rb_gsl_matrix,swap_rowcol_bang), 2);
   rb_define_method(GSL_TYPE(cgsl_matrix), "transpose_memcpy",
-		   FUNCTION(rb_gsl_matrix,transpose_memcpy), 0);
+                   FUNCTION(rb_gsl_matrix,transpose_memcpy), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "transpose", "transpose_memcpy");
   rb_define_alias(GSL_TYPE(cgsl_matrix), "trans", "transpose_memcpy");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "transpose!", 
-		   FUNCTION(rb_gsl_matrix,transpose_bang), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "transpose!",
+                   FUNCTION(rb_gsl_matrix,transpose_bang), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "trans!", "transpose!");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_columns", 
-		   FUNCTION(rb_gsl_matrix,reverse_columns), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_columns",
+                   FUNCTION(rb_gsl_matrix,reverse_columns), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "fliplr", "reverse_columns");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_columns!", 
-		   FUNCTION(rb_gsl_matrix,reverse_columns_bang), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_rows", 
-		   FUNCTION(rb_gsl_matrix,reverse_rows), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_columns!",
+                   FUNCTION(rb_gsl_matrix,reverse_columns_bang), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_rows",
+                   FUNCTION(rb_gsl_matrix,reverse_rows), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "flipud", "reverse_rows");
-  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_rows!", 
-		   FUNCTION(rb_gsl_matrix,reverse_rows_bang), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "reverse_rows!",
+                   FUNCTION(rb_gsl_matrix,reverse_rows_bang), 0);
   /*****/
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "swap", 
-			     FUNCTION(rb_gsl_matrix,swap), 2);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "swap",
+                             FUNCTION(rb_gsl_matrix,swap), 2);
 
   rb_define_method(GSL_TYPE(cgsl_matrix), "max", FUNCTION(rb_gsl_matrix,max), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "min", FUNCTION(rb_gsl_matrix,min), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "minmax",
-		   FUNCTION(rb_gsl_matrix,minmax), 0);
+                   FUNCTION(rb_gsl_matrix,minmax), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "max_index",
-		   FUNCTION(rb_gsl_matrix,max_index), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "min_index", 
-		   FUNCTION(rb_gsl_matrix,min_index), 0);
+                   FUNCTION(rb_gsl_matrix,max_index), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "min_index",
+                   FUNCTION(rb_gsl_matrix,min_index), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "minmax_index",
-		   FUNCTION(rb_gsl_matrix,minmax_index), 0);
+                   FUNCTION(rb_gsl_matrix,minmax_index), 0);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "fwrite", 
-		   FUNCTION(rb_gsl_matrix,fwrite), 1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "fread", 
-		   FUNCTION(rb_gsl_matrix,fread), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "fwrite",
+                   FUNCTION(rb_gsl_matrix,fwrite), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "fread",
+                   FUNCTION(rb_gsl_matrix,fread), 1);
   rb_define_method(GSL_TYPE(cgsl_matrix), "fprintf",
-		   FUNCTION(rb_gsl_matrix,fprintf), -1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "printf", 
-		   FUNCTION(rb_gsl_matrix,printf), -1);
+                   FUNCTION(rb_gsl_matrix,fprintf), -1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "printf",
+                   FUNCTION(rb_gsl_matrix,printf), -1);
   rb_define_method(GSL_TYPE(cgsl_matrix), "fscanf",
-		   FUNCTION(rb_gsl_matrix,fscanf), 1);
+                   FUNCTION(rb_gsl_matrix,fscanf), 1);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "trace", 
-		   FUNCTION(rb_gsl_matrix,trace), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "trace",
+                   FUNCTION(rb_gsl_matrix,trace), 0);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "-@",  
-		   FUNCTION(rb_gsl_matrix,uminus), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "+@",  
-		   FUNCTION(rb_gsl_matrix,uplus), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "-@",
+                   FUNCTION(rb_gsl_matrix,uminus), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "+@",
+                   FUNCTION(rb_gsl_matrix,uplus), 0);
 
 
 /*****/
-  rb_define_method(GSL_TYPE(cgsl_matrix), "submatrix", 
-		   FUNCTION(rb_gsl_matrix,submatrix), -1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "submatrix",
+                   FUNCTION(rb_gsl_matrix,submatrix), -1);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "view", "submatrix");
 
   rb_define_method(GSL_TYPE(cgsl_matrix), "row", FUNCTION(rb_gsl_matrix,row), 1);
   /*  rb_define_alias(GSL_TYPE(cgsl_matrix), "[]", "row");*/
-  rb_define_method(GSL_TYPE(cgsl_matrix), "column", 
-		   FUNCTION(rb_gsl_matrix,column), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "column",
+                   FUNCTION(rb_gsl_matrix,column), 1);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "col", "column");
 
-#ifdef GSL_1_10_LATER
- rb_define_method(GSL_TYPE(cgsl_matrix), "subrow", 
-		   FUNCTION(rb_gsl_matrix,subrow), 3);
- rb_define_method(GSL_TYPE(cgsl_matrix), "subcolumn", 
-		   FUNCTION(rb_gsl_matrix,subcolumn), 3);
-  rb_define_alias(GSL_TYPE(cgsl_matrix), "subcol", "subcolumn");		   
-#endif
+  rb_define_method(GSL_TYPE(cgsl_matrix), "subrow",
+                   FUNCTION(rb_gsl_matrix,subrow), 3);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "subcolumn",
+                   FUNCTION(rb_gsl_matrix,subcolumn), 3);
+  rb_define_alias(GSL_TYPE(cgsl_matrix), "subcol", "subcolumn");
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "diagonal", 
-		   FUNCTION(rb_gsl_matrix,diagonal), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "diagonal",
+                   FUNCTION(rb_gsl_matrix,diagonal), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "diag", "diagonal");
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "subdiagonal", 
-		   FUNCTION(rb_gsl_matrix,subdiagonal), 1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "superdiagonal", 
-		   FUNCTION(rb_gsl_matrix,superdiagonal), 1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "vector_view", 
-		   FUNCTION(rb_gsl_matrix,vector_view), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "subdiagonal",
+                   FUNCTION(rb_gsl_matrix,subdiagonal), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "superdiagonal",
+                   FUNCTION(rb_gsl_matrix,superdiagonal), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "vector_view",
+                   FUNCTION(rb_gsl_matrix,vector_view), 0);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "each_row", 
-		   FUNCTION(rb_gsl_matrix,each_row), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "each_row",
+                   FUNCTION(rb_gsl_matrix,each_row), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "each_col",
-		   FUNCTION(rb_gsl_matrix,each_col), 0);
+                   FUNCTION(rb_gsl_matrix,each_col), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "each_column", "each_col");
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "scale", 
-		   FUNCTION(rb_gsl_matrix,scale), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "scale",
+                   FUNCTION(rb_gsl_matrix,scale), 1);
   rb_define_method(GSL_TYPE(cgsl_matrix), "scale!",
-		   FUNCTION(rb_gsl_matrix,scale_bang), 1);
+                   FUNCTION(rb_gsl_matrix,scale_bang), 1);
   rb_define_method(GSL_TYPE(cgsl_matrix), "add_constant",
-		   FUNCTION(rb_gsl_matrix,add_constant), 1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "add_constant!", 
-		   FUNCTION(rb_gsl_matrix,add_constant_bang), 1);
+                   FUNCTION(rb_gsl_matrix,add_constant), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "add_constant!",
+                   FUNCTION(rb_gsl_matrix,add_constant_bang), 1);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "equal?", 
-		   FUNCTION(rb_gsl_matrix,equal), -1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "equal?",
+                   FUNCTION(rb_gsl_matrix,equal), -1);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "==", "equal?");
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "equal?", 
-			     FUNCTION(rb_gsl_matrix,equal_singleton), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "equal?",
+                             FUNCTION(rb_gsl_matrix,equal_singleton), -1);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "power", 
-		   FUNCTION(rb_gsl_matrix,power), 1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "power",
+                   FUNCTION(rb_gsl_matrix,power), 1);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "**", "power");
   rb_define_alias(GSL_TYPE(cgsl_matrix), "^", "power");
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "collect", 
-		   FUNCTION(rb_gsl_matrix,collect), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "collect!", 
-		   FUNCTION(rb_gsl_matrix,collect_bang), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "collect",
+                   FUNCTION(rb_gsl_matrix,collect), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "collect!",
+                   FUNCTION(rb_gsl_matrix,collect_bang), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "map", "collect");
   rb_define_alias(GSL_TYPE(cgsl_matrix), "map!", "collect!");
 #ifdef HAVE_TENSOR_TENSOR_H
-  rb_define_method(GSL_TYPE(cgsl_matrix), "to_tensor", 
-		   FUNCTION(rb_gsl_matrix,to_tensor), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "to_tensor",
+                   FUNCTION(rb_gsl_matrix,to_tensor), 0);
 #endif
 
   /*****/
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "to_a", 
-		   FUNCTION(rb_gsl_matrix,to_a), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "to_v", 
-		   FUNCTION(rb_gsl_matrix,to_v), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "to_vview", 
-		   FUNCTION(rb_gsl_matrix,to_vview), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "to_a",
+                   FUNCTION(rb_gsl_matrix,to_a), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "to_v",
+                   FUNCTION(rb_gsl_matrix,to_v), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "to_vview",
+                   FUNCTION(rb_gsl_matrix,to_vview), 0);
   rb_define_alias(GSL_TYPE(cgsl_matrix), "data", "to_vview");
   rb_define_method(GSL_TYPE(cgsl_matrix), "norm",
-		   FUNCTION(rb_gsl_matrix,norm), 0);
+                   FUNCTION(rb_gsl_matrix,norm), 0);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "upper", 
-		   FUNCTION(rb_gsl_matrix,upper), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "lower", 
-		   FUNCTION(rb_gsl_matrix,lower), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "block", 
-		   FUNCTION(rb_gsl_matrix,block), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "upper",
+                   FUNCTION(rb_gsl_matrix,upper), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "lower",
+                   FUNCTION(rb_gsl_matrix,lower), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "block",
+                   FUNCTION(rb_gsl_matrix,block), 0);
 
   /***** Special matrices *****/
   rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "pascal",
-			     FUNCTION(rb_gsl_matrix,pascal1), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "vandermonde", 
-			     FUNCTION(rb_gsl_matrix,vandermonde), 1);
+                             FUNCTION(rb_gsl_matrix,pascal1), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "vandermonde",
+                             FUNCTION(rb_gsl_matrix,vandermonde), 1);
   rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "vander",
-			     FUNCTION(rb_gsl_matrix,vandermonde), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "toeplitz", 
-			     FUNCTION(rb_gsl_matrix,toeplitz), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "circulant", 
-			     FUNCTION(rb_gsl_matrix,circulant), 1);
+                             FUNCTION(rb_gsl_matrix,vandermonde), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "toeplitz",
+                             FUNCTION(rb_gsl_matrix,toeplitz), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "circulant",
+                             FUNCTION(rb_gsl_matrix,circulant), 1);
   rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "indgen",
-			     FUNCTION(rb_gsl_matrix,indgen_singleton), -1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "indgen", 
-		   FUNCTION(rb_gsl_matrix,indgen), -1);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "indgen!", 
-		   FUNCTION(rb_gsl_matrix,indgen_bang), -1);
-
-  rb_define_method(GSL_TYPE(cgsl_matrix), "info", 
-		   FUNCTION(rb_gsl_matrix,info), 0);
+                             FUNCTION(rb_gsl_matrix,indgen_singleton), -1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "indgen",
+                   FUNCTION(rb_gsl_matrix,indgen), -1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "indgen!",
+                   FUNCTION(rb_gsl_matrix,indgen_bang), -1);
+
+  rb_define_method(GSL_TYPE(cgsl_matrix), "info",
+                   FUNCTION(rb_gsl_matrix,info), 0);
 #ifdef BASE_DOUBLE
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "hilbert", 
-			     FUNCTION(rb_gsl_matrix,hilbert), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "hilb", 
-			     FUNCTION(rb_gsl_matrix,hilbert), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "invhilbert", 
-			     FUNCTION(rb_gsl_matrix,invhilbert), 1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "invhilb", 
-			     FUNCTION(rb_gsl_matrix,invhilbert), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "hilbert",
+                             FUNCTION(rb_gsl_matrix,hilbert), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "hilb",
+                             FUNCTION(rb_gsl_matrix,hilbert), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "invhilbert",
+                             FUNCTION(rb_gsl_matrix,invhilbert), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "invhilb",
+                             FUNCTION(rb_gsl_matrix,invhilbert), 1);
 #endif
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "any", 
-		   FUNCTION(rb_gsl_matrix,any), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "all", 
-		   FUNCTION(rb_gsl_matrix,all), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "rot90", 
-		   FUNCTION(rb_gsl_matrix,rot90), -1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "any",
+                   FUNCTION(rb_gsl_matrix,any), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "all",
+                   FUNCTION(rb_gsl_matrix,all), 0);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "rot90",
+                   FUNCTION(rb_gsl_matrix,rot90), -1);
 
-  rb_define_method(GSL_TYPE(cgsl_matrix), "diff", 
-		   FUNCTION(rb_gsl_matrix,diff), -1);
+  rb_define_method(GSL_TYPE(cgsl_matrix), "diff",
+                   FUNCTION(rb_gsl_matrix,diff), -1);
   rb_define_method(GSL_TYPE(cgsl_matrix), "isnan", FUNCTION(rb_gsl_matrix,isnan), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "isinf", FUNCTION(rb_gsl_matrix,isinf), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "finite", FUNCTION(rb_gsl_matrix,finite), 0);
@@ -2694,17 +2676,13 @@ void FUNCTION(Init_gsl_matrix,init)(VALUE module)
   rb_define_method(GSL_TYPE(cgsl_matrix), "vertcat", FUNCTION(rb_gsl_matrix,vertcat), 1);
   rb_define_singleton_method(GSL_TYPE(cgsl_matrix), "vertcat", FUNCTION(rb_gsl_matrix,vertcat_singleton), 2);
 
-#ifdef GSL_1_9_LATER
   rb_define_method(GSL_TYPE(cgsl_matrix), "ispos", FUNCTION(rb_gsl_matrix,ispos), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "ispos?", FUNCTION(rb_gsl_matrix,ispos2), 0); 
+  rb_define_method(GSL_TYPE(cgsl_matrix), "ispos?", FUNCTION(rb_gsl_matrix,ispos2), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "isneg", FUNCTION(rb_gsl_matrix,isneg), 0);
-  rb_define_method(GSL_TYPE(cgsl_matrix), "isneg?", FUNCTION(rb_gsl_matrix,isneg2), 0);    
-#endif
+  rb_define_method(GSL_TYPE(cgsl_matrix), "isneg?", FUNCTION(rb_gsl_matrix,isneg2), 0);
 
-#ifdef GSL_1_10_LATER
   rb_define_method(GSL_TYPE(cgsl_matrix), "isnonneg", FUNCTION(rb_gsl_matrix,isnonneg), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "isnonneg?", FUNCTION(rb_gsl_matrix,isnonneg2), 0);
-#endif
 
   rb_define_method(GSL_TYPE(cgsl_matrix), "symmetrize", FUNCTION(rb_gsl_matrix,symmetrize), 0);
   rb_define_method(GSL_TYPE(cgsl_matrix), "symmetrize!", FUNCTION(rb_gsl_matrix,symmetrize_bang), 0);
diff --git a/ext/gsl/min.c b/ext/gsl_native/min.c
similarity index 72%
rename from ext/gsl/min.c
rename to ext/gsl_native/min.c
index ae26380..485a017 100644
--- a/ext/gsl/min.c
+++ b/ext/gsl_native/min.c
@@ -13,56 +13,50 @@
 #include "include/rb_gsl_function.h"
 #include <gsl/gsl_min.h>
 
-double rb_gsl_function_f(double x, void *p); 
+double rb_gsl_function_f(double x, void *p);
 
 enum {
   GSL_MIN_FMINIMIZER_GOLDENSECTION,
   GSL_MIN_FMINIMIZER_BRENT,
-#ifdef GSL_1_13_LATER
   GSL_MIN_FMINIMIZER_QUAD_GOLDEN,
-#endif
 };
 static const gsl_min_fminimizer_type* rb_gsl_min_fminimizer_type_get(VALUE t);
 
-static const gsl_min_fminimizer_type* rb_gsl_min_fminimizer_type_get(VALUE t) 
+static const gsl_min_fminimizer_type* rb_gsl_min_fminimizer_type_get(VALUE t)
 {
   char name[32];
   switch (TYPE(t)) {
   case T_STRING:
     strcpy(name, STR2CSTR(t));
-    if (str_tail_grep(name, "goldensection") == 0) 
+    if (str_tail_grep(name, "goldensection") == 0)
       return gsl_min_fminimizer_goldensection;
-    else if (str_tail_grep(name, "brent") == 0) 
+    else if (str_tail_grep(name, "brent") == 0)
       return gsl_min_fminimizer_brent;
-#ifdef GSL_1_13_LATER
-    else if (str_tail_grep(name, "quad_golden") == 0) 
+    else if (str_tail_grep(name, "quad_golden") == 0)
       return gsl_min_fminimizer_quad_golden;
-#endif
-    else 
+    else
       rb_raise(rb_eTypeError, "unknown type %s (goldensection, brent or quad_golden expected)",
-	       name);
+               name);
     break;
   case T_FIXNUM:
     switch (FIX2INT(t)) {
-    case GSL_MIN_FMINIMIZER_GOLDENSECTION: 
-      return gsl_min_fminimizer_goldensection; 
+    case GSL_MIN_FMINIMIZER_GOLDENSECTION:
+      return gsl_min_fminimizer_goldensection;
       break;
-    case GSL_MIN_FMINIMIZER_BRENT: 
-      return gsl_min_fminimizer_brent; 
+    case GSL_MIN_FMINIMIZER_BRENT:
+      return gsl_min_fminimizer_brent;
       break;
-#ifdef GSL_1_13_LATER
-    case GSL_MIN_FMINIMIZER_QUAD_GOLDEN: 
-      return gsl_min_fminimizer_quad_golden; 
+    case GSL_MIN_FMINIMIZER_QUAD_GOLDEN:
+      return gsl_min_fminimizer_quad_golden;
       break;
-#endif
-    default: 
-      rb_raise(rb_eTypeError, "unknown type (GOLDENSECION or BRENT or QUAD_GOLDEN expected)"); 
+    default:
+      rb_raise(rb_eTypeError, "unknown type (GOLDENSECION or BRENT or QUAD_GOLDEN expected)");
       break;
     }
     break;
   default:
     rb_raise(rb_eTypeError, "wrong argument type %s (String of Fixnum)",
-	     rb_class2name(CLASS_OF(t)));
+             rb_class2name(CLASS_OF(t)));
     break;
   }
 }
@@ -83,35 +77,35 @@ static VALUE rb_gsl_min_fminimizer_name(VALUE obj)
   return rb_str_new2(gsl_min_fminimizer_name(gmf));
 }
 
-static VALUE rb_gsl_min_fminimizer_set(VALUE obj, VALUE ff, VALUE xmin, 
-				       VALUE xl, VALUE xu)
+static VALUE rb_gsl_min_fminimizer_set(VALUE obj, VALUE ff, VALUE xmin,
+                                       VALUE xl, VALUE xu)
 {
   gsl_min_fminimizer *gmf = NULL;
   gsl_function *f = NULL;
-  Need_Float(xmin); Need_Float(xl); Need_Float(xu); 
+  Need_Float(xmin); Need_Float(xl); Need_Float(xu);
   CHECK_FUNCTION(ff);
   Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
   Data_Get_Struct(ff, gsl_function, f);
-  return INT2FIX(gsl_min_fminimizer_set(gmf, f, NUM2DBL(xmin), 
-					NUM2DBL(xl), NUM2DBL(xu)));
+  return INT2FIX(gsl_min_fminimizer_set(gmf, f, NUM2DBL(xmin),
+                                        NUM2DBL(xl), NUM2DBL(xu)));
 }
 
-static VALUE rb_gsl_min_fminimizer_set_with_values(VALUE obj, VALUE ff, 
-						   VALUE xmin, VALUE fmin,
-						   VALUE xl, VALUE fl, 
-						   VALUE xu, VALUE fu)
+static VALUE rb_gsl_min_fminimizer_set_with_values(VALUE obj, VALUE ff,
+                                                   VALUE xmin, VALUE fmin,
+                                                   VALUE xl, VALUE fl,
+                                                   VALUE xu, VALUE fu)
 {
   gsl_min_fminimizer *gmf = NULL;
   gsl_function *f = NULL;
-  Need_Float(xmin); Need_Float(xl); Need_Float(xu); 
-  Need_Float(fl); Need_Float(fu); 
+  Need_Float(xmin); Need_Float(xl); Need_Float(xu);
+  Need_Float(fl); Need_Float(fu);
   CHECK_FUNCTION(ff);
   Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
   Data_Get_Struct(ff, gsl_function, f);
-  return INT2FIX(gsl_min_fminimizer_set_with_values(gmf, f, NUM2DBL(xmin), 
-						    NUM2DBL(fmin),
-						    NUM2DBL(xl), NUM2DBL(fl),
-						    NUM2DBL(xu), NUM2DBL(fu)));
+  return INT2FIX(gsl_min_fminimizer_set_with_values(gmf, f, NUM2DBL(xmin),
+                                                    NUM2DBL(fmin),
+                                                    NUM2DBL(xl), NUM2DBL(fl),
+                                                    NUM2DBL(xu), NUM2DBL(fu)));
 }
 
 static VALUE rb_gsl_min_fminimizer_iterate(VALUE obj)
@@ -135,29 +129,6 @@ static VALUE rb_gsl_min_fminimizer_x_upper(VALUE obj)
   return rb_float_new(gsl_min_fminimizer_x_upper(gmf));
 }
 
-#ifndef GSL_1_2_LATER
-static double gsl_min_fminimizer_x_minimum(const gsl_min_fminimizer * s)
-{  
-  /*  return s->x_minimum;*/
-  return s->minimum;
-}
-
-static double gsl_min_fminimizer_f_minimum(const gsl_min_fminimizer * s)
-{  
-  return s->f_minimum;
-}
-
-static double gsl_min_fminimizer_f_lower(const gsl_min_fminimizer * s)
-{ 
-  return s->f_lower;
-}
-
-static double gsl_min_fminimizer_f_upper(const gsl_min_fminimizer * s)
-{ 
-  return s->f_upper;
-}
-#endif
-
 static VALUE rb_gsl_min_fminimizer_x_minimum(VALUE obj)
 {
   gsl_min_fminimizer *gmf = NULL;
@@ -198,12 +169,12 @@ static VALUE rb_gsl_min_fminimizer_test_interval(VALUE obj, VALUE ea, VALUE er)
 }
 
 static VALUE rb_gsl_fminimizer_test_interval(VALUE obj, VALUE xl, VALUE xu,
-					     VALUE ea, VALUE er)
+                                             VALUE ea, VALUE er)
 {
   Need_Float(xl); Need_Float(xu);
   Need_Float(ea); Need_Float(er);
   return INT2FIX(gsl_min_test_interval(NUM2DBL(xl), NUM2DBL(xu),
-				       NUM2DBL(ea), NUM2DBL(er)));
+                                       NUM2DBL(ea), NUM2DBL(er)));
 }
 
 void Init_gsl_min(VALUE module)
@@ -211,21 +182,19 @@ void Init_gsl_min(VALUE module)
   VALUE mgsl_min, cgsl_fminimizer;
 
   mgsl_min = rb_define_module_under(module, "Min");
-  
+
   cgsl_fminimizer = rb_define_class_under(mgsl_min, "FMinimizer", cGSL_Object);
 
-  rb_define_const(cgsl_fminimizer, "GOLDENSECTION", 
-		  INT2FIX(GSL_MIN_FMINIMIZER_GOLDENSECTION));
-  rb_define_const(cgsl_fminimizer, "Goldensection", 
-		  INT2FIX(GSL_MIN_FMINIMIZER_GOLDENSECTION));
+  rb_define_const(cgsl_fminimizer, "GOLDENSECTION",
+                  INT2FIX(GSL_MIN_FMINIMIZER_GOLDENSECTION));
+  rb_define_const(cgsl_fminimizer, "Goldensection",
+                  INT2FIX(GSL_MIN_FMINIMIZER_GOLDENSECTION));
   rb_define_const(cgsl_fminimizer, "BRENT",
-		  INT2FIX(GSL_MIN_FMINIMIZER_BRENT));
+                  INT2FIX(GSL_MIN_FMINIMIZER_BRENT));
   rb_define_const(cgsl_fminimizer, "Brent",
-		  INT2FIX(GSL_MIN_FMINIMIZER_BRENT));
-#ifdef GSL_1_13_LATER
+                  INT2FIX(GSL_MIN_FMINIMIZER_BRENT));
   rb_define_const(cgsl_fminimizer, "QUAD_GOLDEN",
-		  INT2FIX(GSL_MIN_FMINIMIZER_QUAD_GOLDEN));
-#endif
+                  INT2FIX(GSL_MIN_FMINIMIZER_QUAD_GOLDEN));
 
   rb_define_singleton_method(cgsl_fminimizer, "new", rb_gsl_min_fminimizer_new, 1);
   rb_define_singleton_method(cgsl_fminimizer, "alloc", rb_gsl_min_fminimizer_new, 1);
@@ -239,8 +208,8 @@ void Init_gsl_min(VALUE module)
   rb_define_method(cgsl_fminimizer, "x_upper", rb_gsl_min_fminimizer_x_upper, 0);
   rb_define_method(cgsl_fminimizer, "test_interval", rb_gsl_min_fminimizer_test_interval, 2);
 
-  rb_define_singleton_method(mgsl_min, "test_interval", 
-			     rb_gsl_fminimizer_test_interval, 4);
+  rb_define_singleton_method(mgsl_min, "test_interval",
+                             rb_gsl_fminimizer_test_interval, 4);
 
   rb_define_method(cgsl_fminimizer, "x_minimum", rb_gsl_min_fminimizer_x_minimum, 0);
   rb_define_method(cgsl_fminimizer, "f_minimum", rb_gsl_min_fminimizer_f_minimum, 0);
diff --git a/ext/gsl/monte.c b/ext/gsl_native/monte.c
similarity index 93%
rename from ext/gsl/monte.c
rename to ext/gsl_native/monte.c
index 0c2b404..3559001 100644
--- a/ext/gsl/monte.c
+++ b/ext/gsl_native/monte.c
@@ -16,7 +16,7 @@
 #include <gsl/gsl_monte_vegas.h>
 
 #ifndef CHECK_MONTE_FUNCTION
-#define CHECK_MONTE_FUNCTION(x) if(!rb_obj_is_kind_of(x,cgsl_monte_function))\
+#define CHECK_MONTE_FUNCTION(x) if(!rb_obj_is_kind_of(x,cgsl_monte_function)) \
     rb_raise(rb_eTypeError, "wrong type (Function expected)");
 #endif
 
@@ -24,9 +24,7 @@ static VALUE cgsl_monte_plain;
 static VALUE cgsl_monte_miser;
 static VALUE cgsl_monte_vegas;
 static VALUE cgsl_monte_function;
-#ifdef GSL_1_13_LATER
 static VALUE cgsl_monte_miser_params, cgsl_monte_vegas_params;
-#endif
 EXTERN VALUE cgsl_vector;
 
 enum {
@@ -102,7 +100,7 @@ static VALUE rb_gsl_monte_function_new(int argc, VALUE *argv, VALUE klass)
   obj = Data_Wrap_Struct(klass, gsl_monte_function_mark, gsl_monte_function_free, f);
   rb_gsl_monte_function_set_f(argc, argv, obj);
   return obj;
-}			    
+}
 
 static double rb_gsl_monte_function_f(double *x, size_t dim, void *p)
 {
@@ -237,16 +235,16 @@ static VALUE rb_gsl_monte_integrate(int argc, VALUE *argv, VALUE obj)
   int itmp = 0, flagr = 0, type;
   double result, abserr;
 
-  if (argc < 4) 
+  if (argc < 4)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)", argc);
   switch (TYPE(obj)) {
   case T_MODULE:
   case T_CLASS:
   case T_OBJECT:
     if (!rb_obj_is_kind_of(argv[0], cgsl_monte_function))
-      rb_raise(rb_eTypeError, 
-	       "wrong type argument %s (GSL::Monte::Function expected)", 
-	       rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError,
+               "wrong type argument %s (GSL::Monte::Function expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     Data_Get_Struct(argv[0], gsl_monte_function, F);
     itmp = 1;
     break;
@@ -267,14 +265,12 @@ static VALUE rb_gsl_monte_integrate(int argc, VALUE *argv, VALUE obj)
     dim = F->dim;
     calls = FIX2INT(argv[itmp+2]);
   }
-
   if (rb_obj_is_kind_of(argv[argc-2], cgsl_rng)) {
     Data_Get_Struct(argv[argc-2], gsl_rng, r);
   } else {
     r = gsl_rng_alloc(gsl_rng_default);
     flagr = 1;
   }
-
   type = get_monte_type(argv[argc-1]);
 
   switch (type) {
@@ -285,8 +281,8 @@ static VALUE rb_gsl_monte_integrate(int argc, VALUE *argv, VALUE obj)
       gsl_monte_plain_init(plain);
     } else {
       if (!rb_obj_is_kind_of(argv[argc-1], cgsl_monte_plain))
-	rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Plain expected)",
-		 rb_class2name(CLASS_OF(argv[argc-1])));
+        rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Plain expected)",
+                 rb_class2name(CLASS_OF(argv[argc-1])));
       Data_Get_Struct(argv[argc-1], gsl_monte_plain_state, plain);
     }
     gsl_monte_plain_integrate(F, xl->data, xu->data, dim, calls, r, plain, &result, &abserr);
@@ -299,8 +295,8 @@ static VALUE rb_gsl_monte_integrate(int argc, VALUE *argv, VALUE obj)
       gsl_monte_miser_init(miser);
     } else {
       if (!rb_obj_is_kind_of(argv[argc-1], cgsl_monte_miser))
-	rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Miser expected)",
-		 rb_class2name(CLASS_OF(argv[argc-1])));
+        rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Miser expected)",
+                 rb_class2name(CLASS_OF(argv[argc-1])));
       Data_Get_Struct(argv[argc-1], gsl_monte_miser_state, miser);
     }
     gsl_monte_miser_integrate(F, xl->data, xu->data, dim, calls, r, miser, &result, &abserr);
@@ -312,10 +308,9 @@ static VALUE rb_gsl_monte_integrate(int argc, VALUE *argv, VALUE obj)
       vegas = gsl_monte_vegas_alloc(dim);
       gsl_monte_vegas_init(vegas);
     } else {      if (!rb_obj_is_kind_of(argv[argc-1], cgsl_monte_vegas))
-	rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Vegas expected)",
-		 rb_class2name(CLASS_OF(argv[argc-1])));
-      Data_Get_Struct(argv[argc-1], gsl_monte_vegas_state, vegas);
-    }
+                    rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Vegas expected)",
+                             rb_class2name(CLASS_OF(argv[argc-1])));
+                  Data_Get_Struct(argv[argc-1], gsl_monte_vegas_state, vegas); }
     gsl_monte_vegas_integrate(F, xl->data, xu->data, dim, calls, r, vegas, &result, &abserr);
     if (type > 100) gsl_monte_vegas_free(vegas);
     break;
@@ -334,7 +329,7 @@ static VALUE rb_gsl_monte_plain_integrate(int argc, VALUE *argv, VALUE obj)
   int flagr = 0;
   double result, abserr;
 
-  if (argc < 4) 
+  if (argc < 4)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 4, 5 or 6)", argc);
   CHECK_MONTE_FUNCTION(argv[0]);
   CHECK_VECTOR(argv[1]);  CHECK_VECTOR(argv[2]);
@@ -349,15 +344,14 @@ static VALUE rb_gsl_monte_plain_integrate(int argc, VALUE *argv, VALUE obj)
     dim = F->dim;
     calls = FIX2INT(argv[3]);
   }
-
   if (rb_obj_is_kind_of(argv[argc-1], cgsl_rng)) {
     Data_Get_Struct(argv[argc-1], gsl_rng, r);
   } else {
     r = gsl_rng_alloc(gsl_rng_default);
     flagr = 1;
   }
-  gsl_monte_plain_integrate(F, xl->data, xu->data, dim, calls, r, plain, 
-			    &result, &abserr);
+  gsl_monte_plain_integrate(F, xl->data, xu->data, dim, calls, r, plain,
+                            &result, &abserr);
   if (flagr == 1) gsl_rng_free(r);
   return rb_ary_new3(2, rb_float_new(result), rb_float_new(abserr));
 }
@@ -387,15 +381,14 @@ static VALUE rb_gsl_monte_miser_integrate(int argc, VALUE *argv, VALUE obj)
     dim = F->dim;
     calls = FIX2INT(argv[3]);
   }
-
   if (rb_obj_is_kind_of(argv[argc-1], cgsl_rng)) {
     Data_Get_Struct(argv[argc-1], gsl_rng, r);
   } else {
     r = gsl_rng_alloc(gsl_rng_default);
     flagr = 1;
   }
-  gsl_monte_miser_integrate(F, xl->data, xu->data, dim, calls, r, miser, 
-			    &result, &abserr);
+  gsl_monte_miser_integrate(F, xl->data, xu->data, dim, calls, r, miser,
+                            &result, &abserr);
   if (flagr == 1) gsl_rng_free(r);
   return rb_ary_new3(2, rb_float_new(result), rb_float_new(abserr));
 }
@@ -410,7 +403,7 @@ static VALUE rb_gsl_monte_vegas_integrate(int argc, VALUE *argv, VALUE obj)
   int flagr = 0;
   double result, abserr;
 
-  if (argc < 4) 
+  if (argc < 4)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)", argc);
   CHECK_MONTE_FUNCTION(argv[0]);
   CHECK_VECTOR(argv[1]);  CHECK_VECTOR(argv[2]);
@@ -425,15 +418,14 @@ static VALUE rb_gsl_monte_vegas_integrate(int argc, VALUE *argv, VALUE obj)
     dim = F->dim;
     calls = FIX2INT(argv[3]);
   }
-
   if (rb_obj_is_kind_of(argv[argc-1], cgsl_rng)) {
     Data_Get_Struct(argv[argc-1], gsl_rng, r);
   } else {
     r = gsl_rng_alloc(gsl_rng_default);
     flagr = 1;
   }
-  gsl_monte_vegas_integrate(F, xl->data, xu->data, dim, calls, r, vegas, 
-			    &result, &abserr);
+  gsl_monte_vegas_integrate(F, xl->data, xu->data, dim, calls, r, vegas,
+                            &result, &abserr);
   if (flagr == 1) gsl_rng_free(r);
   return rb_ary_new3(2, rb_float_new(result), rb_float_new(abserr));
 }
@@ -447,7 +439,6 @@ static int get_monte_type(VALUE vt)
   else {
     /* do next */
   }
-
   switch(TYPE(vt)) {
   case T_STRING:
     strcpy(name, STR2CSTR(vt));
@@ -555,8 +546,8 @@ static VALUE rb_gsl_monte_miser_state(VALUE obj)
   gsl_monte_miser_state *s = NULL;
   Data_Get_Struct(obj, gsl_monte_miser_state, s);
   return rb_ary_new3(5, rb_float_new(s->estimate_frac), INT2FIX(s->min_calls),
-		     INT2FIX(s->min_calls_per_bisection), rb_float_new(s->alpha),
-		     rb_float_new(s->dither));
+                     INT2FIX(s->min_calls_per_bisection), rb_float_new(s->alpha),
+                     rb_float_new(s->dither));
 }
 
 static VALUE rb_gsl_monte_vegas_result(VALUE obj)
@@ -655,20 +646,19 @@ static VALUE rb_gsl_monte_vegas_state(VALUE obj)
 {
   gsl_monte_vegas_state *s = NULL;
   Data_Get_Struct(obj, gsl_monte_vegas_state, s);
-  return rb_ary_new3(8, rb_float_new(s->result), rb_float_new(s->sigma), 
-		     rb_float_new(s->chisq), rb_float_new(s->alpha), 
-		     INT2FIX(s->iterations), INT2FIX(s->stage), 
-		     INT2FIX(s->mode), INT2FIX(s->verbose));
+  return rb_ary_new3(8, rb_float_new(s->result), rb_float_new(s->sigma),
+                     rb_float_new(s->chisq), rb_float_new(s->alpha),
+                     INT2FIX(s->iterations), INT2FIX(s->stage),
+                     INT2FIX(s->mode), INT2FIX(s->verbose));
 }
 
-#ifdef GSL_1_13_LATER
 static VALUE rb_gsl_monte_miser_params_get(VALUE obj)
 {
   gsl_monte_miser_state *s = NULL;
   gsl_monte_miser_params *p = NULL;
   Data_Get_Struct(obj, gsl_monte_miser_state, s);
   p = (gsl_monte_miser_params *) malloc(sizeof(gsl_monte_miser_params));
-  gsl_monte_miser_params_get(s, p);  
+  gsl_monte_miser_params_get(s, p);
   return Data_Wrap_Struct(cgsl_monte_miser_params, 0, free, p);
 }
 static VALUE rb_gsl_monte_miser_params_set(VALUE obj, VALUE params)
@@ -677,7 +667,7 @@ static VALUE rb_gsl_monte_miser_params_set(VALUE obj, VALUE params)
   gsl_monte_miser_params *p = NULL;
   Data_Get_Struct(obj, gsl_monte_miser_state, s);
   Data_Get_Struct(params, gsl_monte_miser_params, p);
-  gsl_monte_miser_params_set(s, p);  
+  gsl_monte_miser_params_set(s, p);
   return Qtrue;
 }
 static VALUE rb_gsl_monte_miser_params_get_estimate_frac(VALUE obj)
@@ -752,7 +742,7 @@ static VALUE rb_gsl_monte_vegas_params_get(VALUE obj)
   gsl_monte_vegas_params *p = NULL;
   Data_Get_Struct(obj, gsl_monte_vegas_state, s);
   p = (gsl_monte_vegas_params *) malloc(sizeof(gsl_monte_vegas_params));
-  gsl_monte_vegas_params_get(s, p);  
+  gsl_monte_vegas_params_get(s, p);
   return Data_Wrap_Struct(cgsl_monte_vegas_params, 0, free, p);
 }
 static VALUE rb_gsl_monte_vegas_params_set(VALUE obj, VALUE params)
@@ -761,7 +751,7 @@ static VALUE rb_gsl_monte_vegas_params_set(VALUE obj, VALUE params)
   gsl_monte_vegas_params *p = NULL;
   Data_Get_Struct(obj, gsl_monte_vegas_state, s);
   Data_Get_Struct(params, gsl_monte_vegas_params, p);
-  gsl_monte_vegas_params_set(s, p);  
+  gsl_monte_vegas_params_set(s, p);
   return Qtrue;
 }
 static VALUE rb_gsl_monte_vegas_params_get_alpha(VALUE obj)
@@ -841,7 +831,6 @@ static VALUE rb_gsl_monte_vegas_runval(VALUE obj)
   rb_ary_store(ary, 1, rb_float_new(sig));
   return ary;
 }
-#endif
 
 void Init_gsl_monte(VALUE module)
 {
@@ -926,20 +915,19 @@ void Init_gsl_monte(VALUE module)
 
 
   /*****/
-  rb_define_singleton_method(cgsl_monte_plain, "integrate", 
-			     rb_gsl_monte_integrate, -1);
-  rb_define_method(cgsl_monte_plain, "integrate", 
-		   rb_gsl_monte_plain_integrate, -1);
-  rb_define_singleton_method(cgsl_monte_miser, "integrate", 
-			     rb_gsl_monte_integrate, -1);
-  rb_define_method(cgsl_monte_miser, "integrate", 
-		   rb_gsl_monte_miser_integrate, -1);
-  rb_define_singleton_method(cgsl_monte_vegas, "integrate", 
-			     rb_gsl_monte_integrate, -1);
-  rb_define_method(cgsl_monte_vegas, "integrate", 
-		   rb_gsl_monte_vegas_integrate, -1);
-
-#ifdef GSL_1_13_LATER
+  rb_define_singleton_method(cgsl_monte_plain, "integrate",
+                             rb_gsl_monte_integrate, -1);
+  rb_define_method(cgsl_monte_plain, "integrate",
+                   rb_gsl_monte_plain_integrate, -1);
+  rb_define_singleton_method(cgsl_monte_miser, "integrate",
+                             rb_gsl_monte_integrate, -1);
+  rb_define_method(cgsl_monte_miser, "integrate",
+                   rb_gsl_monte_miser_integrate, -1);
+  rb_define_singleton_method(cgsl_monte_vegas, "integrate",
+                             rb_gsl_monte_integrate, -1);
+  rb_define_method(cgsl_monte_vegas, "integrate",
+                   rb_gsl_monte_vegas_integrate, -1);
+
   cgsl_monte_miser_params = rb_define_class_under(cgsl_monte_miser, "Params", cGSL_Object);
   cgsl_monte_vegas_params = rb_define_class_under(cgsl_monte_vegas, "Params", cGSL_Object);
 
@@ -982,10 +970,8 @@ void Init_gsl_monte(VALUE module)
   rb_define_method(cgsl_monte_vegas, "runval", rb_gsl_monte_vegas_runval, 0);
 
   rb_define_const(cgsl_monte_vegas, "MODE_IMPORTANCE", INT2FIX(GSL_VEGAS_MODE_IMPORTANCE));
-  rb_define_const(cgsl_monte_vegas, "MODE_IMPORTANCE_ONLY", INT2FIX(GSL_VEGAS_MODE_IMPORTANCE_ONLY)); 
+  rb_define_const(cgsl_monte_vegas, "MODE_IMPORTANCE_ONLY", INT2FIX(GSL_VEGAS_MODE_IMPORTANCE_ONLY));
   rb_define_const(cgsl_monte_vegas, "MODE_STRATIFIED", INT2FIX(GSL_VEGAS_MODE_STRATIFIED));
-#endif
-
 }
 #ifdef CHECK_MONTE_FUNCTION
 #undef CHECK_MONTE_FUNCTION
diff --git a/ext/gsl/multifit.c b/ext/gsl_native/multifit.c
similarity index 89%
rename from ext/gsl/multifit.c
rename to ext/gsl_native/multifit.c
index 8f8cb49..55e4f02 100644
--- a/ext/gsl/multifit.c
+++ b/ext/gsl_native/multifit.c
@@ -19,23 +19,23 @@ void Init_ndlinear(VALUE module);
 #endif
 
 #ifndef CHECK_WORKSPACE
-#define CHECK_WORKSPACE(x) if(CLASS_OF(x)!=cgsl_multifit_workspace)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::MultiFit::Workspace expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_WORKSPACE(x) if(CLASS_OF(x)!=cgsl_multifit_workspace) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::MultiFit::Workspace expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifndef CHECK_MULTIFIT_FUNCTION_FDF
-#define CHECK_MULTIFIT_FUNCTION_FDF(x) if(CLASS_OF(x)!=cgsl_multifit_function_fdf)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::MultiFit::Workspace expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_MULTIFIT_FUNCTION_FDF(x) if(CLASS_OF(x)!=cgsl_multifit_function_fdf) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::MultiFit::Workspace expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 static VALUE cgsl_multifit_workspace;
 static VALUE cgsl_multifit_function_fdf;
 
-enum MultiFit_Solver_Type{
+enum MultiFit_Solver_Type {
   GSL_MULTIFIT_FDFSOLVER_LMSDER,
   GSL_MULTIFIT_FDFSOLVER_LMDER,
 };
@@ -56,7 +56,7 @@ static VALUE rb_gsl_multifit_linear(int argc, VALUE *argv, VALUE obj)
   double chisq;
   int status, flag = 0;
   VALUE vc, vcov;
-  if (argc != 2 && argc != 3) 
+  if (argc != 2 && argc != 3)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
   Data_Get_Matrix(argv[0], x);
   Data_Get_Vector(argv[1], y);
@@ -84,7 +84,7 @@ static VALUE rb_gsl_multifit_wlinear(int argc, VALUE *argv, VALUE obj)
   double chisq;
   int status, flag = 0;
   VALUE vc, vcov;
-  if (argc != 3 && argc != 4) 
+  if (argc != 3 && argc != 4)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
   Data_Get_Matrix(argv[0], x);
   Data_Get_Vector(argv[1], w);
@@ -139,7 +139,7 @@ static void calc_X_legendre(gsl_matrix *X, gsl_vector *v, size_t order)
 }
 
 static VALUE rb_gsl_multifit_XXXfit(int argc, VALUE *argv, VALUE obj,
-				    void (*fn)(gsl_matrix*, gsl_vector*,size_t))
+                                    void (*fn)(gsl_matrix*, gsl_vector*,size_t))
 {
   gsl_multifit_linear_workspace *space = NULL;
   gsl_matrix *X = NULL, *cov = NULL;
@@ -149,7 +149,7 @@ static VALUE rb_gsl_multifit_XXXfit(int argc, VALUE *argv, VALUE obj,
   double chisq;
   int status, flag = 0, flagw = 0;
   VALUE vc, verr;
-  if (argc != 3 && argc != 4 && argc != 5) 
+  if (argc != 3 && argc != 4 && argc != 5)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
   x = &xx.vector;
   w = &ww.vector;
@@ -181,9 +181,8 @@ static VALUE rb_gsl_multifit_XXXfit(int argc, VALUE *argv, VALUE obj,
   err = gsl_vector_alloc(order + 1);
   vc = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, c);
   verr = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, err);
-  for (i = 0; i < err->size; i++) 
+  for (i = 0; i < err->size; i++)
     gsl_vector_set(err, i, sqrt(chisq/((double)x->size-err->size)*gsl_matrix_get(cov, i, i)));
-  
   gsl_matrix_free(X);
   gsl_matrix_free(cov);
   return rb_ary_new3(4, vc, verr, rb_float_new(chisq), INT2FIX(status));
@@ -213,31 +212,31 @@ static VALUE rb_gsl_multifit_fdfsolver_new(int argc, VALUE *argv, VALUE klass)
     case T_STRING:
       strcpy(name, STR2CSTR(argv[0]));
       if (str_tail_grep(name, "lmsder") == 0) {
-	T = gsl_multifit_fdfsolver_lmsder;
+        T = gsl_multifit_fdfsolver_lmsder;
       } else if (str_tail_grep(name, "lmder") == 0) {
-	T = gsl_multifit_fdfsolver_lmder;
+        T = gsl_multifit_fdfsolver_lmder;
       } else {
-	rb_raise(rb_eTypeError, "unknown solver type %s (lmsder of lmder)",
-		 name);
+        rb_raise(rb_eTypeError, "unknown solver type %s (lmsder of lmder)",
+                 name);
       }
       break;
     case T_FIXNUM:
       switch (FIX2INT(argv[0])) {
       case GSL_MULTIFIT_FDFSOLVER_LMSDER:
-	T = gsl_multifit_fdfsolver_lmsder;
-	break;
+        T = gsl_multifit_fdfsolver_lmsder;
+        break;
       case GSL_MULTIFIT_FDFSOLVER_LMDER:
-	T = gsl_multifit_fdfsolver_lmder;
-	break;
+        T = gsl_multifit_fdfsolver_lmder;
+        break;
       default:
-	rb_raise(rb_eTypeError, 
-		 "unknown solver type (GSL::MultiFit::FdfSolver::LMSDER or LMDER expected)");
-	break;
+        rb_raise(rb_eTypeError,
+                 "unknown solver type (GSL::MultiFit::FdfSolver::LMSDER or LMDER expected)");
+        break;
       }
       break;
     default:
       rb_raise(rb_eTypeError, "wrong argument type %s (Fixnum or String)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
       break;
     }
     CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
@@ -301,8 +300,8 @@ static VALUE rb_gsl_multifit_fdfsolver_print_state(VALUE obj, VALUE i)
   CHECK_FIXNUM(i);
   Data_Get_Struct(obj, gsl_multifit_fdfsolver, solver);
   printf("iter: %d x = %15.8f %15.8f %15.8f |f(x)| = %g\n",
-	 (int) FIX2INT(i), gsl_vector_get(solver->x, 0), gsl_vector_get(solver->x, 1),
-	 gsl_vector_get(solver->x, 2), gsl_blas_dnrm2(solver->f));
+         (int) FIX2INT(i), gsl_vector_get(solver->x, 0), gsl_vector_get(solver->x, 1),
+         gsl_vector_get(solver->x, 2), gsl_blas_dnrm2(solver->f));
   return Qtrue;
 }
 
@@ -449,15 +448,15 @@ static VALUE rb_gsl_multifit_gradient(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 2:
     Data_Get_Matrix(argv[0], J);
-    Data_Get_Vector(argv[1], f);  
+    Data_Get_Vector(argv[1], f);
     g = gsl_vector_alloc(f->size);
     /*status =*/ gsl_multifit_gradient(J, f, g);
     return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, g);
-    break;  
+    break;
   case 3:
     Data_Get_Matrix(argv[0], J);
-    Data_Get_Vector(argv[1], f);  
-    Data_Get_Vector(argv[2], g);  
+    Data_Get_Vector(argv[1], f);
+    Data_Get_Vector(argv[2], g);
     return INT2FIX(gsl_multifit_gradient(J, f, g));
     break;
   default:
@@ -496,15 +495,15 @@ static VALUE rb_gsl_multifit_covar(int argc, VALUE *argv, VALUE obj)
 
 static void rb_gsl_multifit_define_const(VALUE klass)
 {
-  rb_define_const(klass, "LMSDER", 
-		  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMSDER));
-  rb_define_const(klass, "LMDER", 
-		  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMDER));
+  rb_define_const(klass, "LMSDER",
+                  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMSDER));
+  rb_define_const(klass, "LMDER",
+                  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMDER));
 
-  rb_define_const(klass, "Lmsder", 
-		  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMSDER));
-  rb_define_const(klass, "Lmder", 
-		  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMDER));
+  rb_define_const(klass, "Lmsder",
+                  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMSDER));
+  rb_define_const(klass, "Lmder",
+                  INT2FIX(GSL_MULTIFIT_FDFSOLVER_LMDER));
 }
 
 static void gsl_multifit_function_fdf_free(gsl_multifit_function_fdf *f);
@@ -520,11 +519,11 @@ static void gsl_multifit_function_fdf_mark(gsl_multifit_function_fdf *F)
 }
 
 static int gsl_multifit_function_fdf_f(const gsl_vector *x, void *params,
-				       gsl_vector *f);
+                                       gsl_vector *f);
 static int gsl_multifit_function_fdf_df(const gsl_vector *x, void *params,
-					gsl_matrix *J);
+                                        gsl_matrix *J);
 static int gsl_multifit_function_fdf_fdf(const gsl_vector *x, void *params,
-					 gsl_vector *f, gsl_matrix *J);
+                                         gsl_vector *f, gsl_matrix *J);
 
 static VALUE rb_gsl_multifit_function_fdf_set_procs(int argc, VALUE *argv, VALUE obj);
 
@@ -551,7 +550,7 @@ static VALUE rb_gsl_multifit_function_fdf_new(int argc, VALUE *argv, VALUE klass
     break;
   }
   return obj;
-}			    
+}
 
 static VALUE rb_gsl_multifit_function_fdf_set_procs(int argc, VALUE *argv, VALUE obj)
 {
@@ -568,8 +567,8 @@ static VALUE rb_gsl_multifit_function_fdf_set_procs(int argc, VALUE *argv, VALUE
   rb_ary_store(ary, 0, argv[0]);
   rb_ary_store(ary, 1, argv[1]);
   switch (argc) {
-	case 2:
-		break;
+  case 2:
+    break;
   case 3:
     if (TYPE(argv[2]) == T_FIXNUM) {
       func->p = FIX2INT(argv[2]);
@@ -621,7 +620,7 @@ static VALUE rb_gsl_multifit_function_fdf_set_data(int argc, VALUE *argv, VALUE
 }
 
 static int gsl_multifit_function_fdf_f(const gsl_vector *x, void *params,
-				       gsl_vector *f)
+                                       gsl_vector *f)
 {
   VALUE vt_y_sigma, vt, vy, vsigma, vf, vx, proc, ary;
   ary = (VALUE) params;
@@ -643,13 +642,13 @@ static int gsl_multifit_function_fdf_f(const gsl_vector *x, void *params,
     break;
   default:
     rb_raise(rb_eArgError, "bad argument");
-    break;    
+    break;
   }
   return GSL_SUCCESS;
 }
 
 static int gsl_multifit_function_fdf_df(const gsl_vector *x, void *params,
-					gsl_matrix *J)
+                                        gsl_matrix *J)
 {
   VALUE vt_y_sigma, vt, vy, vsigma, vJ, vx, proc, ary;
   ary = (VALUE) params;
@@ -671,13 +670,13 @@ static int gsl_multifit_function_fdf_df(const gsl_vector *x, void *params,
     break;
   default:
     rb_raise(rb_eArgError, "bad argument");
-    break;    
+    break;
   }
   return GSL_SUCCESS;
 }
 
 static int gsl_multifit_function_fdf_fdf(const gsl_vector *x, void *params,
-					 gsl_vector *f, gsl_matrix *J)
+                                         gsl_vector *f, gsl_matrix *J)
 {
   VALUE vt_y_sigma, vt, vy, vsigma, vf, vJ, vx, proc_f, proc_df, proc_fdf;
   VALUE ary;
@@ -696,7 +695,7 @@ static int gsl_multifit_function_fdf_fdf(const gsl_vector *x, void *params,
     if (NIL_P(proc_fdf)) {
       rb_funcall(proc_f, RBGSL_ID_call, 4, vx, vt, vy, vf);
       rb_funcall(proc_df, RBGSL_ID_call, 4, vx, vt, vy, vJ);
-    } else 
+    } else
       rb_funcall(proc_fdf, RBGSL_ID_call, 5, vx, vt, vy, vf, vJ);
     break;
   case 3:
@@ -706,12 +705,12 @@ static int gsl_multifit_function_fdf_fdf(const gsl_vector *x, void *params,
     if (NIL_P(proc_fdf)) {
       rb_funcall(proc_f, RBGSL_ID_call, 5, vx, vt, vy, vsigma, vf);
       rb_funcall(proc_df, RBGSL_ID_call, 5, vx, vt, vy, vsigma, vJ);
-    } else 
+    } else
       rb_funcall(proc_fdf, RBGSL_ID_call, 6, vx, vt, vy, vsigma, vf, vJ);
     break;
   default:
     rb_raise(rb_eArgError, "bad argument");
-    break;    
+    break;
   }
   return GSL_SUCCESS;
 }
@@ -750,7 +749,7 @@ struct fitting_xydata {
   gsl_vector *x, *y, *w;
 };
 
-/* Gaussian fit 
+/* Gaussian fit
    y = y0 + A exp(-(x-x0/sigma)^2)
        v[0] = y0
        v[1] = A
@@ -807,14 +806,14 @@ static int Gaussian_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Gaussian_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                        gsl_vector *f, gsl_matrix *J)
 {
   Gaussian_f(v, data, f);
   Gaussian_df(v, data, J);
   return GSL_SUCCESS;
 }
 
-/* 2 Gaussian fit 
+/* 2 Gaussian fit
    y = y0 + A1 exp(-(x-x01/sigma1)^2) + A2 exp(-(x-x02/sigma2)^2)
        v[0] = y0
        v[1] = A1
@@ -885,14 +884,14 @@ static int Gaussian_2peaks_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Gaussian_2peaks_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                               gsl_vector *f, gsl_matrix *J)
 {
   Gaussian_2peaks_f(v, data, f);
   Gaussian_2peaks_df(v, data, J);
   return GSL_SUCCESS;
 }
 
-/* Exponential fit 
+/* Exponential fit
    y = y0 + A exp(-bx)
        v[0] = y0
        v[1] = A
@@ -938,14 +937,14 @@ static int Exponential_df(const gsl_vector *v, void *data, gsl_matrix *J)
     else wi = 1.0;
     yy = exp(-xi*b);
     gsl_matrix_set(J, i, 0, 1.0*wi);
-    gsl_matrix_set(J, i, 1, yy*wi); 
+    gsl_matrix_set(J, i, 1, yy*wi);
     gsl_matrix_set(J, i, 2, -A*yy*xi*wi);
   }
   return GSL_SUCCESS;
 }
 
 static int Exponential_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                           gsl_vector *f, gsl_matrix *J)
 {
   Exponential_f(v, data, f);
   Exponential_df(v, data, J);
@@ -953,7 +952,7 @@ static int Exponential_fdf(const gsl_vector *v, void *data,
 }
 
 
-/* Double Exponential fit 
+/* Double Exponential fit
    y = y0 + A1 exp(-b1 x) + A2 exp(-b2 x)
        v[0] = y0
        v[1] = A1
@@ -1006,23 +1005,23 @@ static int DblExponential_df(const gsl_vector *v, void *data, gsl_matrix *J)
     yy1 = exp(-xi*b1);
     yy2 = exp(-xi*b2);
     gsl_matrix_set(J, i, 0, 1.0*wi);
-    gsl_matrix_set(J, i, 1, yy1*wi); 
+    gsl_matrix_set(J, i, 1, yy1*wi);
     gsl_matrix_set(J, i, 2, -A1*yy1*xi*wi);
-    gsl_matrix_set(J, i, 3, yy2*wi); 
+    gsl_matrix_set(J, i, 3, yy2*wi);
     gsl_matrix_set(J, i, 4, -A2*yy2*xi*wi);
   }
   return GSL_SUCCESS;
 }
 
 static int DblExponential_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                              gsl_vector *f, gsl_matrix *J)
 {
   DblExponential_f(v, data, f);
   DblExponential_df(v, data, J);
   return GSL_SUCCESS;
 }
 
-/* Lorentzian fit 
+/* Lorentzian fit
    y = y0 + A/((x-x0)^2 + B)
        v[0] = y0
        v[1] = A
@@ -1071,7 +1070,7 @@ static int Lorentzian_df(const gsl_vector *v, void *data, gsl_matrix *J)
     else wi = 1.0;
     yy = gsl_pow_2(xi-x0)+B;
     gsl_matrix_set(J, i, 0, 1.0*wi);
-    gsl_matrix_set(J, i, 1, 1.0/yy*wi); 
+    gsl_matrix_set(J, i, 1, 1.0/yy*wi);
     gsl_matrix_set(J, i, 2, 2.0*A*(xi-x0)/yy/yy*wi);
     gsl_matrix_set(J, i, 3, -A/yy/yy*wi);
   }
@@ -1079,7 +1078,7 @@ static int Lorentzian_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Lorentzian_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                          gsl_vector *f, gsl_matrix *J)
 {
   Lorentzian_f(v, data, f);
   Lorentzian_df(v, data, J);
@@ -1136,7 +1135,7 @@ static int Sin_df(const gsl_vector *v, void *data, gsl_matrix *J)
     ys = sin(fc*xi + phi);
     yc = cos(fc*xi + phi);
     gsl_matrix_set(J, i, 0, 1.0*wi);
-    gsl_matrix_set(J, i, 1, ys*wi); 
+    gsl_matrix_set(J, i, 1, ys*wi);
     gsl_matrix_set(J, i, 2, A*yc*xi*wi);
     gsl_matrix_set(J, i, 3, A*yc*wi);
   }
@@ -1144,7 +1143,7 @@ static int Sin_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Sin_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                   gsl_vector *f, gsl_matrix *J)
 {
   Sin_f(v, data, f);
   Sin_df(v, data, J);
@@ -1202,7 +1201,7 @@ static int Hill_df(const gsl_vector *v, void *data, gsl_matrix *J)
     a = pow(xhalf/xi, r);
     yy = (1.0 + a);
     gsl_matrix_set(J, i, 0, (1.0 - 1.0/yy)*wi);
-    gsl_matrix_set(J, i, 1, 1.0/yy*wi); 
+    gsl_matrix_set(J, i, 1, 1.0/yy*wi);
     gsl_matrix_set(J, i, 2, -(m-y0)*r/xhalf*a/yy/yy*wi);
     gsl_matrix_set(J, i, 3, -(m-y0)/yy/yy*a*log(xhalf/xi)*wi);
   }
@@ -1210,7 +1209,7 @@ static int Hill_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Hill_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                    gsl_vector *f, gsl_matrix *J)
 {
   Hill_f(v, data, f);
   Hill_df(v, data, J);
@@ -1267,7 +1266,7 @@ static int Sigmoid_df(const gsl_vector *v, void *data, gsl_matrix *J)
     a = exp((x0 - xi)/r);
     yy = 1.0 + a;
     gsl_matrix_set(J, i, 0, wi);
-    gsl_matrix_set(J, i, 1, 1.0/yy*wi); 
+    gsl_matrix_set(J, i, 1, 1.0/yy*wi);
     gsl_matrix_set(J, i, 2, -m*a/r/yy/yy*wi);
     gsl_matrix_set(J, i, 3, m*a*(x0-xi)/r/r/yy/yy*wi);
   }
@@ -1275,7 +1274,7 @@ static int Sigmoid_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Sigmoid_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                       gsl_vector *f, gsl_matrix *J)
 {
   Sigmoid_f(v, data, f);
   Sigmoid_df(v, data, J);
@@ -1329,15 +1328,15 @@ static int Power_df(const gsl_vector *v, void *data, gsl_matrix *J)
     else wi = 1.0;
     a = pow(xi, r);
     gsl_matrix_set(J, i, 0, wi);
-    gsl_matrix_set(J, i, 1, a*wi); 
+    gsl_matrix_set(J, i, 1, a*wi);
     gsl_matrix_set(J, i, 2, A*a*log(xi)*wi);
-    
+
   }
   return GSL_SUCCESS;
 }
 
 static int Power_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                     gsl_vector *f, gsl_matrix *J)
 {
   Power_f(v, data, f);
   Power_df(v, data, J);
@@ -1395,7 +1394,7 @@ static int Lognormal_df(const gsl_vector *v, void *data, gsl_matrix *J)
     a = log(xi/x0)/width;
     b = exp(-a*a);
     gsl_matrix_set(J, i, 0, wi);
-    gsl_matrix_set(J, i, 1, b*wi); 
+    gsl_matrix_set(J, i, 1, b*wi);
     gsl_matrix_set(J, i, 2, 2.0*A*b*a*a*a/width/x0*wi);
     gsl_matrix_set(J, i, 3, 2.0*A*b*a*a*a*a/width*wi);
   }
@@ -1403,14 +1402,14 @@ static int Lognormal_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Lognormal_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                         gsl_vector *f, gsl_matrix *J)
 {
   Lognormal_f(v, data, f);
   Lognormal_df(v, data, J);
   return GSL_SUCCESS;
 }
 
-/* Rayleigh fit 
+/* Rayleigh fit
    y = A exp(-x*x/2/var)
        v[0] = A
        v[1] = var = sigma^2
@@ -1460,7 +1459,7 @@ static int Rayleigh_df(const gsl_vector *v, void *data, gsl_matrix *J)
 }
 
 static int Rayleigh_fdf(const gsl_vector *v, void *data,
-			gsl_vector *f, gsl_matrix *J)
+                        gsl_vector *f, gsl_matrix *J)
 {
   Rayleigh_f(v, data, f);
   Rayleigh_df(v, data, J);
@@ -1507,10 +1506,10 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
       *v = gsl_vector_alloc(*p);
       gsl_vector_set(*v, 0, 0);   /* y0 = 0 */
       gsl_vector_set(*v, 1, 1);   /* A = 1 */
-      gsl_vector_set(*v, 2, 1);   
+      gsl_vector_set(*v, 2, 1);
       *flag = 1;
     }
- } else if (str_head_grep(fittype, "rayleigh") == 0) {
+  } else if (str_head_grep(fittype, "rayleigh") == 0) {
     f->f = Rayleigh_f;
     f->df = Rayleigh_df;
     f->fdf = Rayleigh_fdf;
@@ -1530,9 +1529,9 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
       *v = gsl_vector_alloc(*p);
       gsl_vector_set(*v, 0, 0);   /* y0 = 0 */
       gsl_vector_set(*v, 1, 1);   /* A = 1 */
-      gsl_vector_set(*v, 2, 1);   
+      gsl_vector_set(*v, 2, 1);
       gsl_vector_set(*v, 3, 1);   /* A = 1 */
-      gsl_vector_set(*v, 4, 1);   
+      gsl_vector_set(*v, 4, 1);
       *flag = 1;
     }
   } else if (str_head_grep(fittype, "lor") == 0) {
@@ -1542,10 +1541,10 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
     *p = 4;
     if (*v == NULL) {
       *v = gsl_vector_alloc(*p);
-      gsl_vector_set(*v, 0, 0); 
+      gsl_vector_set(*v, 0, 0);
       gsl_vector_set(*v, 1, 1);
-      gsl_vector_set(*v, 2, 0);  
-      gsl_vector_set(*v, 3, 1);  
+      gsl_vector_set(*v, 2, 0);
+      gsl_vector_set(*v, 3, 1);
       *flag = 1;
     }
   } else if (str_head_grep(fittype, "sin") == 0) {
@@ -1555,10 +1554,10 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
     *p = 4;
     if (*v == NULL) {
       *v = gsl_vector_alloc(*p);
-      gsl_vector_set(*v, 0, 0); 
+      gsl_vector_set(*v, 0, 0);
       gsl_vector_set(*v, 1, 1);
-      gsl_vector_set(*v, 2, 1);  
-      gsl_vector_set(*v, 3, 0);  
+      gsl_vector_set(*v, 2, 1);
+      gsl_vector_set(*v, 3, 0);
       *flag = 1;
     }
   } else if (str_head_grep(fittype, "hill") == 0) {
@@ -1568,10 +1567,10 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
     *p = 4;
     if (*v == NULL) {
       *v = gsl_vector_alloc(*p);
-      gsl_vector_set(*v, 0, 0); 
+      gsl_vector_set(*v, 0, 0);
       gsl_vector_set(*v, 1, 1);
-      gsl_vector_set(*v, 2, 1);  
-      gsl_vector_set(*v, 3, 1);  
+      gsl_vector_set(*v, 2, 1);
+      gsl_vector_set(*v, 3, 1);
       *flag = 1;
     }
   } else if (str_head_grep(fittype, "sigmoid") == 0 || str_head_grep(fittype, "fermi") == 0) {
@@ -1581,10 +1580,10 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
     *p = 4;
     if (*v == NULL) {
       *v = gsl_vector_alloc(*p);
-      gsl_vector_set(*v, 0, 0); 
+      gsl_vector_set(*v, 0, 0);
       gsl_vector_set(*v, 1, 1);
-      gsl_vector_set(*v, 2, 0);  
-      gsl_vector_set(*v, 3, 1);  
+      gsl_vector_set(*v, 2, 0);
+      gsl_vector_set(*v, 3, 1);
       *flag = 1;
     }
   } else if (str_head_grep(fittype, "power") == 0) {
@@ -1594,9 +1593,9 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
     *p = 3;
     if (*v == NULL) {
       *v = gsl_vector_alloc(*p);
-      gsl_vector_set(*v, 0, 0); 
+      gsl_vector_set(*v, 0, 0);
       gsl_vector_set(*v, 1, 1);
-      gsl_vector_set(*v, 2, -1);  
+      gsl_vector_set(*v, 2, -1);
       *flag = 1;
     }
   } else if (str_head_grep(fittype, "lognormal") == 0) {
@@ -1606,16 +1605,15 @@ static void set_fittype(gsl_multifit_function_fdf *f, const char *fittype, size_
     *p = 4;
     if (*v == NULL) {
       *v = gsl_vector_alloc(*p);
-      gsl_vector_set(*v, 0, 0); 
+      gsl_vector_set(*v, 0, 0);
       gsl_vector_set(*v, 1, 1);
-      gsl_vector_set(*v, 2, 1);  
-      gsl_vector_set(*v, 3, 1);  
+      gsl_vector_set(*v, 2, 1);
+      gsl_vector_set(*v, 3, 1);
       *flag = 1;
     }
   } else {
     rb_raise(rb_eRuntimeError, "Unknown fit type (gaussian expected)");
   }
-
 }
 
 /* Singleton method */
@@ -1708,12 +1706,11 @@ static VALUE rb_gsl_multifit_fit(int argc, VALUE *argv, VALUE klass)
   if (flag == 1) gsl_vector_free(v);
   gsl_multifit_fdfsolver_free(solver);
   return rb_ary_new3(4,
-		     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vout),
-		     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr),
-		     rb_float_new(chi2), INT2FIX(dof));
+                     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vout),
+                     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr),
+                     rb_float_new(chi2), INT2FIX(dof));
 }
 
-#ifdef GSL_1_8_LATER
 static VALUE rb_gsl_multifit_linear_est(VALUE module, VALUE xx, VALUE cc, VALUE ccov)
 {
   gsl_vector *x, *c;
@@ -1726,8 +1723,7 @@ static VALUE rb_gsl_multifit_linear_est(VALUE module, VALUE xx, VALUE cc, VALUE
   gsl_multifit_linear_est(x, c, cov, &y, &y_err);
   return rb_ary_new3(2, rb_float_new(y), rb_float_new(y_err));
 }
-#endif
-#ifdef GSL_1_11_LATER
+
 static VALUE rb_gsl_multifit_linear_residuals(int argc, VALUE argv[], VALUE module)
 {
   gsl_vector *y, *c, *r;
@@ -1755,8 +1751,6 @@ static VALUE rb_gsl_multifit_linear_residuals(int argc, VALUE argv[], VALUE modu
   return ret;
 }
 
-#endif
-
 void Init_gsl_multifit(VALUE module)
 {
   VALUE mgsl_multifit;
@@ -1765,34 +1759,34 @@ void Init_gsl_multifit(VALUE module)
 
   mgsl_multifit = rb_define_module_under(module, "MultiFit");
 
-  cgsl_multifit_workspace = rb_define_class_under(mgsl_multifit, "Workspace", 
-						  cGSL_Object);
-  rb_define_singleton_method(cgsl_multifit_workspace, "new", 
-			     rb_gsl_multifit_workspace_new, 2);
-  rb_define_singleton_method(cgsl_multifit_workspace, "alloc", 
-			     rb_gsl_multifit_workspace_new, 2);
-  rb_define_singleton_method(mgsl_multifit, "alloc", 
-			     rb_gsl_multifit_workspace_new, 2);			     
+  cgsl_multifit_workspace = rb_define_class_under(mgsl_multifit, "Workspace",
+                                                  cGSL_Object);
+  rb_define_singleton_method(cgsl_multifit_workspace, "new",
+                             rb_gsl_multifit_workspace_new, 2);
+  rb_define_singleton_method(cgsl_multifit_workspace, "alloc",
+                             rb_gsl_multifit_workspace_new, 2);
+  rb_define_singleton_method(mgsl_multifit, "alloc",
+                             rb_gsl_multifit_workspace_new, 2);
   rb_define_module_function(mgsl_multifit, "linear", rb_gsl_multifit_linear, -1);
   rb_define_module_function(mgsl_multifit, "wlinear", rb_gsl_multifit_wlinear, -1);
 
   cgsl_multifit_solver = rb_define_class_under(mgsl_multifit, "Solver", cGSL_Object);
-  cgsl_multifit_fdfsolver = rb_define_class_under(mgsl_multifit, "FdfSolver", 
-						  cgsl_multifit_solver);
+  cgsl_multifit_fdfsolver = rb_define_class_under(mgsl_multifit, "FdfSolver",
+                                                  cgsl_multifit_solver);
   cgsl_multifit_function_fdf = rb_define_class_under(mgsl_multifit, "Function_fdf",
-						     cGSL_Object);
+                                                     cGSL_Object);
 
   /*****/
 
-  rb_define_singleton_method(cgsl_multifit_fdfsolver, "new", 
-			     rb_gsl_multifit_fdfsolver_new, -1);
-  rb_define_singleton_method(cgsl_multifit_fdfsolver, "alloc", 
-			     rb_gsl_multifit_fdfsolver_new, -1);
+  rb_define_singleton_method(cgsl_multifit_fdfsolver, "new",
+                             rb_gsl_multifit_fdfsolver_new, -1);
+  rb_define_singleton_method(cgsl_multifit_fdfsolver, "alloc",
+                             rb_gsl_multifit_fdfsolver_new, -1);
 
-  rb_define_singleton_method(cgsl_multifit_function_fdf, "new", 
-			     rb_gsl_multifit_function_fdf_new, -1);
-  rb_define_singleton_method(cgsl_multifit_function_fdf, "alloc", 
-			     rb_gsl_multifit_function_fdf_new, -1);
+  rb_define_singleton_method(cgsl_multifit_function_fdf, "new",
+                             rb_gsl_multifit_function_fdf_new, -1);
+  rb_define_singleton_method(cgsl_multifit_function_fdf, "alloc",
+                             rb_gsl_multifit_function_fdf_new, -1);
 
   /*****/
 
@@ -1827,35 +1821,32 @@ void Init_gsl_multifit(VALUE module)
 
   rb_gsl_multifit_define_const(cgsl_multifit_fdfsolver);
 
-  rb_define_method(cgsl_multifit_function_fdf, "set_procs", 
-		   rb_gsl_multifit_function_fdf_set_procs, -1);
-  rb_define_method(cgsl_multifit_function_fdf, "set_data", 
-		   rb_gsl_multifit_function_fdf_set_data, -1);
-  rb_define_method(cgsl_multifit_function_fdf, "params", 
-		   rb_gsl_multifit_function_fdf_params, 0);
+  rb_define_method(cgsl_multifit_function_fdf, "set_procs",
+                   rb_gsl_multifit_function_fdf_set_procs, -1);
+  rb_define_method(cgsl_multifit_function_fdf, "set_data",
+                   rb_gsl_multifit_function_fdf_set_data, -1);
+  rb_define_method(cgsl_multifit_function_fdf, "params",
+                   rb_gsl_multifit_function_fdf_params, 0);
   rb_define_alias(cgsl_multifit_function_fdf, "param", "params");
 
-  rb_define_method(cgsl_multifit_function_fdf, "n", 
-		   rb_gsl_multifit_function_fdf_n, 0);
-  rb_define_method(cgsl_multifit_function_fdf, "set_n", 
-		   rb_gsl_multifit_function_fdf_set_n, 1);
+  rb_define_method(cgsl_multifit_function_fdf, "n",
+                   rb_gsl_multifit_function_fdf_n, 0);
+  rb_define_method(cgsl_multifit_function_fdf, "set_n",
+                   rb_gsl_multifit_function_fdf_set_n, 1);
   rb_define_alias(cgsl_multifit_function_fdf, "n=", "set_n");
-  rb_define_method(cgsl_multifit_function_fdf, "p", 
-		   rb_gsl_multifit_function_fdf_p, 0);
+  rb_define_method(cgsl_multifit_function_fdf, "p",
+                   rb_gsl_multifit_function_fdf_p, 0);
   rb_define_alias(cgsl_multifit_function_fdf, "np", "p");
 
   /*****/
   rb_define_singleton_method(cgsl_multifit_fdfsolver, "fit", rb_gsl_multifit_fit, -1);
 
   /***/
-#ifdef GSL_1_8_LATER
   rb_define_module_function(mgsl_multifit, "linear_est", rb_gsl_multifit_linear_est, 3);
   rb_define_module_function(module, "multifit_linear_est", rb_gsl_multifit_linear_est, 3);
-#endif
-#ifdef GSL_1_11_LATER
+
   rb_define_module_function(mgsl_multifit, "linear_residuals", rb_gsl_multifit_linear_residuals, -1);
   rb_define_module_function(module, "multifit_linear_residuals", rb_gsl_multifit_linear_residuals, -1);
-#endif
 
 #ifdef HAVE_NDLINEAR_GSL_MULTIFIT_NDLINEAR_H
   Init_ndlinear(mgsl_multifit);
diff --git a/ext/gsl/multimin.c b/ext/gsl_native/multimin.c
similarity index 90%
rename from ext/gsl/multimin.c
rename to ext/gsl_native/multimin.c
index bdbcdbc..60aa966 100644
--- a/ext/gsl/multimin.c
+++ b/ext/gsl_native/multimin.c
@@ -15,17 +15,17 @@
 #include <gsl/gsl_multimin.h>
 
 #ifndef CHECK_MULTIMIN_FUNCTION
-#define CHECK_MULTIMIN_FUNCTION(x) if(CLASS_OF(x)!=cgsl_multimin_function)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::MultiMin::Function expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_MULTIMIN_FUNCTION(x) if(CLASS_OF(x)!=cgsl_multimin_function) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::MultiMin::Function expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifndef CHECK_MULTIMIN_FUNCTION_FDF
-#define CHECK_MULTIMIN_FUNCTION_FDF(x) if(CLASS_OF(x)!=cgsl_multimin_function_fdf)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::MultiMin::Function_fdf expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_MULTIMIN_FUNCTION_FDF(x) if(CLASS_OF(x)!=cgsl_multimin_function_fdf) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::MultiMin::Function_fdf expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 VALUE cgsl_multimin_function_fdf;  /* Used also in multimin_fsdf.c */
@@ -37,18 +37,12 @@ enum {
   GSL_FDFMINIMIZER_VECTOR_BFGS,
   GSL_FDFMINIMIZER_STEEPEST_DESCENT,
   GSL_FMINIMIZER_NMSIMPLEX,
-#ifdef GSL_1_9_LATER
   GSL_FDFMINIMIZER_VECTOR_BFGS2,
-#endif
-#ifdef GSL_1_13_LATER
   GSL_FMINIMIZER_NMSIMPLEX2RAND,
-#endif
 };
 
 static const gsl_multimin_fdfminimizer_type* get_fdfminimizer_type(VALUE t);
-#ifdef GSL_1_3_LATER
 static const gsl_multimin_fminimizer_type* get_fminimizer_type(VALUE t);
-#endif
 static void define_const();
 
 static void gsl_multimin_function_free(gsl_multimin_function *f);
@@ -57,11 +51,11 @@ static void set_function(int i, VALUE *argv, gsl_multimin_function *F);
 
 static void gsl_multimin_function_fdf_free(gsl_multimin_function_fdf *f);
 
-double rb_gsl_multimin_function_fdf_f(const gsl_vector *x, void *p); 
-void rb_gsl_multimin_function_fdf_df(const gsl_vector *x, void *p, 
-					   gsl_vector *g);
-void rb_gsl_multimin_function_fdf_fdf(const gsl_vector *x, void *p, 
-					    double *f, gsl_vector *g);
+double rb_gsl_multimin_function_fdf_f(const gsl_vector *x, void *p);
+void rb_gsl_multimin_function_fdf_df(const gsl_vector *x, void *p,
+                                     gsl_vector *g);
+void rb_gsl_multimin_function_fdf_fdf(const gsl_vector *x, void *p,
+                                      double *f, gsl_vector *g);
 static void set_function_fdf(int i, VALUE *argv, gsl_multimin_function_fdf *F);
 
 /*** multimin_funcion ***/
@@ -148,10 +142,10 @@ static void set_function(int i, VALUE *argv, gsl_multimin_function *F)
   VALUE ary;
   ary = (VALUE) F->params;
   if (TYPE(argv[i]) == T_FIXNUM) F->n = FIX2INT(argv[i]);
-  else if (rb_obj_is_kind_of(argv[i], rb_cProc)) 
+  else if (rb_obj_is_kind_of(argv[i], rb_cProc))
     rb_ary_store(ary, 0, argv[i]);
   else if (TYPE(argv[i]) == T_ARRAY || rb_obj_is_kind_of(argv[i], cgsl_vector)
-		|| TYPE(argv[i]) == T_FIXNUM || TYPE(argv[i]) == T_FLOAT) {
+           || TYPE(argv[i]) == T_FIXNUM || TYPE(argv[i]) == T_FLOAT) {
     rb_ary_store(ary, 1, argv[i]);
   } else {
     rb_raise(rb_eTypeError, "wrong type of argument %d (Fixnum or Proc)", i);
@@ -268,8 +262,8 @@ static void set_function_fdf(int argc, VALUE *argv, gsl_multimin_function_fdf *F
       F->n = FIX2INT(argv[2]);
       rb_ary_store(ary, 2, Qnil);
     } else {
-			rb_ary_store(ary, 2, argv[2]);
-		}
+      rb_ary_store(ary, 2, argv[2]);
+    }
     break;
   case 4:
   case 5:
@@ -316,8 +310,8 @@ static VALUE rb_gsl_multimin_function_fdf_set_procs(int argc, VALUE *argv, VALUE
       F->n = FIX2INT(argv[2]);
       rb_ary_store(ary, 2, Qnil);
     } else {
-			rb_ary_store(ary, 2, argv[2]);
-		}
+      rb_ary_store(ary, 2, argv[2]);
+    }
     break;
   case 4:
   case 5:
@@ -355,7 +349,7 @@ static VALUE rb_gsl_multimin_function_fdf_set_params(int argc, VALUE *argv, VALU
     ary = (VALUE) F->params;
   }
   if (argc == 1) {
-		rb_ary_store(ary, 3, argv[0]);
+    rb_ary_store(ary, 3, argv[0]);
   } else {
     ary2 = rb_ary_new2(argc);
     for (i = 0; (int) i < argc; i++) rb_ary_store(ary2, i, argv[i]);
@@ -384,8 +378,8 @@ double rb_gsl_multimin_function_fdf_f(const gsl_vector *x, void *p)
   return NUM2DBL(result);
 }
 
-void rb_gsl_multimin_function_fdf_df(const gsl_vector *x, void *p, 
-				     gsl_vector *g)
+void rb_gsl_multimin_function_fdf_df(const gsl_vector *x, void *p,
+                                     gsl_vector *g)
 {
   VALUE vx, vg, proc, vp, ary;
   vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
@@ -400,8 +394,8 @@ void rb_gsl_multimin_function_fdf_df(const gsl_vector *x, void *p,
   }
 }
 
-void rb_gsl_multimin_function_fdf_fdf(const gsl_vector *x, void *p, 
-				      double *f, gsl_vector *g)
+void rb_gsl_multimin_function_fdf_fdf(const gsl_vector *x, void *p,
+                                      double *f, gsl_vector *g)
 {
   VALUE vx, vg, proc_f, proc_df, vp, ary, result;
   vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
@@ -431,26 +425,20 @@ static VALUE rb_gsl_multimin_function_fdf_params(VALUE obj)
 
 static void define_const(VALUE klass1, VALUE klass2)
 {
-  rb_define_const(klass1, 
-		  "CONJUGATE_FR", INT2FIX(GSL_FDFMINIMIZER_CONJUGATE_FR));
-  rb_define_const(klass1, 
-		  "CONJUGATE_PR", INT2FIX(GSL_FDFMINIMIZER_CONJUGATE_PR));
-  rb_define_const(klass1, 
-		  "VECTOR_BFGS", INT2FIX(GSL_FDFMINIMIZER_VECTOR_BFGS));  
-  rb_define_const(klass1, 
-		  "STEEPEST_DESCENT", INT2FIX(GSL_FDFMINIMIZER_STEEPEST_DESCENT));
-#ifdef GSL_1_3_LATER
-  rb_define_const(klass2, 
-		  "NMSIMPLEX", INT2FIX(GSL_FMINIMIZER_NMSIMPLEX));
-#endif
-#ifdef GSL_1_9_LATER
-  rb_define_const(klass1, 
-		  "VECTOR_BFGS2", INT2FIX(GSL_FDFMINIMIZER_VECTOR_BFGS2));
-#endif
-#ifdef GSL_1_13_LATER
-  rb_define_const(klass2, 
-		  "NMSIMPLEX2RAND", INT2FIX(GSL_FMINIMIZER_NMSIMPLEX2RAND));
-#endif
+  rb_define_const(klass1,
+                  "CONJUGATE_FR", INT2FIX(GSL_FDFMINIMIZER_CONJUGATE_FR));
+  rb_define_const(klass1,
+                  "CONJUGATE_PR", INT2FIX(GSL_FDFMINIMIZER_CONJUGATE_PR));
+  rb_define_const(klass1,
+                  "VECTOR_BFGS", INT2FIX(GSL_FDFMINIMIZER_VECTOR_BFGS));
+  rb_define_const(klass1,
+                  "STEEPEST_DESCENT", INT2FIX(GSL_FDFMINIMIZER_STEEPEST_DESCENT));
+  rb_define_const(klass2,
+                  "NMSIMPLEX", INT2FIX(GSL_FMINIMIZER_NMSIMPLEX));
+  rb_define_const(klass1,
+                  "VECTOR_BFGS2", INT2FIX(GSL_FDFMINIMIZER_VECTOR_BFGS2));
+  rb_define_const(klass2,
+                  "NMSIMPLEX2RAND", INT2FIX(GSL_FMINIMIZER_NMSIMPLEX2RAND));
 }
 
 static const gsl_multimin_fdfminimizer_type* get_fdfminimizer_type(VALUE t)
@@ -459,18 +447,16 @@ static const gsl_multimin_fdfminimizer_type* get_fdfminimizer_type(VALUE t)
   switch (TYPE(t)) {
   case T_STRING:
     strcpy(name, STR2CSTR(t));
-    if (str_tail_grep(name, "conjugate_fr") == 0) 
+    if (str_tail_grep(name, "conjugate_fr") == 0)
       return gsl_multimin_fdfminimizer_conjugate_fr;
-    else if (str_tail_grep(name, "conjugate_pr") == 0) 
+    else if (str_tail_grep(name, "conjugate_pr") == 0)
       return gsl_multimin_fdfminimizer_conjugate_pr;
-    else if (str_tail_grep(name, "vector_bfgs") == 0) 
+    else if (str_tail_grep(name, "vector_bfgs") == 0)
       return gsl_multimin_fdfminimizer_vector_bfgs;
-    else if (str_tail_grep(name, "steepest_descent") == 0) 
+    else if (str_tail_grep(name, "steepest_descent") == 0)
       return gsl_multimin_fdfminimizer_steepest_descent;
-#ifdef GSL_1_9_LATER
-    else if (str_tail_grep(name, "vector_bfgs2") == 0) 
+    else if (str_tail_grep(name, "vector_bfgs2") == 0)
       return gsl_multimin_fdfminimizer_vector_bfgs2;
-#endif
     else
       rb_raise(rb_eTypeError, "%s: unknown minimizer type", name);
     break;
@@ -484,10 +470,8 @@ static const gsl_multimin_fdfminimizer_type* get_fdfminimizer_type(VALUE t)
       return gsl_multimin_fdfminimizer_vector_bfgs; break;
     case GSL_FDFMINIMIZER_STEEPEST_DESCENT:
       return gsl_multimin_fdfminimizer_steepest_descent; break;
-#ifdef GSL_1_9_LATER
     case GSL_FDFMINIMIZER_VECTOR_BFGS2:
       return gsl_multimin_fdfminimizer_vector_bfgs2; break;
-#endif      
     default:
       rb_raise(rb_eTypeError, "%d: unknown type", FIX2INT(t));
       break;
@@ -508,8 +492,8 @@ static VALUE rb_gsl_fdfminimizer_new(VALUE klass, VALUE t, VALUE n)
   return Data_Wrap_Struct(klass, 0, gsl_multimin_fdfminimizer_free, gmf);
 }
 
-static VALUE rb_gsl_fdfminimizer_set(VALUE obj, VALUE ff, VALUE xx, VALUE ss, 
-				     VALUE tt)
+static VALUE rb_gsl_fdfminimizer_set(VALUE obj, VALUE ff, VALUE xx, VALUE ss,
+                                     VALUE tt)
 {
   gsl_multimin_fdfminimizer *gmf = NULL;
   gsl_multimin_function_fdf *F = NULL;
@@ -601,7 +585,6 @@ static VALUE rb_gsl_multimin_test_gradient(VALUE obj, VALUE gg, VALUE ea)
 }
 
 /*****/
-#ifdef GSL_1_3_LATER
 static const gsl_multimin_fminimizer_type* get_fminimizer_type(VALUE t)
 {
   char name[64];
@@ -609,12 +592,10 @@ static const gsl_multimin_fminimizer_type* get_fminimizer_type(VALUE t)
   switch (TYPE(t)) {
   case T_STRING:
     strcpy(name, STR2CSTR(t));
-    if (str_tail_grep(name, "nmsimplex") == 0) 
+    if (str_tail_grep(name, "nmsimplex") == 0)
       return gsl_multimin_fminimizer_nmsimplex;
-#ifdef GSL_1_13_LATER
-    if (str_tail_grep(name, "nmsimplex2rand") == 0) 
+    if (str_tail_grep(name, "nmsimplex2rand") == 0)
       return gsl_multimin_fminimizer_nmsimplex2rand;
-#endif
     else
       rb_raise(rb_eTypeError, "unknown type %s (nmsimplex and nmsimplex2rand supported)", name);
     break;
@@ -622,10 +603,8 @@ static const gsl_multimin_fminimizer_type* get_fminimizer_type(VALUE t)
     switch (FIX2INT(t)) {
     case GSL_FMINIMIZER_NMSIMPLEX:
       return gsl_multimin_fminimizer_nmsimplex; break;
-#ifdef GSL_1_13_LATER
     case GSL_FMINIMIZER_NMSIMPLEX2RAND:
       return gsl_multimin_fminimizer_nmsimplex2rand; break;
-#endif
     default:
       rb_raise(rb_eTypeError, "%d: unknown type (not supported)", FIX2INT(t));
       break;
@@ -633,7 +612,7 @@ static const gsl_multimin_fminimizer_type* get_fminimizer_type(VALUE t)
     break;
   default:
     rb_raise(rb_eTypeError, "wrong argument type %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(t)));
+             rb_class2name(CLASS_OF(t)));
     break;
   }
 }
@@ -720,8 +699,6 @@ static VALUE rb_gsl_multimin_test_size(VALUE obj, VALUE ss, VALUE ea)
   return INT2FIX(gsl_multimin_test_size(NUM2DBL(ss), NUM2DBL(ea)));
 }
 
-#endif
-
 #ifdef HAVE_GSL_GSL_MULTIMIN_FSDF_H
 void Init_multimin_fsdf(VALUE module);
 #endif
@@ -735,18 +712,16 @@ void Init_gsl_multimin(VALUE module)
 
   mgsl_multimin = rb_define_module_under(module, "MultiMin");
   rb_define_singleton_method(mgsl_multimin, "test_gradient", rb_gsl_multimin_test_gradient, 2);
-#ifdef GSL_1_3_LATER
   rb_define_singleton_method(mgsl_multimin, "test_size", rb_gsl_multimin_test_size, 2);
-#endif
 
   cgsl_multimin_fdfminimizer = rb_define_class_under(mgsl_multimin, "FdfMinimizer", cGSL_Object);
   cgsl_multimin_fminimizer = rb_define_class_under(mgsl_multimin, "FMinimizer", cGSL_Object);
   define_const(cgsl_multimin_fdfminimizer, cgsl_multimin_fminimizer);
 
   cgsl_multimin_function = rb_define_class_under(mgsl_multimin, "Function",
-						  cgsl_function);
+                                                 cgsl_function);
   rb_define_singleton_method(cgsl_multimin_function, "alloc",
-			     rb_gsl_multimin_function_new, -1);
+                             rb_gsl_multimin_function_new, -1);
   rb_define_method(cgsl_multimin_function, "eval", rb_gsl_multimin_function_eval, 1);
   rb_define_alias(cgsl_multimin_function, "call", "eval");
   rb_define_method(cgsl_multimin_function, "set_proc", rb_gsl_multimin_function_set_f, -1);
@@ -756,9 +731,9 @@ void Init_gsl_multimin(VALUE module)
   rb_define_method(cgsl_multimin_function, "n", rb_gsl_multimin_function_n, 0);
 
   cgsl_multimin_function_fdf = rb_define_class_under(mgsl_multimin, "Function_fdf",
-						     cGSL_Object);
+                                                     cGSL_Object);
   rb_define_singleton_method(cgsl_multimin_function_fdf, "alloc",
-			     rb_gsl_multimin_function_fdf_new, -1);
+                             rb_gsl_multimin_function_fdf_new, -1);
 
   rb_define_method(cgsl_multimin_function_fdf, "set", rb_gsl_multimin_function_fdf_set, -1);
   rb_define_method(cgsl_multimin_function_fdf, "set_params", rb_gsl_multimin_function_fdf_set_params, -1);
@@ -779,7 +754,6 @@ void Init_gsl_multimin(VALUE module)
   rb_define_method(cgsl_multimin_fdfminimizer, "test_gradient", rb_gsl_fdfminimizer_test_gradient, 1);
 
   /*****/
-#ifdef GSL_1_3_LATER
   rb_define_singleton_method(cgsl_multimin_fminimizer, "alloc", rb_gsl_fminimizer_new, 2);
 
   rb_define_method(cgsl_multimin_fminimizer, "set", rb_gsl_fminimizer_set, 3);
@@ -787,14 +761,12 @@ void Init_gsl_multimin(VALUE module)
   rb_define_method(cgsl_multimin_fminimizer, "iterate", rb_gsl_fminimizer_iterate, 0);
   rb_define_method(cgsl_multimin_fminimizer, "x", rb_gsl_fminimizer_x, 0);
   rb_define_method(cgsl_multimin_fminimizer, "fval", rb_gsl_fminimizer_fval, 0);
-  rb_define_method(cgsl_multimin_fminimizer, "minimum", rb_gsl_fminimizer_minimum, 0);  
-    rb_define_method(cgsl_multimin_fminimizer, "size", rb_gsl_fminimizer_size, 0);
+  rb_define_method(cgsl_multimin_fminimizer, "minimum", rb_gsl_fminimizer_minimum, 0);
+  rb_define_method(cgsl_multimin_fminimizer, "size", rb_gsl_fminimizer_size, 0);
   rb_define_method(cgsl_multimin_fminimizer, "test_size", rb_gsl_fminimizer_test_size, 1);
-#endif
-
 
 #ifdef HAVE_GSL_GSL_MULTIMIN_FSDF_H
-	Init_multimin_fsdf(mgsl_multimin);
+  Init_multimin_fsdf(mgsl_multimin);
 #endif
 }
 #ifdef CHECK_MULTIMIN_FUNCTION
diff --git a/ext/gsl/multimin_fsdf.c b/ext/gsl_native/multimin_fsdf.c
similarity index 88%
rename from ext/gsl/multimin_fsdf.c
rename to ext/gsl_native/multimin_fsdf.c
index 0c9123d..723ceef 100644
--- a/ext/gsl/multimin_fsdf.c
+++ b/ext/gsl_native/multimin_fsdf.c
@@ -4,10 +4,10 @@
 
 static VALUE cfsdf;
 #ifndef CHECK_MULTIMIN_FUNCTION_FSDF
-#define CHECK_MULTIMIN_FUNCTION_FSDF(x) if(CLASS_OF(x)!=cfsdf)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::MultiMin::Function_fsdf expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_MULTIMIN_FUNCTION_FSDF(x) if(CLASS_OF(x)!=cfsdf) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::MultiMin::Function_fsdf expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 extern VALUE cgsl_multimin_function_fdf;
 
@@ -17,7 +17,7 @@ static const gsl_multimin_fsdfminimizer_type* get_fsdfminimizer_type(VALUE t)
   switch (TYPE(t)) {
   case T_STRING:
     strcpy(name, STR2CSTR(t));
-    if (strcmp(name, "bundle") == 0 || strcmp(name, "bundle_method") == 0) 
+    if (strcmp(name, "bundle") == 0 || strcmp(name, "bundle_method") == 0)
       return gsl_multimin_fsdfminimizer_bundle_method;
     else
       rb_raise(rb_eTypeError, "%s: unknown minimizer type", name);
@@ -42,13 +42,13 @@ static VALUE rb_gsl_fsdfminimizer_set(VALUE obj, VALUE ff, VALUE xx, VALUE ss)
   gsl_multimin_fsdfminimizer *gmf = NULL;
   gsl_multimin_function_fsdf *F = NULL;
   gsl_vector *x;
-	size_t bundle_size;
+  size_t bundle_size;
   int status;
   CHECK_MULTIMIN_FUNCTION_FSDF(ff);
   Data_Get_Struct(obj, gsl_multimin_fsdfminimizer, gmf);
   Data_Get_Struct(ff, gsl_multimin_function_fsdf, F);
   Data_Get_Vector(xx, x);
-	bundle_size = (size_t) FIX2INT(ss);
+  bundle_size = (size_t) FIX2INT(ss);
   status = gsl_multimin_fsdfminimizer_set(gmf, F, x, bundle_size);
   return INT2FIX(status);
 }
@@ -134,12 +134,12 @@ static VALUE rb_gsl_fsdfminimizer_eps(VALUE obj)
 
 void Init_multimin_fsdf(VALUE module)
 {
-	VALUE cmin;
-	
-	cmin = rb_define_class_under(module, "FsdfMinimizer",  cGSL_Object);
-	cfsdf = rb_define_class_under(module, "Function_fsdf", cgsl_multimin_function_fdf);
-	
-	rb_define_singleton_method(cmin, "alloc", rb_gsl_fsdfminimizer_alloc, 2);
+  VALUE cmin;
+
+  cmin = rb_define_class_under(module, "FsdfMinimizer",  cGSL_Object);
+  cfsdf = rb_define_class_under(module, "Function_fsdf", cgsl_multimin_function_fdf);
+
+  rb_define_singleton_method(cmin, "alloc", rb_gsl_fsdfminimizer_alloc, 2);
   rb_define_method(cmin, "set", rb_gsl_fsdfminimizer_set, 3);
   rb_define_method(cmin, "name", rb_gsl_fsdfminimizer_name, 0);
   rb_define_method(cmin, "iterate", rb_gsl_fsdfminimizer_iterate, 0);
@@ -149,8 +149,8 @@ void Init_multimin_fsdf(VALUE module)
   rb_define_method(cmin, "minimum", rb_gsl_fsdfminimizer_minimum, 0);
   rb_define_method(cmin, "restart", rb_gsl_fsdfminimizer_restart, 0);
   rb_define_method(cmin, "test_gradient", rb_gsl_fsdfminimizer_test_gradient, 1);
-  rb_define_method(cmin, "test_convergence", rb_gsl_fsdfminimizer_test_convergence, 1);  
-  rb_define_method(cmin, "eps", rb_gsl_fsdfminimizer_eps, 0);	
+  rb_define_method(cmin, "test_convergence", rb_gsl_fsdfminimizer_test_convergence, 1);
+  rb_define_method(cmin, "eps", rb_gsl_fsdfminimizer_eps, 0);
 }
 
 #endif
diff --git a/ext/gsl/multiroots.c b/ext/gsl_native/multiroots.c
similarity index 91%
rename from ext/gsl/multiroots.c
rename to ext/gsl_native/multiroots.c
index 9e62b2d..45675aa 100644
--- a/ext/gsl/multiroots.c
+++ b/ext/gsl_native/multiroots.c
@@ -15,17 +15,17 @@
 #include <gsl/gsl_multiroots.h>
 
 #ifndef CHECK_MULTIROOT_FUNCTION
-#define CHECK_MULTIROOT_FUNCTION(x) if(CLASS_OF(x)!=cgsl_multiroot_function)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::MultiRoot::Function expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_MULTIROOT_FUNCTION(x) if(CLASS_OF(x)!=cgsl_multiroot_function) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::MultiRoot::Function expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifndef CHECK_MULTIROOT_FUNCTION_FDF
-#define CHECK_MULTIROOT_FUNCTION_FDF(x) if(CLASS_OF(x)!=cgsl_multiroot_function_fdf)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::MultiRoot::Function_fdf expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_MULTIROOT_FUNCTION_FDF(x) if(CLASS_OF(x)!=cgsl_multiroot_function_fdf) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::MultiRoot::Function_fdf expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 static VALUE cgsl_multiroot_function;
@@ -49,12 +49,12 @@ static int rb_gsl_multiroot_function_f(const gsl_vector *x, void *p, gsl_vector
 static void set_function(int i, VALUE *argv, gsl_multiroot_function *F);
 
 static void gsl_multiroot_function_fdf_free(gsl_multiroot_function_fdf *f);
-static int rb_gsl_multiroot_function_fdf_f(const gsl_vector *x, void *p, 
-					   gsl_vector *f);
-static int rb_gsl_multiroot_function_fdf_df(const gsl_vector *x, void *p, 
-					    gsl_matrix *J);
-static int rb_gsl_multiroot_function_fdf_fdf(const gsl_vector *x, void *p, 
-					     gsl_vector *f, gsl_matrix *J);
+static int rb_gsl_multiroot_function_fdf_f(const gsl_vector *x, void *p,
+                                           gsl_vector *f);
+static int rb_gsl_multiroot_function_fdf_df(const gsl_vector *x, void *p,
+                                            gsl_matrix *J);
+static int rb_gsl_multiroot_function_fdf_fdf(const gsl_vector *x, void *p,
+                                             gsl_vector *f, gsl_matrix *J);
 static void set_function_fdf(int i, VALUE *argv, gsl_multiroot_function_fdf *F);
 static const gsl_multiroot_fsolver_type* get_fsolver_type(VALUE t);
 static const gsl_multiroot_fdfsolver_type* get_fdfsolver_type(VALUE t);
@@ -98,8 +98,8 @@ static void gsl_multiroot_function_mark(gsl_multiroot_function *f)
 {
   size_t i;
   rb_gc_mark((VALUE) f->params);
-  //  for (i = 0; i < RARRAY(f->params)->len; i++) 
-  for (i = 0; (int) i < RARRAY_LEN(f->params); i++) 
+  //  for (i = 0; i < RARRAY(f->params)->len; i++)
+  for (i = 0; (int) i < RARRAY_LEN(f->params); i++)
     rb_gc_mark(rb_ary_entry((VALUE) f->params, i));
 }
 
@@ -137,10 +137,10 @@ static void set_function(int i, VALUE *argv, gsl_multiroot_function *F)
   VALUE ary;
   ary = (VALUE) F->params;
   if (TYPE(argv[i]) == T_FIXNUM) F->n = FIX2INT(argv[i]);
-  else if (rb_obj_is_kind_of(argv[i], rb_cProc)) 
+  else if (rb_obj_is_kind_of(argv[i], rb_cProc))
     rb_ary_store(ary, 0, argv[i]);
   else if (TYPE(argv[i]) == T_ARRAY || rb_obj_is_kind_of(argv[i], cgsl_vector)
-		|| TYPE(argv[i]) == T_FIXNUM || TYPE(argv[i]) == T_FLOAT) {
+           || TYPE(argv[i]) == T_FIXNUM || TYPE(argv[i]) == T_FLOAT) {
     rb_ary_store(ary, 1, argv[i]);
   } else {
     rb_raise(rb_eTypeError, "wrong type of argument %d (Fixnum or Proc)", i);
@@ -235,8 +235,8 @@ static void gsl_multiroot_function_fdf_mark(gsl_multiroot_function_fdf *f)
 {
   size_t i;
   rb_gc_mark((VALUE) f->params);
-  //  for (i = 0; i < RARRAY(f->params)->len; i++) 
-  for (i = 0; (int) i < RARRAY_LEN(f->params); i++) 
+  //  for (i = 0; i < RARRAY(f->params)->len; i++)
+  for (i = 0; (int) i < RARRAY_LEN(f->params); i++)
     rb_gc_mark(rb_ary_entry((VALUE) f->params, i));
 }
 
@@ -336,8 +336,8 @@ static VALUE rb_gsl_multiroot_function_fdf_set(int argc, VALUE *argv, VALUE obj)
   return obj;
 }
 
-static int rb_gsl_multiroot_function_fdf_f(const gsl_vector *x, void *p, 
-					   gsl_vector *f)
+static int rb_gsl_multiroot_function_fdf_f(const gsl_vector *x, void *p,
+                                           gsl_vector *f)
 {
   VALUE vx, vf, ary;
   VALUE proc, vp;
@@ -351,8 +351,8 @@ static int rb_gsl_multiroot_function_fdf_f(const gsl_vector *x, void *p,
   return GSL_SUCCESS;
 }
 
-static int rb_gsl_multiroot_function_fdf_df(const gsl_vector *x, void *p, 
-					    gsl_matrix *J)
+static int rb_gsl_multiroot_function_fdf_df(const gsl_vector *x, void *p,
+                                            gsl_matrix *J)
 {
   VALUE vx, vJ, ary;
   VALUE proc, vp;
@@ -366,8 +366,8 @@ static int rb_gsl_multiroot_function_fdf_df(const gsl_vector *x, void *p,
   return GSL_SUCCESS;
 }
 
-static int rb_gsl_multiroot_function_fdf_fdf(const gsl_vector *x, void *p, 
-					     gsl_vector *f, gsl_matrix *J)
+static int rb_gsl_multiroot_function_fdf_fdf(const gsl_vector *x, void *p,
+                                             gsl_vector *f, gsl_matrix *J)
 {
   VALUE vx, vf, vJ, ary;
   VALUE proc_f, proc_df, proc_fdf, vp;
@@ -671,8 +671,8 @@ static VALUE rb_gsl_multiroot_fdfsolver_test_residual(VALUE obj, VALUE ea)
   return INT2FIX(gsl_multiroot_test_residual(s->f, NUM2DBL(ea)));
 }
 
-static VALUE rb_gsl_multiroot_test_delta(VALUE obj, VALUE vdx, VALUE vx, 
-					 VALUE ea, VALUE er)
+static VALUE rb_gsl_multiroot_test_delta(VALUE obj, VALUE vdx, VALUE vx,
+                                         VALUE ea, VALUE er)
 {
   gsl_vector *dx = NULL, *x = NULL;
   Need_Float(ea); Need_Float(er);
@@ -717,22 +717,21 @@ static VALUE rb_gsl_multiroot_fsolver_fsolve(int argc, VALUE *argv, VALUE obj)
       break;
     default:
       rb_raise(rb_eTypeError, "wrong type of argument %s (Fixnum or Float expected)",
-	       rb_class2name(CLASS_OF(argv[i])));
+               rb_class2name(CLASS_OF(argv[i])));
       break;
     }
   }
-  
   do {
-    iter ++;
+    iter++;
     status = gsl_multiroot_fsolver_iterate (s);
     if (status) break;
     status = gsl_multiroot_test_residual(s->f, eps);
   } while (status == GSL_CONTINUE && iter < max_iter);
   xnew = gsl_vector_alloc(s->x->size);
   gsl_vector_memcpy(xnew, gsl_multiroot_fsolver_root(s));
-  return rb_ary_new3(3, 
-		     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew),
-		     INT2FIX(iter), INT2FIX(status));
+  return rb_ary_new3(3,
+                     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew),
+                     INT2FIX(iter), INT2FIX(status));
 }
 
 /* singleton */
@@ -746,7 +745,6 @@ static VALUE rb_gsl_multiroot_fdjacobian(int argc, VALUE *argv, VALUE obj)
   int status;
   if (argc != 4 && argc != 5)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 4 or 5)", argc);
-
   if (rb_obj_is_kind_of(argv[0], cgsl_multiroot_function_fdf)) {
     Data_Get_Struct(argv[0], gsl_multiroot_function_fdf, fdf);
     func.f = fdf->f;
@@ -758,7 +756,6 @@ static VALUE rb_gsl_multiroot_fdjacobian(int argc, VALUE *argv, VALUE obj)
   } else {
     rb_raise(rb_eArgError, "wrong argument type %s (MultiRoot::Function or MultiRoot::Function_fdf expected)", rb_class2name(CLASS_OF(argv[0])));
   }
-
   Need_Float(argv[3]);
   Data_Get_Vector(argv[1], x);
   Data_Get_Vector(argv[2], f);
@@ -767,7 +764,7 @@ static VALUE rb_gsl_multiroot_fdjacobian(int argc, VALUE *argv, VALUE obj)
     J = gsl_matrix_alloc(F->n, F->n);
     status = gsl_multiroot_fdjacobian(F, x, f, eps, J);
     return rb_ary_new3(2, Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, J),
-		       INT2FIX(status));
+                       INT2FIX(status));
   } else {
     Data_Get_Struct(argv[4], gsl_matrix, J);
     status = gsl_multiroot_fdjacobian(F, x, f, eps, J);
@@ -803,7 +800,7 @@ static VALUE rb_gsl_multiroot_function_solve(int argc, VALUE *argv, VALUE obj)
   int flag = 0;
   double epsabs = 1e-7;
   size_t max_iter = 10000, iter = 0, i;
-  gsl_multiroot_fsolver_type *T 
+  gsl_multiroot_fsolver_type *T
     = (gsl_multiroot_fsolver_type *) gsl_multiroot_fsolver_hybrids;
   gsl_multiroot_fsolver *s = NULL;
   int status;
@@ -816,25 +813,25 @@ static VALUE rb_gsl_multiroot_function_solve(int argc, VALUE *argv, VALUE obj)
     for (i = 1; (int) i < argc; i++) {
       switch (TYPE(argv[i])) {
       case T_STRING:
-	T = (gsl_multiroot_fsolver_type *) get_fsolver_type(argv[i]);
-	break;
+        T = (gsl_multiroot_fsolver_type *) get_fsolver_type(argv[i]);
+        break;
       case T_FLOAT:
-	epsabs = NUM2DBL(argv[i]);
-	break;	
+        epsabs = NUM2DBL(argv[i]);
+        break;
       case T_FIXNUM:
-	max_iter = FIX2INT(argv[i]);
-	break;
+        max_iter = FIX2INT(argv[i]);
+        break;
       }
     }
-    /* no break */
+  /* no break */
   case 1:
     if (TYPE(argv[0]) == T_ARRAY) {
       //      if (RARRAY(argv[0])->len != F->n)
       if (RARRAY_LEN(argv[0]) != (int) F->n)
-	rb_raise(rb_eRangeError, "array size are different.");
+        rb_raise(rb_eRangeError, "array size are different.");
       x0 = gsl_vector_alloc(F->n);
-      for (i = 0; i < x0->size; i++) 
-	gsl_vector_set(x0, i, NUM2DBL(rb_ary_entry(argv[0], i)));
+      for (i = 0; i < x0->size; i++)
+        gsl_vector_set(x0, i, NUM2DBL(rb_ary_entry(argv[0], i)));
       flag = 1;
     } else {
       Data_Get_Vector(argv[0], x0);
@@ -858,7 +855,7 @@ static VALUE rb_gsl_multiroot_function_solve(int argc, VALUE *argv, VALUE obj)
   gsl_multiroot_fsolver_free (s);
   if (flag == 1) gsl_vector_free(x0);
   return rb_ary_new3(3, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew),
-		     INT2FIX(iter), INT2FIX(status));
+                     INT2FIX(iter), INT2FIX(status));
 }
 
 void Init_gsl_multiroot(VALUE module)
@@ -868,19 +865,19 @@ void Init_gsl_multiroot(VALUE module)
 
   mgsl_multiroot = rb_define_module_under(module, "MultiRoot");
 
-  rb_define_singleton_method(mgsl_multiroot, "test_delta", 
-			     rb_gsl_multiroot_test_delta, 4);
-  rb_define_singleton_method(mgsl_multiroot, "test_residual", 
-			     rb_gsl_multiroot_test_residual, 2);
+  rb_define_singleton_method(mgsl_multiroot, "test_delta",
+                             rb_gsl_multiroot_test_delta, 4);
+  rb_define_singleton_method(mgsl_multiroot, "test_residual",
+                             rb_gsl_multiroot_test_residual, 2);
 
-  rb_define_singleton_method(mgsl_multiroot, "fdjacobian", 
-			     rb_gsl_multiroot_fdjacobian, -1);
+  rb_define_singleton_method(mgsl_multiroot, "fdjacobian",
+                             rb_gsl_multiroot_fdjacobian, -1);
 
   /* multiroot_function */
   cgsl_multiroot_function = rb_define_class_under(mgsl_multiroot, "Function",
-						  cgsl_function);
+                                                  cgsl_function);
   rb_define_singleton_method(cgsl_multiroot_function, "alloc",
-			     rb_gsl_multiroot_function_new, -1);
+                             rb_gsl_multiroot_function_new, -1);
   rb_define_method(cgsl_multiroot_function, "eval", rb_gsl_multiroot_function_eval, 1);
   rb_define_alias(cgsl_multiroot_function, "call", "eval");
   rb_define_method(cgsl_multiroot_function, "set", rb_gsl_multiroot_function_set_f, -1);
@@ -891,9 +888,9 @@ void Init_gsl_multiroot(VALUE module)
 
   /* multiroot_function_fdf */
   cgsl_multiroot_function_fdf = rb_define_class_under(mgsl_multiroot, "Function_fdf",
-						  cgsl_multiroot_function);
+                                                      cgsl_multiroot_function);
   rb_define_singleton_method(cgsl_multiroot_function_fdf, "alloc",
-			     rb_gsl_multiroot_function_fdf_new, -1);
+                             rb_gsl_multiroot_function_fdf_new, -1);
   rb_define_method(cgsl_multiroot_function_fdf, "set", rb_gsl_multiroot_function_fdf_set, -1);
   rb_define_method(cgsl_multiroot_function_fdf, "set_params", rb_gsl_multiroot_function_fdf_set_params, -1);
   rb_define_method(cgsl_multiroot_function_fdf, "params", rb_gsl_multiroot_function_fdf_params, 0);
@@ -905,10 +902,10 @@ void Init_gsl_multiroot(VALUE module)
   cgsl_multiroot_fsolver = rb_define_class_under(mgsl_multiroot, "FSolver", cGSL_Object);
   cgsl_multiroot_fdfsolver = rb_define_class_under(mgsl_multiroot, "FdfSolver", cgsl_multiroot_fsolver);
 
-  rb_define_singleton_method(cgsl_multiroot_fsolver, "alloc", 
-			     rb_gsl_multiroot_fsolver_new, 2);
-  rb_define_singleton_method(cgsl_multiroot_fdfsolver, "alloc", 
-			     rb_gsl_multiroot_fdfsolver_new, 2);
+  rb_define_singleton_method(cgsl_multiroot_fsolver, "alloc",
+                             rb_gsl_multiroot_fsolver_new, 2);
+  rb_define_singleton_method(cgsl_multiroot_fdfsolver, "alloc",
+                             rb_gsl_multiroot_fdfsolver_new, 2);
 
   rb_define_method(cgsl_multiroot_fsolver, "set", rb_gsl_multiroot_fsolver_set, 2);
   rb_define_method(cgsl_multiroot_fsolver, "name", rb_gsl_multiroot_fsolver_name, 0);
@@ -935,7 +932,7 @@ void Init_gsl_multiroot(VALUE module)
   rb_define_method(cgsl_multiroot_fdfsolver, "test_residual", rb_gsl_multiroot_fdfsolver_test_residual, 1);
 
 
-  multiroot_define_const(cgsl_multiroot_fdfsolver, cgsl_multiroot_fsolver);  
+  multiroot_define_const(cgsl_multiroot_fdfsolver, cgsl_multiroot_fsolver);
 
   rb_define_method(cgsl_multiroot_fsolver, "fsolve", rb_gsl_multiroot_fsolver_fsolve, -1);
   rb_define_alias(cgsl_multiroot_fsolver, "solve", "fsolve");
diff --git a/ext/gsl/multiset.c b/ext/gsl_native/multiset.c
similarity index 99%
rename from ext/gsl/multiset.c
rename to ext/gsl_native/multiset.c
index 9c64bf9..68ab1db 100644
--- a/ext/gsl/multiset.c
+++ b/ext/gsl_native/multiset.c
@@ -1,7 +1,5 @@
 #include "include/rb_gsl.h"
 
-#ifdef GSL_1_14_LATER
-
 VALUE cMultiset;
 
 VALUE rb_gsl_multiset_alloc(VALUE klass, VALUE nn, VALUE kk)
@@ -18,7 +16,7 @@ VALUE rb_gsl_multiset_calloc(VALUE klass, VALUE nn, VALUE kk)
   m = gsl_multiset_alloc(FIX2INT(nn), FIX2INT(kk));
   return Data_Wrap_Struct(klass, 0, gsl_multiset_free, m);
 }
-	
+
 VALUE rb_gsl_multiset_init_first(VALUE mm)
 {
   gsl_multiset *m;
@@ -180,14 +178,14 @@ VALUE rb_gsl_multiset_data2(VALUE mm, VALUE i)
   p = gsl_multiset_data(m);
   return INT2FIX(p[i]);
 }
-		  
+
 void Init_multiset(VALUE module)
 {
   cMultiset = rb_define_class_under(module, "Multiset", cGSL_Object);
   rb_define_singleton_method(cMultiset, "alloc", rb_gsl_multiset_alloc, 2);
   rb_define_singleton_method(cMultiset, "calloc", rb_gsl_multiset_calloc, 2);
   rb_define_singleton_method(cMultiset, "memcpy", rb_gsl_multiset_memcpy, 2);
-  
+
   rb_define_method(cMultiset, "init_first", rb_gsl_multiset_init_first, 0);
   rb_define_method(cMultiset, "init_last", rb_gsl_multiset_init_last, 0);
 
@@ -210,5 +208,3 @@ void Init_multiset(VALUE module)
   rb_define_method(cMultiset, "fscanf", rb_gsl_multiset_fscanf, 1);
 }
 
-#endif
-
diff --git a/ext/gsl/ndlinear.c b/ext/gsl_native/ndlinear.c
similarity index 74%
rename from ext/gsl/ndlinear.c
rename to ext/gsl_native/ndlinear.c
index 5c3a371..92ee1b2 100644
--- a/ext/gsl/ndlinear.c
+++ b/ext/gsl_native/ndlinear.c
@@ -1,321 +1,320 @@
-#include "include/rb_gsl.h"
-
-#ifdef HAVE_NDLINEAR_GSL_MULTIFIT_NDLINEAR_H
-#include <gsl/gsl_math.h>
-#include <gsl/gsl_matrix.h>
-#include <gsl/gsl_vector.h>
-#include <gsl/gsl_multifit.h>
-#include <ndlinear/gsl_multifit_ndlinear.h>
-
-static VALUE cWorkspace;
-
-enum Index_Ndlinear {
-  INDEX_NDIM = 0,
-  INDEX_N = 1,
-  INDEX_PROCS = 2,
-  INDEX_PARAMS = 3,
-  INDEX_FUNCS = 4,
-  INDEX_NDIM_I = 5,  
-  
-  NDLINEAR_ARY_SIZE = 6,
-};
-
-static void multifit_ndlinear_mark(gsl_multifit_ndlinear_workspace *w)
-{
-  rb_gc_mark((VALUE) w->params); 
-}
-
-typedef int (*UFUNC)(double, double[], void*);
-typedef struct ufunc_struct
-{
-  UFUNC *fptr;
-} ufunc_struct;
-
-static VALUE cUFunc;
-static ufunc_struct* ufunc_struct_alloc(size_t n_dim) {
-  ufunc_struct *p;
-  p = (ufunc_struct*) malloc(sizeof(ufunc_struct));
-  p->fptr = malloc(sizeof(UFUNC)*n_dim);  
-  return p;
-}
-static void ufunc_struct_free(ufunc_struct *p)
-{
-  free(p->fptr);
-  free(p);
-}
-
-static int func_u(double x, double y[], void *data);
-static VALUE rb_gsl_multifit_ndlinear_alloc(int argc, VALUE *argv, VALUE klass)
-{
-  gsl_multifit_ndlinear_workspace *w;
-  int istart = 0;
-  size_t n_dim = 0, *N, i;
-  struct ufunc_struct *p;
-  VALUE params, wspace, pp;
-  switch (argc) {
-  case 4:
-    istart = 1;
-    CHECK_FIXNUM(argv[0]);
-    n_dim = FIX2INT(argv[0]);
-    /* no break */
-  case 3:  
-    if (TYPE(argv[istart]) != T_ARRAY) {
-      rb_raise(rb_eTypeError, "Wrong argument type %s (Array expected)",
-        rb_class2name(CLASS_OF(argv[istart])));
-    }
-    if (TYPE(argv[istart+1]) != T_ARRAY) {
-      rb_raise(rb_eTypeError, "Wrong argument type %s (Array expected)",
-        rb_class2name(CLASS_OF(argv[istart+1])));
-    }
-    //    n_dim = RARRAY(argv[istart])->len;
-    n_dim = RARRAY_LEN(argv[istart]);
-    N = (size_t*) malloc(sizeof(size_t)*n_dim);
-    break;
-  default:
-    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
-  }
-  for (i = 0; i < n_dim; i++) {
-    N[i] = FIX2INT(rb_ary_entry(argv[istart], i));
-  }
-
-  params = rb_ary_new2(NDLINEAR_ARY_SIZE);
-  rb_ary_store(params, INDEX_NDIM, INT2FIX((int) n_dim));
-  rb_ary_store(params, INDEX_N, argv[istart]);   /* N */
-  rb_ary_store(params, INDEX_PROCS, argv[istart+1]); /* procs */
-  rb_ary_store(params, INDEX_PARAMS, argv[istart+2]); /* params */  
-  rb_ary_store(params, INDEX_NDIM_I, INT2FIX(0)); /* for the first parameter */    
-  
-  p = ufunc_struct_alloc(n_dim);
-  for (i = 0; i < n_dim; i++) p->fptr[i] = func_u;
-  pp = Data_Wrap_Struct(cUFunc, 0, ufunc_struct_free, p);  
-  rb_ary_store(params, INDEX_FUNCS, pp);  
-
-  w = gsl_multifit_ndlinear_alloc(n_dim, N, p->fptr, (void*) params);
-    
-  free((size_t*) N);
-
-  wspace = Data_Wrap_Struct(cWorkspace, multifit_ndlinear_mark, gsl_multifit_ndlinear_free, w);
-
-  return wspace;
-}
-
-static int func_u(double x, double y[], void *data)
-{
-  VALUE ary, vN, procs, proc, vy, params;
-  gsl_vector_view ytmp;
-  size_t i, n_dim;
-  int rslt;
-  ary = (VALUE) data;
-  n_dim = FIX2INT(rb_ary_entry(ary, INDEX_NDIM));
-  vN = rb_ary_entry(ary, INDEX_N);
-  procs = rb_ary_entry(ary, INDEX_PROCS);
-  params = rb_ary_entry(ary, INDEX_PARAMS);
-  i = FIX2INT(rb_ary_entry(ary, INDEX_NDIM_I));
-  proc = rb_ary_entry(procs, i);
-  
-  ytmp.vector.data = (double*) y;
-  ytmp.vector.stride = 1;
-  ytmp.vector.size = FIX2INT(rb_ary_entry(vN, i));
-  vy = Data_Wrap_Struct(cgsl_vector_view, 0, NULL, &ytmp);
-
-  rslt = rb_funcall((VALUE) proc, RBGSL_ID_call, 3, rb_float_new(x), vy, params);
-
-  /* for the next parameter */
-  i += 1;
-  if (i == n_dim) i = 0;
-  rb_ary_store(ary, INDEX_NDIM_I, INT2FIX(i));
-  
-  return GSL_SUCCESS;
-}
-
-static VALUE rb_gsl_multifit_ndlinear_design(int argc, VALUE *argv, VALUE obj)
-{
-  gsl_multifit_ndlinear_workspace *w;
-  gsl_matrix *vars = NULL, *X = NULL;
-  int argc2, flag = 0, ret;
-  switch (TYPE(obj)) {
-  case T_MODULE:
-  case T_CLASS:
-  case T_OBJECT:
-    if (!rb_obj_is_kind_of(argv[argc-1], cWorkspace)) {
-      rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::MultiFit::Ndlinear::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[argc-1])));
-    }
-    Data_Get_Struct(argv[argc-1], gsl_multifit_ndlinear_workspace, w);
-    argc2 = argc-1;
-    break;
-  default:
-    Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
-    argc2 = argc;
-  }
-  switch (argc2) {
-  case 1:
-      CHECK_MATRIX(argv[0]);
-      Data_Get_Struct(argv[0], gsl_matrix, vars);
-      X = gsl_matrix_alloc(vars->size1, w->n_coeffs);
-      flag = 1;
-      break;
-  case 2:
-      CHECK_MATRIX(argv[0]);
-      CHECK_MATRIX(argv[1]);
-      Data_Get_Struct(argv[0], gsl_matrix, vars);
-      Data_Get_Struct(argv[1], gsl_matrix, X);            
-      break;
-  default:
-      rb_raise(rb_eArgError, "Wrong number of arguments.");
-  }
-  ret = gsl_multifit_ndlinear_design(vars, X, w);
-  
-  if (flag == 1) {
-    return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, X);
-  } else {
-    return INT2FIX(ret);
-  }
-}
-
-static VALUE rb_gsl_multifit_ndlinear_est(int argc, VALUE *argv, VALUE obj)
-{
-  gsl_multifit_ndlinear_workspace *w;
-  gsl_vector *x = NULL, *c = NULL;
-  gsl_matrix *cov = NULL;
-  double y, yerr;
-  int argc2;
-  switch (TYPE(obj)) {
-  case T_MODULE:
-  case T_CLASS:
-  case T_OBJECT:
-    if (!rb_obj_is_kind_of(argv[argc-1], cWorkspace)) {
-      rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::MultiFit::Ndlinear::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[argc-1])));
-    }
-    Data_Get_Struct(argv[argc-1], gsl_multifit_ndlinear_workspace, w);    
-    argc2 = argc-1;
-    break;
-  default:
-    Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
-    argc2 = argc;  
-  }
-  switch (argc2) {
-  case 3:
-    CHECK_VECTOR(argv[0]);
-    CHECK_VECTOR(argv[1]);
-    CHECK_MATRIX(argv[2]);
-    Data_Get_Struct(argv[0], gsl_vector, x);
-    Data_Get_Struct(argv[1], gsl_vector, c);
-    Data_Get_Struct(argv[2], gsl_matrix, cov);   
-    break;
-  default:
-    rb_raise(rb_eArgError, "Wrong number of arguments.");  
-  }
-  gsl_multifit_ndlinear_est(x, c, cov, &y, &yerr, w);
-  return rb_ary_new3(2, rb_float_new(y), rb_float_new(yerr));
-}
-
-static VALUE rb_gsl_multifit_ndlinear_calc(int argc, VALUE *argv, VALUE obj)
-{
-  gsl_multifit_ndlinear_workspace *w;
-  gsl_vector *x = NULL, *c = NULL;
-  double val;
-  int argc2;
-  switch (TYPE(obj)) {
-  case T_MODULE:
-  case T_CLASS:
-  case T_OBJECT:
-    if (!rb_obj_is_kind_of(argv[argc-1], cWorkspace)) {
-      rb_raise(rb_eTypeError, 
-	       "Wrong argument type %s (GSL::MultiFit::Ndlinear::Workspace expected)",
-        rb_class2name(CLASS_OF(argv[argc-1])));
-    }
-    Data_Get_Struct(argv[argc-1], gsl_multifit_ndlinear_workspace, w);    
-    argc2 = argc-1;
-    break;
-  default:
-    Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
-    argc2 = argc;  
-  }
-  switch (argc2) {
-  case 2:
-    CHECK_VECTOR(argv[0]);
-    CHECK_VECTOR(argv[1]);
-    Data_Get_Struct(argv[0], gsl_vector, x);
-    Data_Get_Struct(argv[1], gsl_vector, c);
-    break;
-  default:
-    rb_raise(rb_eArgError, "Wrong number of arguments.");  
-  }
-  val = gsl_multifit_ndlinear_calc(x, c, w);
-  return rb_float_new(val);
-}
-
-static VALUE rb_gsl_multifit_ndlinear_n_coeffs(VALUE obj)
-{
-  gsl_multifit_ndlinear_workspace *w;
-  Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
-  return INT2FIX(w->n_coeffs);
-}
-
-static VALUE rb_gsl_multifit_ndlinear_n_dim(VALUE obj)
-{
-  gsl_multifit_ndlinear_workspace *w;
-  Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
-  return INT2FIX(w->n_dim);
-}
-
-static VALUE rb_gsl_multifit_ndlinear_N(VALUE obj)
-{
-  gsl_multifit_ndlinear_workspace *w;
-  VALUE ary;
-  Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
-  ary = (VALUE) w->params;
-  return rb_ary_entry(ary, INDEX_N);
-}
-/*
-static VALUE rb_gsl_multifit_linear_Rsq(VALUE module, VALUE vy, VALUE vchisq)
-{
-  gsl_vector *y;
-  double chisq, Rsq;
-  CHECK_VECTOR(vy);
-  Data_Get_Struct(vy, gsl_vector, y);
-  chisq = NUM2DBL(vchisq);
-  gsl_multifit_linear_Rsq(y, chisq, &Rsq);
-  return rb_float_new(Rsq);
-}
-*/
-void Init_ndlinear(VALUE module)
-{
-  VALUE mNdlinear;
-  mNdlinear = rb_define_module_under(module, "Ndlinear");
-  cUFunc = rb_define_class_under(mNdlinear, "UFunc", rb_cObject);
-  cWorkspace = rb_define_class_under(mNdlinear, "Workspace", cGSL_Object);
-  
-  rb_define_singleton_method(mNdlinear, "alloc", 
-                            rb_gsl_multifit_ndlinear_alloc, -1);
-  rb_define_singleton_method(cWorkspace, "alloc", 
-                            rb_gsl_multifit_ndlinear_alloc, -1);    
-                            
-  rb_define_singleton_method(mNdlinear, "design", 
-                            rb_gsl_multifit_ndlinear_design, -1);
-  rb_define_singleton_method(cWorkspace, "design", 
-                            rb_gsl_multifit_ndlinear_design, -1);
-  rb_define_method(cWorkspace, "design",rb_gsl_multifit_ndlinear_est, -1);
-  rb_define_singleton_method(mNdlinear, "est", 
-                            rb_gsl_multifit_ndlinear_est, -1);
-  rb_define_singleton_method(cWorkspace, "est", 
-                            rb_gsl_multifit_ndlinear_est, -1);
-  rb_define_method(cWorkspace, "est",rb_gsl_multifit_ndlinear_est, -1);  
-  
-  rb_define_singleton_method(mNdlinear, "calc", 
-                            rb_gsl_multifit_ndlinear_calc, -1);
-  rb_define_singleton_method(cWorkspace, "calc", 
-                            rb_gsl_multifit_ndlinear_calc, -1);
-  rb_define_method(cWorkspace, "calc",rb_gsl_multifit_ndlinear_calc, -1);  
-
-  rb_define_method(cWorkspace, "n_coeffs",rb_gsl_multifit_ndlinear_n_coeffs, 0);    
-  rb_define_method(cWorkspace, "n_dim",rb_gsl_multifit_ndlinear_n_dim, 0);      
-  rb_define_method(cWorkspace, "N",rb_gsl_multifit_ndlinear_N, 0);
-  
-  //  rb_define_module_function(module, "linear_Rsq", rb_gsl_multifit_linear_Rsq, 2);
-}
-
-#endif
-
+#include "include/rb_gsl.h"
+
+#ifdef HAVE_NDLINEAR_GSL_MULTIFIT_NDLINEAR_H
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_multifit.h>
+#include <ndlinear/gsl_multifit_ndlinear.h>
+
+static VALUE cWorkspace;
+
+enum Index_Ndlinear {
+  INDEX_NDIM = 0,
+  INDEX_N = 1,
+  INDEX_PROCS = 2,
+  INDEX_PARAMS = 3,
+  INDEX_FUNCS = 4,
+  INDEX_NDIM_I = 5,
+
+  NDLINEAR_ARY_SIZE = 6,
+};
+
+static void multifit_ndlinear_mark(gsl_multifit_ndlinear_workspace *w)
+{
+  rb_gc_mark((VALUE) w->params);
+}
+
+typedef int (*UFUNC)(double, double[], void*);
+typedef struct ufunc_struct
+{
+  UFUNC *fptr;
+} ufunc_struct;
+
+static VALUE cUFunc;
+static ufunc_struct* ufunc_struct_alloc(size_t n_dim) {
+  ufunc_struct *p;
+  p = (ufunc_struct*) malloc(sizeof(ufunc_struct));
+  p->fptr = malloc(sizeof(UFUNC)*n_dim);
+  return p;
+}
+static void ufunc_struct_free(ufunc_struct *p)
+{
+  free(p->fptr);
+  free(p);
+}
+
+static int func_u(double x, double y[], void *data);
+static VALUE rb_gsl_multifit_ndlinear_alloc(int argc, VALUE *argv, VALUE klass)
+{
+  gsl_multifit_ndlinear_workspace *w;
+  int istart = 0;
+  size_t n_dim = 0, *N, i;
+  struct ufunc_struct *p;
+  VALUE params, wspace, pp;
+  switch (argc) {
+  case 4:
+    istart = 1;
+    CHECK_FIXNUM(argv[0]);
+    n_dim = FIX2INT(argv[0]);
+  /* no break */
+  case 3:
+    if (TYPE(argv[istart]) != T_ARRAY) {
+      rb_raise(rb_eTypeError, "Wrong argument type %s (Array expected)",
+               rb_class2name(CLASS_OF(argv[istart])));
+    }
+    if (TYPE(argv[istart+1]) != T_ARRAY) {
+      rb_raise(rb_eTypeError, "Wrong argument type %s (Array expected)",
+               rb_class2name(CLASS_OF(argv[istart+1])));
+    }
+    //    n_dim = RARRAY(argv[istart])->len;
+    n_dim = RARRAY_LEN(argv[istart]);
+    N = (size_t*) malloc(sizeof(size_t)*n_dim);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
+  }
+  for (i = 0; i < n_dim; i++) {
+    N[i] = FIX2INT(rb_ary_entry(argv[istart], i));
+  }
+  params = rb_ary_new2(NDLINEAR_ARY_SIZE);
+  rb_ary_store(params, INDEX_NDIM, INT2FIX((int) n_dim));
+  rb_ary_store(params, INDEX_N, argv[istart]);   /* N */
+  rb_ary_store(params, INDEX_PROCS, argv[istart+1]); /* procs */
+  rb_ary_store(params, INDEX_PARAMS, argv[istart+2]); /* params */
+  rb_ary_store(params, INDEX_NDIM_I, INT2FIX(0)); /* for the first parameter */
+
+  p = ufunc_struct_alloc(n_dim);
+  for (i = 0; i < n_dim; i++) p->fptr[i] = func_u;
+  pp = Data_Wrap_Struct(cUFunc, 0, ufunc_struct_free, p);
+  rb_ary_store(params, INDEX_FUNCS, pp);
+
+  w = gsl_multifit_ndlinear_alloc(n_dim, N, p->fptr, (void*) params);
+
+  free((size_t*) N);
+
+  wspace = Data_Wrap_Struct(cWorkspace, multifit_ndlinear_mark, gsl_multifit_ndlinear_free, w);
+
+  return wspace;
+}
+
+static int func_u(double x, double y[], void *data)
+{
+  VALUE ary, vN, procs, proc, vy, params;
+  gsl_vector_view ytmp;
+  size_t i, n_dim;
+  int rslt;
+  ary = (VALUE) data;
+  n_dim = FIX2INT(rb_ary_entry(ary, INDEX_NDIM));
+  vN = rb_ary_entry(ary, INDEX_N);
+  procs = rb_ary_entry(ary, INDEX_PROCS);
+  params = rb_ary_entry(ary, INDEX_PARAMS);
+  i = FIX2INT(rb_ary_entry(ary, INDEX_NDIM_I));
+  proc = rb_ary_entry(procs, i);
+
+  ytmp.vector.data = (double*) y;
+  ytmp.vector.stride = 1;
+  ytmp.vector.size = FIX2INT(rb_ary_entry(vN, i));
+  vy = Data_Wrap_Struct(cgsl_vector_view, 0, NULL, &ytmp);
+
+  rslt = rb_funcall((VALUE) proc, RBGSL_ID_call, 3, rb_float_new(x), vy, params);
+
+  /* for the next parameter */
+  i += 1;
+  if (i == n_dim) i = 0;
+  rb_ary_store(ary, INDEX_NDIM_I, INT2FIX(i));
+
+  return GSL_SUCCESS;
+}
+
+static VALUE rb_gsl_multifit_ndlinear_design(int argc, VALUE *argv, VALUE obj)
+{
+  gsl_multifit_ndlinear_workspace *w;
+  gsl_matrix *vars = NULL, *X = NULL;
+  int argc2, flag = 0, ret;
+  switch (TYPE(obj)) {
+  case T_MODULE:
+  case T_CLASS:
+  case T_OBJECT:
+    if (!rb_obj_is_kind_of(argv[argc-1], cWorkspace)) {
+      rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::MultiFit::Ndlinear::Workspace expected)",
+               rb_class2name(CLASS_OF(argv[argc-1])));
+    }
+    Data_Get_Struct(argv[argc-1], gsl_multifit_ndlinear_workspace, w);
+    argc2 = argc-1;
+    break;
+  default:
+    Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
+    argc2 = argc;
+  }
+  switch (argc2) {
+  case 1:
+    CHECK_MATRIX(argv[0]);
+    Data_Get_Struct(argv[0], gsl_matrix, vars);
+    X = gsl_matrix_alloc(vars->size1, w->n_coeffs);
+    flag = 1;
+    break;
+  case 2:
+    CHECK_MATRIX(argv[0]);
+    CHECK_MATRIX(argv[1]);
+    Data_Get_Struct(argv[0], gsl_matrix, vars);
+    Data_Get_Struct(argv[1], gsl_matrix, X);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments.");
+  }
+  ret = gsl_multifit_ndlinear_design(vars, X, w);
+
+  if (flag == 1) {
+    return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, X);
+  } else {
+    return INT2FIX(ret);
+  }
+}
+
+static VALUE rb_gsl_multifit_ndlinear_est(int argc, VALUE *argv, VALUE obj)
+{
+  gsl_multifit_ndlinear_workspace *w;
+  gsl_vector *x = NULL, *c = NULL;
+  gsl_matrix *cov = NULL;
+  double y, yerr;
+  int argc2;
+  switch (TYPE(obj)) {
+  case T_MODULE:
+  case T_CLASS:
+  case T_OBJECT:
+    if (!rb_obj_is_kind_of(argv[argc-1], cWorkspace)) {
+      rb_raise(rb_eTypeError, "Wrong argument type %s (GSL::MultiFit::Ndlinear::Workspace expected)",
+               rb_class2name(CLASS_OF(argv[argc-1])));
+    }
+    Data_Get_Struct(argv[argc-1], gsl_multifit_ndlinear_workspace, w);
+    argc2 = argc-1;
+    break;
+  default:
+    Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
+    argc2 = argc;
+  }
+  switch (argc2) {
+  case 3:
+    CHECK_VECTOR(argv[0]);
+    CHECK_VECTOR(argv[1]);
+    CHECK_MATRIX(argv[2]);
+    Data_Get_Struct(argv[0], gsl_vector, x);
+    Data_Get_Struct(argv[1], gsl_vector, c);
+    Data_Get_Struct(argv[2], gsl_matrix, cov);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments.");
+  }
+  gsl_multifit_ndlinear_est(x, c, cov, &y, &yerr, w);
+  return rb_ary_new3(2, rb_float_new(y), rb_float_new(yerr));
+}
+
+static VALUE rb_gsl_multifit_ndlinear_calc(int argc, VALUE *argv, VALUE obj)
+{
+  gsl_multifit_ndlinear_workspace *w;
+  gsl_vector *x = NULL, *c = NULL;
+  double val;
+  int argc2;
+  switch (TYPE(obj)) {
+  case T_MODULE:
+  case T_CLASS:
+  case T_OBJECT:
+    if (!rb_obj_is_kind_of(argv[argc-1], cWorkspace)) {
+      rb_raise(rb_eTypeError,
+               "Wrong argument type %s (GSL::MultiFit::Ndlinear::Workspace expected)",
+               rb_class2name(CLASS_OF(argv[argc-1])));
+    }
+    Data_Get_Struct(argv[argc-1], gsl_multifit_ndlinear_workspace, w);
+    argc2 = argc-1;
+    break;
+  default:
+    Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
+    argc2 = argc;
+  }
+  switch (argc2) {
+  case 2:
+    CHECK_VECTOR(argv[0]);
+    CHECK_VECTOR(argv[1]);
+    Data_Get_Struct(argv[0], gsl_vector, x);
+    Data_Get_Struct(argv[1], gsl_vector, c);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments.");
+  }
+  val = gsl_multifit_ndlinear_calc(x, c, w);
+  return rb_float_new(val);
+}
+
+static VALUE rb_gsl_multifit_ndlinear_n_coeffs(VALUE obj)
+{
+  gsl_multifit_ndlinear_workspace *w;
+  Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
+  return INT2FIX(w->n_coeffs);
+}
+
+static VALUE rb_gsl_multifit_ndlinear_n_dim(VALUE obj)
+{
+  gsl_multifit_ndlinear_workspace *w;
+  Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
+  return INT2FIX(w->n_dim);
+}
+
+static VALUE rb_gsl_multifit_ndlinear_N(VALUE obj)
+{
+  gsl_multifit_ndlinear_workspace *w;
+  VALUE ary;
+  Data_Get_Struct(obj, gsl_multifit_ndlinear_workspace, w);
+  ary = (VALUE) w->params;
+  return rb_ary_entry(ary, INDEX_N);
+}
+/*
+static VALUE rb_gsl_multifit_linear_Rsq(VALUE module, VALUE vy, VALUE vchisq)
+{
+  gsl_vector *y;
+  double chisq, Rsq;
+  CHECK_VECTOR(vy);
+  Data_Get_Struct(vy, gsl_vector, y);
+  chisq = NUM2DBL(vchisq);
+  gsl_multifit_linear_Rsq(y, chisq, &Rsq);
+  return rb_float_new(Rsq);
+}
+*/
+void Init_ndlinear(VALUE module)
+{
+  VALUE mNdlinear;
+  mNdlinear = rb_define_module_under(module, "Ndlinear");
+  cUFunc = rb_define_class_under(mNdlinear, "UFunc", rb_cObject);
+  cWorkspace = rb_define_class_under(mNdlinear, "Workspace", cGSL_Object);
+
+  rb_define_singleton_method(mNdlinear, "alloc",
+                             rb_gsl_multifit_ndlinear_alloc, -1);
+  rb_define_singleton_method(cWorkspace, "alloc",
+                             rb_gsl_multifit_ndlinear_alloc, -1);
+
+  rb_define_singleton_method(mNdlinear, "design",
+                             rb_gsl_multifit_ndlinear_design, -1);
+  rb_define_singleton_method(cWorkspace, "design",
+                             rb_gsl_multifit_ndlinear_design, -1);
+  rb_define_method(cWorkspace, "design",rb_gsl_multifit_ndlinear_est, -1);
+  rb_define_singleton_method(mNdlinear, "est",
+                             rb_gsl_multifit_ndlinear_est, -1);
+  rb_define_singleton_method(cWorkspace, "est",
+                             rb_gsl_multifit_ndlinear_est, -1);
+  rb_define_method(cWorkspace, "est",rb_gsl_multifit_ndlinear_est, -1);
+
+  rb_define_singleton_method(mNdlinear, "calc",
+                             rb_gsl_multifit_ndlinear_calc, -1);
+  rb_define_singleton_method(cWorkspace, "calc",
+                             rb_gsl_multifit_ndlinear_calc, -1);
+  rb_define_method(cWorkspace, "calc",rb_gsl_multifit_ndlinear_calc, -1);
+
+  rb_define_method(cWorkspace, "n_coeffs",rb_gsl_multifit_ndlinear_n_coeffs, 0);
+  rb_define_method(cWorkspace, "n_dim",rb_gsl_multifit_ndlinear_n_dim, 0);
+  rb_define_method(cWorkspace, "N",rb_gsl_multifit_ndlinear_N, 0);
+
+  //  rb_define_module_function(module, "linear_Rsq", rb_gsl_multifit_linear_Rsq, 2);
+}
+
+#endif
+
diff --git a/ext/gsl/nmf.c b/ext/gsl_native/nmf.c
similarity index 86%
rename from ext/gsl/nmf.c
rename to ext/gsl_native/nmf.c
index ac02878..d1d40c4 100644
--- a/ext/gsl/nmf.c
+++ b/ext/gsl_native/nmf.c
@@ -32,8 +32,8 @@ void pp(const gsl_matrix *m)
 {
   int r, c;
 
-  for(r=0; r < (int) m->size1; r++) {
-    for(c=0; c < (int) m->size2; c++) {
+  for(r = 0; r < (int) m->size1; r++) {
+    for(c = 0; c < (int) m->size2; c++) {
       printf(" %.2f", gsl_matrix_get(m, r, c));
     }
     printf("\n");
@@ -45,15 +45,15 @@ void pp(const gsl_matrix *m)
 double difcost(const gsl_matrix *a, const gsl_matrix *b)
 {
   int i, j;
-  double dif=0, d;
+  double dif = 0, d;
 
-  for (i=0; i < (int) a->size1; i++)
+  for (i = 0; i < (int) a->size1; i++)
   {
-    for (j=0; j < (int) a->size2; j++)
+    for (j = 0; j < (int) a->size2; j++)
     {
       d = gsl_matrix_get(a, i, j) - gsl_matrix_get(b, i, j);
       dif += d*d;
-	//      dif += pow(gsl_matrix_get(a, i, j) - gsl_matrix_get(b, i, j), 2);
+      //      dif += pow(gsl_matrix_get(a, i, j) - gsl_matrix_get(b, i, j), 2);
     }
   }
   return dif;
@@ -66,9 +66,9 @@ static void initmatrix(gsl_matrix *m, double min, double max)
 
   srand(time(NULL));
 
-  for(i=0; i < (int) m->size1; i++)
+  for(i = 0; i < (int) m->size1; i++)
   {
-    for(j=0; j < (int) m->size2; j++)
+    for(j = 0; j < (int) m->size2; j++)
     {
       val = min + (int) (max * (rand() / (RAND_MAX + min)));
       gsl_matrix_set(m, i, j, val);
@@ -79,10 +79,10 @@ static void initmatrix(gsl_matrix *m, double min, double max)
 static double update(gsl_matrix *v, gsl_matrix *w, gsl_matrix *h)
 {
   double dist = 0;
-  gsl_matrix *wt=NULL, *ht=NULL, *wh=NULL;
-  gsl_matrix *w_h=NULL, *wt_w=NULL;
+  gsl_matrix *wt = NULL, *ht = NULL, *wh = NULL;
+  gsl_matrix *w_h = NULL, *wt_w = NULL;
   gsl_matrix *wt_v = NULL;
-  gsl_matrix *v_ht=NULL, *wt_w_h=NULL, *w_h_ht=NULL;
+  gsl_matrix *v_ht = NULL, *wt_w_h = NULL, *w_h_ht = NULL;
 
   wt = gsl_matrix_alloc(w->size2, w->size1);
   gsl_matrix_transpose_memcpy(wt, w);
diff --git a/ext/gsl/nmf_wrap.c b/ext/gsl_native/nmf_wrap.c
similarity index 97%
rename from ext/gsl/nmf_wrap.c
rename to ext/gsl_native/nmf_wrap.c
index b09299e..d4085a5 100644
--- a/ext/gsl/nmf_wrap.c
+++ b/ext/gsl_native/nmf_wrap.c
@@ -28,7 +28,7 @@ static VALUE nmf_wrap(VALUE obj, VALUE matrix, VALUE cols)
   unsigned int c;
   VALUE arr;
 
-  if ( ! FIXNUM_P(cols) || (c=NUM2INT(cols)) <= 0 ) {
+  if ( !FIXNUM_P(cols) || (c = NUM2INT(cols)) <= 0 ) {
     rb_raise(rb_eArgError, "Number of columns should be a positive integer.");
   }
   arr = rb_ary_new2(2);
diff --git a/ext/gsl/ntuple.c b/ext/gsl_native/ntuple.c
similarity index 94%
rename from ext/gsl/ntuple.c
rename to ext/gsl_native/ntuple.c
index 2900b67..fb674ff 100644
--- a/ext/gsl/ntuple.c
+++ b/ext/gsl_native/ntuple.c
@@ -372,7 +372,7 @@ static VALUE rb_gsl_ntuple_value_fn_new(int argc, VALUE *argv, VALUE klass)
 
 /* singleton method */
 static VALUE rb_gsl_ntuple_project(VALUE obj, VALUE hh, VALUE nn,
-				   VALUE vvfn, VALUE vsfn)
+                                   VALUE vvfn, VALUE vsfn)
 {
   gsl_histogram *h = NULL;
   gsl_ntuple *n = NULL;
@@ -386,10 +386,10 @@ static VALUE rb_gsl_ntuple_project(VALUE obj, VALUE hh, VALUE nn,
   if (!rb_obj_is_kind_of(nn, cgsl_ntuple))
     rb_raise(rb_eTypeError, "argument 2: Ntuple expected");
   Data_Get_Struct(nn, gsl_ntuple, n);
-  if (!rb_obj_is_kind_of(vvfn, cgsl_ntuple_value_fn)) 
+  if (!rb_obj_is_kind_of(vvfn, cgsl_ntuple_value_fn))
     rb_raise(rb_eTypeError, "argument 3: Ntuple::ValueFn expected");
   Data_Get_Struct(vvfn, gsl_ntuple_value_fn, vfn);
-  if (!rb_obj_is_kind_of(vsfn, cgsl_ntuple_select_fn)) 
+  if (!rb_obj_is_kind_of(vsfn, cgsl_ntuple_select_fn))
     rb_raise(rb_eTypeError, "argument 4: Ntuple::SelectFn expected");
   Data_Get_Struct(vsfn, gsl_ntuple_select_fn, sfn);
 
@@ -412,10 +412,10 @@ static VALUE rb_gsl_ntuple_project2(VALUE obj, VALUE hh, VALUE vvfn, VALUE vsfn)
   CHECK_HISTOGRAM(hh);
   Data_Get_Struct(obj, gsl_ntuple, n);
   Data_Get_Struct(hh, gsl_histogram, h);
-  if (!rb_obj_is_kind_of(vvfn, cgsl_ntuple_value_fn)) 
+  if (!rb_obj_is_kind_of(vvfn, cgsl_ntuple_value_fn))
     rb_raise(rb_eTypeError, "argument 2: Ntuple::ValueFn expected");
   Data_Get_Struct(vvfn, gsl_ntuple_value_fn, vfn);
-  if (!rb_obj_is_kind_of(vsfn, cgsl_ntuple_select_fn)) 
+  if (!rb_obj_is_kind_of(vsfn, cgsl_ntuple_select_fn))
     rb_raise(rb_eTypeError, "argument 3: Ntuple::SelectFn expected");
   Data_Get_Struct(vsfn, gsl_ntuple_select_fn, sfn);
   size = n->size/sizeof(double);
@@ -447,22 +447,22 @@ void Init_gsl_ntuple(VALUE module)
   rb_define_alias(cgsl_ntuple, "ntuple_data", "data");
 
   rb_define_singleton_method(cgsl_ntuple_select_fn, "alloc",
-			     rb_gsl_ntuple_select_fn_new, -1);
+                             rb_gsl_ntuple_select_fn_new, -1);
   rb_define_method(cgsl_ntuple_select_fn, "set",
-		   rb_gsl_ntuple_select_fn_set_f, -1);
+                   rb_gsl_ntuple_select_fn_set_f, -1);
   rb_define_method(cgsl_ntuple_select_fn, "set_params",
-		   rb_gsl_ntuple_select_fn_set_params, -1);
+                   rb_gsl_ntuple_select_fn_set_params, -1);
   rb_define_method(cgsl_ntuple_select_fn, "params",
-		   rb_gsl_ntuple_select_fn_params, 0);
+                   rb_gsl_ntuple_select_fn_params, 0);
 
   rb_define_singleton_method(cgsl_ntuple_value_fn, "alloc",
-			     rb_gsl_ntuple_value_fn_new, -1);
+                             rb_gsl_ntuple_value_fn_new, -1);
   rb_define_method(cgsl_ntuple_value_fn, "set",
-		   rb_gsl_ntuple_value_fn_set_f, -1);
+                   rb_gsl_ntuple_value_fn_set_f, -1);
   rb_define_method(cgsl_ntuple_value_fn, "set_params",
-		   rb_gsl_ntuple_value_fn_set_params, -1);
+                   rb_gsl_ntuple_value_fn_set_params, -1);
   rb_define_method(cgsl_ntuple_value_fn, "params",
-		   rb_gsl_ntuple_value_fn_params, 0);
+                   rb_gsl_ntuple_value_fn_params, 0);
 
   rb_define_singleton_method(cgsl_ntuple, "project", rb_gsl_ntuple_project, 4);
   rb_define_method(cgsl_ntuple, "project", rb_gsl_ntuple_project2, 3);
diff --git a/ext/gsl/odeiv.c b/ext/gsl_native/odeiv.c
similarity index 85%
rename from ext/gsl/odeiv.c
rename to ext/gsl_native/odeiv.c
index fce6b0d..ab46ee4 100644
--- a/ext/gsl/odeiv.c
+++ b/ext/gsl_native/odeiv.c
@@ -14,38 +14,38 @@
 #include "include/rb_gsl_function.h"
 
 #ifndef CHECK_SYSTEM
-#define CHECK_SYSTEM(x) if(CLASS_OF(x)!=cgsl_odeiv_system)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::Odeiv::System expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_SYSTEM(x) if(CLASS_OF(x)!=cgsl_odeiv_system) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::Odeiv::System expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifndef CHECK_STEP
-#define CHECK_STEP(x) if(CLASS_OF(x)!=cgsl_odeiv_step)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::Odeiv::Step expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_STEP(x) if(CLASS_OF(x)!=cgsl_odeiv_step) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::Odeiv::Step expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifndef CHECK_CONTROL
-#define CHECK_CONTROL(x) if(CLASS_OF(x)!=cgsl_odeiv_control)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::Odeiv::Control expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_CONTROL(x) if(CLASS_OF(x)!=cgsl_odeiv_control) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::Odeiv::Control expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifndef CHECK_EVOLVE
-#define CHECK_EVOLVE(x) if(CLASS_OF(x)!=cgsl_odeiv_evolve)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::Odeiv::Evolve expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_EVOLVE(x) if(CLASS_OF(x)!=cgsl_odeiv_evolve) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::Odeiv::Evolve expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 #ifndef CHECK_SOLVER
-#define CHECK_SOLVER(x) if(CLASS_OF(x)!=cgsl_odeiv_solver)\
-      rb_raise(rb_eTypeError,\
-      "wrong argument type %s (GSL::Odeiv::Solver expected)",\
-      rb_class2name(CLASS_OF(x)));
+#define CHECK_SOLVER(x) if(CLASS_OF(x)!=cgsl_odeiv_solver) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (GSL::Odeiv::Solver expected)", \
+             rb_class2name(CLASS_OF(x)));
 #endif
 
 static VALUE cgsl_odeiv_system;
@@ -101,10 +101,9 @@ static int calc_func(double t, const double y[], double dydt[], void *data)
   vy = Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, &ytmp);
   vdydt = Data_Wrap_Struct(cgsl_vector_view, 0, NULL, &dydttmp);
 
-  if (NIL_P(params)) /*result =*/ rb_funcall((VALUE) proc, RBGSL_ID_call, 3, rb_float_new(t), 
-					 vy, vdydt);
+  if (NIL_P(params)) /*result =*/ rb_funcall((VALUE) proc, RBGSL_ID_call, 3, rb_float_new(t),
+                                             vy, vdydt);
   else /*result =*/ rb_funcall((VALUE) proc, RBGSL_ID_call, 4, rb_float_new(t), vy, vdydt, params);
- 
   return GSL_SUCCESS;
 }
 
@@ -118,11 +117,10 @@ static int calc_jac(double t, const double y[], double *dfdy, double dfdt[], voi
   gsl_vector_view ytmp, dfdttmp;
   gsl_matrix_view mv;
   size_t dim;
-  
+
   ary = (VALUE) data;
   proc = rb_ary_entry(ary, 1);
   if (NIL_P(proc)) rb_raise(rb_eRuntimeError, "df function not given");
-
   dim = FIX2INT(rb_ary_entry(ary, 2));
   params = rb_ary_entry(ary, 3);
 
@@ -137,9 +135,9 @@ static int calc_jac(double t, const double y[], double *dfdy, double dfdt[], voi
   vmjac = Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, &mv);
   vdfdt = Data_Wrap_Struct(cgsl_vector_view, 0, NULL, &dfdttmp);
   if (NIL_P(params)) /*result =*/ rb_funcall((VALUE) proc, RBGSL_ID_call, 4, rb_float_new(t),
-					 vy, vmjac, vdfdt);
-  else /*result =*/ rb_funcall((VALUE) proc, RBGSL_ID_call, 5, rb_float_new(t), 
-			   vy, vmjac, vdfdt, params);
+                                             vy, vmjac, vdfdt);
+  else /*result =*/ rb_funcall((VALUE) proc, RBGSL_ID_call, 5, rb_float_new(t),
+                               vy, vmjac, vdfdt, params);
   return GSL_SUCCESS;
 }
 
@@ -195,7 +193,6 @@ static void set_sys(int argc, VALUE *argv, gsl_odeiv_system *sys)
     sys->function = &calc_func;
     sys->jacobian = &calc_jac;
   }
-
   if (sys->params == NULL) {
     ary = rb_ary_new2(4);
     /*    (VALUE) sys->params = ary;*/
@@ -213,7 +210,7 @@ static void set_sys(int argc, VALUE *argv, gsl_odeiv_system *sys)
   } else {
     vjac = Qnil;
   }
-  if ((dim =argv[itmp++]) == Qnil) dim = argv[itmp++];
+  if ((dim = argv[itmp++]) == Qnil) dim = argv[itmp++];
   switch (argc - itmp) {
   case 0:
     vparams = Qnil;
@@ -227,10 +224,10 @@ static void set_sys(int argc, VALUE *argv, gsl_odeiv_system *sys)
   }
   dimension = FIX2INT(dim);
   sys->dimension = dimension;
-  rb_ary_store(ary, 0, argv[0]); 
+  rb_ary_store(ary, 0, argv[0]);
   rb_ary_store(ary, 1, vjac);
-  rb_ary_store(ary, 2, dim);  
-  rb_ary_store(ary, 3, vparams); 
+  rb_ary_store(ary, 2, dim);
+  rb_ary_store(ary, 3, vparams);
 }
 
 static VALUE rb_gsl_odeiv_system_set_params(int argc, VALUE *argv, VALUE obj);
@@ -254,7 +251,7 @@ static VALUE rb_gsl_odeiv_system_set_params(int argc, VALUE *argv, VALUE obj)
     for (i = 0; (int) i < argc; i++) rb_ary_store(vparams, i, argv[i]);
   }
   //  rb_ary_delete_at(ary, 3);
-  rb_ary_store(ary, 3, vparams); 
+  rb_ary_store(ary, 3, vparams);
   return obj;
 }
 
@@ -341,9 +338,7 @@ static const gsl_odeiv_step_type* rb_gsl_odeiv_step_type_get(VALUE tt)
     case GSL_ODEIV_STEP_BSIMP: T = gsl_odeiv_step_bsimp; break;
     case GSL_ODEIV_STEP_GEAR1: T = gsl_odeiv_step_gear1; break;
     case GSL_ODEIV_STEP_GEAR2: T = gsl_odeiv_step_gear2; break;
-#ifdef GSL_1_6_LATER
     case GSL_ODEIV_STEP_RK2SIMP: T = gsl_odeiv_step_rk2simp; break;
-#endif
     default:
       rb_raise(rb_eArgError, "wrong argument type (Fixnum expected)");
       break;
@@ -361,16 +356,14 @@ static const gsl_odeiv_step_type* rb_gsl_odeiv_step_type_get(VALUE tt)
     else if (str_tail_grep(name, "bsimp") == 0) T = gsl_odeiv_step_bsimp;
     else if (str_tail_grep(name, "gear1") == 0) T = gsl_odeiv_step_gear1;
     else if (str_tail_grep(name, "gear2") == 0) T = gsl_odeiv_step_gear2;
-#ifdef GSL_1_6_LATER
     else if (str_tail_grep(name, "rk2simp") == 0) T = gsl_odeiv_step_rk2simp;
-#endif
     else {
       rb_raise(rb_eArgError, "wrong argument type %s", name);
     }
     break;
   default:
     rb_raise(rb_eArgError, "wrong argument type %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(tt)));
+             rb_class2name(CLASS_OF(tt)));
     break;
   }
   return T;
@@ -420,7 +413,7 @@ static VALUE rb_gsl_odeiv_step_apply(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(argv[5], gsl_vector, vtmp2);
       if (vtmp2) dydt_out = vtmp2->data;
     }
-    /* no break */
+  /* no break */
   case 6:
     if (VECTOR_P(argv[4])) {
       Data_Get_Struct(argv[4], gsl_vector, vtmp1);
@@ -440,8 +433,8 @@ static VALUE rb_gsl_odeiv_step_apply(int argc, VALUE *argv, VALUE obj)
   Data_Get_Struct(argv[2], gsl_vector, y);
   Data_Get_Struct(argv[3], gsl_vector, yerr);
   Data_Get_Struct(argv[argc-1], gsl_odeiv_system, sys);
-  return INT2FIX(gsl_odeiv_step_apply(s, t, h, y->data, yerr->data, 
-				      dydt_in, dydt_out, sys));
+  return INT2FIX(gsl_odeiv_step_apply(s, t, h, y->data, yerr->data,
+                                      dydt_in, dydt_out, sys));
 }
 
 static VALUE rb_gsl_odeiv_step_info(VALUE obj)
@@ -456,27 +449,27 @@ static VALUE rb_gsl_odeiv_step_info(VALUE obj)
   return rb_str_new2(buf);
 }
 
-static gsl_odeiv_control* make_control_standard(VALUE epsabs, 
-					       VALUE epsrel,
-						VALUE ay, VALUE adydt);
+static gsl_odeiv_control* make_control_standard(VALUE epsabs,
+                                                VALUE epsrel,
+                                                VALUE ay, VALUE adydt);
 static gsl_odeiv_control* make_control_y(VALUE epsabs, VALUE epsrel);
-static VALUE rb_gsl_odeiv_control_standard_new(VALUE klass, VALUE epsabs, 
-					       VALUE epsrel,
-					       VALUE ay, VALUE adydt)
+static VALUE rb_gsl_odeiv_control_standard_new(VALUE klass, VALUE epsabs,
+                                               VALUE epsrel,
+                                               VALUE ay, VALUE adydt)
 {
   gsl_odeiv_control *c = NULL;
-  c = make_control_standard(epsabs, epsrel, ay, adydt); 
+  c = make_control_standard(epsabs, epsrel, ay, adydt);
   return Data_Wrap_Struct(klass, 0, gsl_odeiv_control_free, c);
 }
 
-static gsl_odeiv_control* make_control_standard(VALUE epsabs, 
-					       VALUE epsrel,
-					       VALUE ay, VALUE adydt)
+static gsl_odeiv_control* make_control_standard(VALUE epsabs,
+                                                VALUE epsrel,
+                                                VALUE ay, VALUE adydt)
 {
   Need_Float(epsabs); Need_Float(epsrel);
   Need_Float(ay);   Need_Float(adydt);
-  return gsl_odeiv_control_standard_new(NUM2DBL(epsabs), NUM2DBL(epsrel), 
-					NUM2DBL(ay), NUM2DBL(adydt));
+  return gsl_odeiv_control_standard_new(NUM2DBL(epsabs), NUM2DBL(epsrel),
+                                        NUM2DBL(ay), NUM2DBL(adydt));
 }
 
 static gsl_odeiv_control* make_control_y(VALUE epsabs, VALUE epsrel)
@@ -485,16 +478,16 @@ static gsl_odeiv_control* make_control_y(VALUE epsabs, VALUE epsrel)
   return gsl_odeiv_control_y_new(NUM2DBL(epsabs), NUM2DBL(epsrel));
 }
 
-static VALUE rb_gsl_odeiv_control_y_new(VALUE klass, VALUE epsabs, 
-					VALUE epsrel)
+static VALUE rb_gsl_odeiv_control_y_new(VALUE klass, VALUE epsabs,
+                                        VALUE epsrel)
 {
   gsl_odeiv_control *c = NULL;
   c = make_control_y(epsabs, epsrel);
   return Data_Wrap_Struct(klass, 0, gsl_odeiv_control_free, c);
 }
 
-static VALUE rb_gsl_odeiv_control_yp_new(VALUE klass, VALUE epsabs, 
-					 VALUE epsrel)
+static VALUE rb_gsl_odeiv_control_yp_new(VALUE klass, VALUE epsabs,
+                                         VALUE epsrel)
 {
   gsl_odeiv_control *c = NULL;
   Need_Float(epsabs); Need_Float(epsrel);
@@ -502,11 +495,10 @@ static VALUE rb_gsl_odeiv_control_yp_new(VALUE klass, VALUE epsabs,
   return Data_Wrap_Struct(klass, 0, gsl_odeiv_control_free, c);
 }
 
-#ifdef GSL_1_2_LATER
-static VALUE rb_gsl_odeiv_control_scaled_new(VALUE klass, VALUE epsabs, 
-					     VALUE epsrel,
-					     VALUE ay, VALUE adydt,
-					     VALUE sc, VALUE dd)
+static VALUE rb_gsl_odeiv_control_scaled_new(VALUE klass, VALUE epsabs,
+                                             VALUE epsrel,
+                                             VALUE ay, VALUE adydt,
+                                             VALUE sc, VALUE dd)
 {
   gsl_odeiv_control *c = NULL;
   gsl_vector *v = NULL;
@@ -515,23 +507,22 @@ static VALUE rb_gsl_odeiv_control_scaled_new(VALUE klass, VALUE epsabs,
   CHECK_FIXNUM(dd);
   CHECK_VECTOR(sc);
   Data_Get_Struct(sc, gsl_vector, v);
-  c = gsl_odeiv_control_scaled_new(NUM2DBL(epsabs), NUM2DBL(epsrel), 
-				   NUM2DBL(ay), NUM2DBL(adydt), v->data,
-				   FIX2INT(dd));
+  c = gsl_odeiv_control_scaled_new(NUM2DBL(epsabs), NUM2DBL(epsrel),
+                                   NUM2DBL(ay), NUM2DBL(adydt), v->data,
+                                   FIX2INT(dd));
   return Data_Wrap_Struct(klass, 0, gsl_odeiv_control_free, c);
 }
-#endif
 
-static VALUE rb_gsl_odeiv_control_init(VALUE obj, VALUE epsabs, 
-				       VALUE epsrel,
-				       VALUE ay, VALUE adydt)
+static VALUE rb_gsl_odeiv_control_init(VALUE obj, VALUE epsabs,
+                                       VALUE epsrel,
+                                       VALUE ay, VALUE adydt)
 {
   gsl_odeiv_control *c = NULL;
   Need_Float(epsabs); Need_Float(epsrel);
   Need_Float(ay);   Need_Float(adydt);
   Data_Get_Struct(obj, gsl_odeiv_control, c);
-  gsl_odeiv_control_init(c, NUM2DBL(epsabs), NUM2DBL(epsrel), 
-			 NUM2DBL(ay), NUM2DBL(adydt));
+  gsl_odeiv_control_init(c, NUM2DBL(epsabs), NUM2DBL(epsrel),
+                         NUM2DBL(ay), NUM2DBL(adydt));
   return obj;
 }
 
@@ -543,7 +534,7 @@ static VALUE rb_gsl_odeiv_control_name(VALUE obj)
 }
 
 static VALUE rb_gsl_odeiv_control_hadjust(VALUE obj, VALUE ss, VALUE yy0,
-					  VALUE yyerr, VALUE ddydt, VALUE hh)
+                                          VALUE yyerr, VALUE ddydt, VALUE hh)
 {
   gsl_odeiv_control *c = NULL;
   gsl_odeiv_step *s = NULL;
@@ -559,13 +550,13 @@ static VALUE rb_gsl_odeiv_control_hadjust(VALUE obj, VALUE ss, VALUE yy0,
   Data_Get_Struct(yyerr, gsl_vector, yerr);
   Data_Get_Struct(ddydt, gsl_vector, dydt);
   h = NUM2DBL(hh);
-  status = gsl_odeiv_control_hadjust(c, s, y0->data, yerr->data, 
-				     dydt->data, &h);
+  status = gsl_odeiv_control_hadjust(c, s, y0->data, yerr->data,
+                                     dydt->data, &h);
   return rb_ary_new3(2, rb_float_new(h), INT2FIX(status));
 }
 
 static gsl_odeiv_evolve* make_evolve(VALUE dim);
-static VALUE rb_gsl_odeiv_evolve_new(VALUE klass, VALUE dim) 
+static VALUE rb_gsl_odeiv_evolve_new(VALUE klass, VALUE dim)
 {
   gsl_odeiv_evolve *e = NULL;
   e = make_evolve(dim);
@@ -639,7 +630,7 @@ static VALUE rb_gsl_odeiv_evolve_yerr(VALUE obj)
 }
 
 static VALUE rb_gsl_odeiv_evolve_apply(VALUE obj, VALUE cc, VALUE ss, VALUE sss,
-				       VALUE tt, VALUE tt1, VALUE hh, VALUE yy)
+                                       VALUE tt, VALUE tt1, VALUE hh, VALUE yy)
 {
   gsl_odeiv_evolve *e = NULL;
   gsl_odeiv_control *c = NULL;
@@ -654,7 +645,7 @@ static VALUE rb_gsl_odeiv_evolve_apply(VALUE obj, VALUE cc, VALUE ss, VALUE sss,
   if (NIL_P(cc)) {
     c = NULL;
   } else {
-    CHECK_CONTROL(cc); 
+    CHECK_CONTROL(cc);
     Data_Get_Struct(cc, gsl_odeiv_control, c);
   }
   Data_Get_Struct(ss, gsl_odeiv_step, s);
@@ -788,8 +779,8 @@ static VALUE rb_gsl_odeiv_solver_set_sys(VALUE obj, VALUE ss)
   return obj;
 }
 
-static VALUE rb_gsl_odeiv_solver_apply(VALUE obj, VALUE tt, VALUE tt1, VALUE hh, 
-				       VALUE yy)
+static VALUE rb_gsl_odeiv_solver_apply(VALUE obj, VALUE tt, VALUE tt1, VALUE hh,
+                                       VALUE yy)
 {
   gsl_odeiv_solver *gos = NULL;
   gsl_vector *y = NULL;
@@ -803,8 +794,8 @@ static VALUE rb_gsl_odeiv_solver_apply(VALUE obj, VALUE tt, VALUE tt1, VALUE hh,
       if (TYPE(hh) != T_FLOAT) rb_raise(rb_eTypeError, "argument 2 Float expected");*/
   t = NUM2DBL(tt);
   h = NUM2DBL(hh);
-  status = gsl_odeiv_evolve_apply(gos->e, gos->c, gos->s, 
-				  gos->sys, &t, NUM2DBL(tt1), &h, y->data);
+  status = gsl_odeiv_evolve_apply(gos->e, gos->c, gos->s,
+                                  gos->sys, &t, NUM2DBL(tt1), &h, y->data);
   /*  RFLOAT(tt)->value = t;
       RFLOAT(hh)->value = h;
       return INT2FIX(status);*/
@@ -836,8 +827,8 @@ static VALUE rb_gsl_odeiv_solver_set_params(int argc, VALUE *argv, VALUE obj)
 {
   gsl_odeiv_solver *gos = NULL;
   Data_Get_Struct(obj, gsl_odeiv_solver, gos);
-  rb_gsl_odeiv_system_set_params(argc, argv, 
-				 Data_Wrap_Struct(cgsl_odeiv_system, 0, NULL, gos->sys));
+  rb_gsl_odeiv_system_set_params(argc, argv,
+                                 Data_Wrap_Struct(cgsl_odeiv_system, 0, NULL, gos->sys));
   return obj;
 }
 
@@ -857,8 +848,8 @@ void Init_gsl_odeiv(VALUE module)
   rb_define_const(mgsl_odeiv, "HADJ_DEC", INT2FIX(GSL_ODEIV_HADJ_DEC));
   rb_define_const(mgsl_odeiv, "HADJ_INC", INT2FIX(GSL_ODEIV_HADJ_INC));
   rb_define_const(mgsl_odeiv, "HADJ_NIL", INT2FIX(GSL_ODEIV_HADJ_NIL));
-  cgsl_odeiv_step = rb_define_class_under(mgsl_odeiv, "Step", 
-					    cGSL_Object);
+  cgsl_odeiv_step = rb_define_class_under(mgsl_odeiv, "Step",
+                                          cGSL_Object);
   rb_define_singleton_method(cgsl_odeiv_step, "alloc", rb_gsl_odeiv_step_new, -1);
 
   /*****/
@@ -885,23 +876,21 @@ void Init_gsl_odeiv(VALUE module)
 
   /****/
 
-  cgsl_odeiv_control = rb_define_class_under(mgsl_odeiv, "Control", 
-					    cGSL_Object);
+  cgsl_odeiv_control = rb_define_class_under(mgsl_odeiv, "Control",
+                                             cGSL_Object);
   rb_define_singleton_method(cgsl_odeiv_control, "alloc", rb_gsl_odeiv_control_standard_new, 4);
   rb_define_singleton_method(cgsl_odeiv_control, "standard_alloc", rb_gsl_odeiv_control_standard_new, 4);
- rb_define_singleton_method(cgsl_odeiv_control, "y_new", rb_gsl_odeiv_control_y_new, 2);
- rb_define_singleton_method(cgsl_odeiv_control, "yp_new", rb_gsl_odeiv_control_yp_new, 2);
-#ifdef GSL_1_2_LATER
- rb_define_singleton_method(cgsl_odeiv_control, "scaled_alloc", rb_gsl_odeiv_control_scaled_new, 5);
-#endif
+  rb_define_singleton_method(cgsl_odeiv_control, "y_new", rb_gsl_odeiv_control_y_new, 2);
+  rb_define_singleton_method(cgsl_odeiv_control, "yp_new", rb_gsl_odeiv_control_yp_new, 2);
+  rb_define_singleton_method(cgsl_odeiv_control, "scaled_alloc", rb_gsl_odeiv_control_scaled_new, 5);
 
   rb_define_method(cgsl_odeiv_control, "init", rb_gsl_odeiv_control_init, 4);
   rb_define_method(cgsl_odeiv_control, "name", rb_gsl_odeiv_control_name, 0);
   rb_define_method(cgsl_odeiv_control, "hadjust", rb_gsl_odeiv_control_hadjust, 5);
 
- /****/
-  cgsl_odeiv_evolve = rb_define_class_under(mgsl_odeiv, "Evolve", 
-					     cGSL_Object);
+  /****/
+  cgsl_odeiv_evolve = rb_define_class_under(mgsl_odeiv, "Evolve",
+                                            cGSL_Object);
   rb_define_singleton_method(cgsl_odeiv_evolve, "alloc", rb_gsl_odeiv_evolve_new, 1);
 
   rb_define_method(cgsl_odeiv_evolve, "reset", rb_gsl_odeiv_evolve_reset, 0);
@@ -914,19 +903,19 @@ void Init_gsl_odeiv(VALUE module)
   rb_define_method(cgsl_odeiv_evolve, "yerr", rb_gsl_odeiv_evolve_yerr, 0);
   /*****/
 
-  cgsl_odeiv_system = rb_define_class_under(mgsl_odeiv, "System", 
-					    cGSL_Object);
+  cgsl_odeiv_system = rb_define_class_under(mgsl_odeiv, "System",
+                                            cGSL_Object);
   rb_define_singleton_method(cgsl_odeiv_system, "alloc", rb_gsl_odeiv_system_new, -1);
   rb_define_method(cgsl_odeiv_system, "set", rb_gsl_odeiv_system_set, -1);
-  rb_define_method(cgsl_odeiv_system, "set_params", 
-			     rb_gsl_odeiv_system_set_params, -1);
-  rb_define_method(cgsl_odeiv_system, "params", 
-			     rb_gsl_odeiv_system_params, 0);
-  rb_define_method(cgsl_odeiv_system, "function", 
-			     rb_gsl_odeiv_system_function, 0);
+  rb_define_method(cgsl_odeiv_system, "set_params",
+                   rb_gsl_odeiv_system_set_params, -1);
+  rb_define_method(cgsl_odeiv_system, "params",
+                   rb_gsl_odeiv_system_params, 0);
+  rb_define_method(cgsl_odeiv_system, "function",
+                   rb_gsl_odeiv_system_function, 0);
   rb_define_alias(cgsl_odeiv_system, "func", "function");
-  rb_define_method(cgsl_odeiv_system, "jacobian", 
-			     rb_gsl_odeiv_system_jacobian, 0);
+  rb_define_method(cgsl_odeiv_system, "jacobian",
+                   rb_gsl_odeiv_system_jacobian, 0);
   rb_define_alias(cgsl_odeiv_system, "jac", "jacobian");
   rb_define_method(cgsl_odeiv_system, "dimension", rb_gsl_odeiv_system_dimension, 0);
   rb_define_alias(cgsl_odeiv_system, "dim", "dimension");
diff --git a/ext/gsl_native/ool.c b/ext/gsl_native/ool.c
new file mode 100644
index 0000000..ea8ade4
--- /dev/null
+++ b/ext/gsl_native/ool.c
@@ -0,0 +1,879 @@
+#ifdef HAVE_OOL_OOL_VERSION_H
+#include "include/rb_gsl.h"
+#include "include/rb_gsl_array.h"
+#include <ool/ool_conmin.h>
+
+static VALUE cool_conmin_function;
+static VALUE cool_conmin_constraint;
+static VALUE cool_conmin_pgrad;
+static VALUE cool_conmin_spg;
+static VALUE cool_conmin_gencan;
+static VALUE cool_conmin_pgrad_parameters;
+static VALUE cool_conmin_spg_parameters;
+static VALUE cool_conmin_gencan_parameters;
+
+#ifndef CHECK_OOL_CONMIN_FUNCTION
+#define CHECK_OOL_CONMIN_FUNCTION(x) if(CLASS_OF(x)!=cool_conmin_function) \
+    rb_raise(rb_eTypeError, \
+             "wrong argument type %s (OOL::Conmin::Function expected)", \
+             rb_class2name(CLASS_OF(x)));
+#endif
+
+enum enum_ool_conmin_minimizer_type {
+  OOL_CONMIN_PGRAD,
+  OOL_CONMIN_SPG,
+  OOL_CONMIN_GENCAN,
+};
+
+static const ool_conmin_minimizer_type* get_minimizer_type(VALUE t)
+{
+  char name[64];
+
+  switch (TYPE(t)) {
+  case T_STRING:
+    strcpy(name, STR2CSTR(t));
+    if (str_tail_grep(name, "pgrad") == 0) {
+      return ool_conmin_minimizer_pgrad;
+    } else if (str_tail_grep(name, "spg") == 0) {
+      return ool_conmin_minimizer_spg;
+    } else if (str_tail_grep(name, "gencan") == 0) {
+      return ool_conmin_minimizer_gencan;
+    } else {
+      rb_raise(rb_eTypeError, "%s: unknown minimizer type", name);
+    }
+    break;
+  case T_FIXNUM:
+    switch (FIX2INT(t)) {
+    case OOL_CONMIN_PGRAD:
+      return ool_conmin_minimizer_pgrad;
+      break;
+    case OOL_CONMIN_SPG:
+      return ool_conmin_minimizer_spg;
+      break;
+    case OOL_CONMIN_GENCAN:
+      return ool_conmin_minimizer_gencan;
+      break;
+    default:
+      rb_raise(rb_eTypeError, "%d: unknown minimizer type", FIX2INT(t));
+      break;
+    }
+    break;
+  default:
+    if (t == cool_conmin_pgrad) return ool_conmin_minimizer_pgrad;
+    else if (t == cool_conmin_spg) return ool_conmin_minimizer_spg;
+    else if (t == cool_conmin_gencan) return ool_conmin_minimizer_gencan;
+    else rb_raise(rb_eTypeError, "type is given by a String or a Fixnum");
+    break;
+  }
+}
+
+static void def_const(VALUE module)
+{
+  rb_define_const(module, "CONTINUE", INT2FIX(OOL_CONTINUE));
+  rb_define_const(module, "SUCCESS", INT2FIX(OOL_SUCCESS));
+}
+
+
+static VALUE rb_ool_conmin_minimizer_set(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_ool_conmin_minimizer_alloc(int argc, VALUE *argv, VALUE klass)
+{
+  ool_conmin_minimizer *m;
+  VALUE obj;
+  if (argc < 2) rb_raise(rb_eArgError, "Too few arguments (%d for >= 2)", argc);
+  m = ool_conmin_minimizer_alloc(get_minimizer_type(argv[0]), FIX2INT(argv[1]));
+  obj = Data_Wrap_Struct(klass, 0, ool_conmin_minimizer_free, m);
+  if (argc > 2) rb_ool_conmin_minimizer_set(argc-2, argv+2, obj);
+  return obj;
+}
+
+static void* get_parameter(const ool_conmin_minimizer_type *T, ool_conmin_pgrad_parameters *Pp,
+                           ool_conmin_spg_parameters *Ps, ool_conmin_gencan_parameters *Pg, VALUE ary);
+static VALUE rb_ool_conmin_minimizer_set(int argc, VALUE *argv, VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  ool_conmin_function *F;
+  ool_conmin_constraint *C;
+  gsl_vector *v;
+  ool_conmin_pgrad_parameters Pp;
+  ool_conmin_spg_parameters Ps;
+  ool_conmin_gencan_parameters Pg;
+  void *P;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  switch (argc) {
+  case 3:
+    if (CLASS_OF(argv[0]) != cool_conmin_function)
+      rb_raise(rb_eTypeError, "Wrong argument type 0 (OOL::Conmin::Function expected)");
+    if (CLASS_OF(argv[1]) != cool_conmin_constraint)
+      rb_raise(rb_eTypeError, "Wrong argument type 1 (OOL::Conmin::Constraint expected)");
+    if (!VECTOR_P(argv[2]))
+      rb_raise(rb_eTypeError, "Wrong argument type 2 (GSL::Vector expected)");
+    Data_Get_Struct(argv[0], ool_conmin_function, F);
+    Data_Get_Struct(argv[1], ool_conmin_constraint, C);
+    Data_Get_Struct(argv[2], gsl_vector, v);
+    P = get_parameter(m->type, &Pp, &Ps, &Pg, Qnil);
+    ool_conmin_minimizer_set(m, F, C, v, P);
+    break;
+  case 4:
+    if (CLASS_OF(argv[0]) != cool_conmin_function)
+      rb_raise(rb_eTypeError, "Wrong argument type 0 (OOL::Conmin::Function expected)");
+    if (CLASS_OF(argv[1]) != cool_conmin_constraint)
+      rb_raise(rb_eTypeError, "Wrong argument type 1 (OOL::Conmin::Constraint expected)");
+    if (!VECTOR_P(argv[2]))
+      rb_raise(rb_eTypeError, "Wrong argument type 2 (GSL::Vector expected)");
+    if (!rb_obj_is_kind_of(argv[3], rb_cArray) && argv[3] != Qnil)
+      rb_raise(rb_eTypeError, "Wrong argument type 3 (Array expected)");
+    Data_Get_Struct(argv[0], ool_conmin_function, F);
+    Data_Get_Struct(argv[1], ool_conmin_constraint, C);
+    Data_Get_Struct(argv[2], gsl_vector, v);
+    P = get_parameter(m->type, &Pp, &Ps, &Pg, argv[3]);
+    ool_conmin_minimizer_set(m, F, C, v, P);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 3 or 4)", argc);
+  }
+  return obj;
+}
+
+static void* get_parameter(const ool_conmin_minimizer_type *T, ool_conmin_pgrad_parameters *Pp,
+                           ool_conmin_spg_parameters *Ps, ool_conmin_gencan_parameters *Pg, VALUE ary)
+{
+  if (T == ool_conmin_minimizer_pgrad) {
+    if (ary == Qnil) {
+      ool_conmin_parameters_default(T, (void*) Pp);
+    } else {
+      Pp->fmin = NUM2DBL(rb_ary_entry(ary, 0));
+      Pp->tol = NUM2DBL(rb_ary_entry(ary, 1));
+      Pp->alpha = NUM2DBL(rb_ary_entry(ary, 2));
+      Pp->sigma1 = NUM2DBL(rb_ary_entry(ary, 3));
+      Pp->sigma2 = NUM2DBL(rb_ary_entry(ary, 4));
+    }
+    return (void*) Pp;
+  } else if (T == ool_conmin_minimizer_spg) {
+    if (ary == Qnil) {
+      ool_conmin_parameters_default(T, (void*) Ps);
+    } else {
+      Ps->fmin = NUM2DBL(rb_ary_entry(ary, 0));
+      Ps->tol = NUM2DBL(rb_ary_entry(ary, 1));
+      Ps->M = NUM2DBL(rb_ary_entry(ary, 2));
+      Ps->alphamin = NUM2DBL(rb_ary_entry(ary, 3));
+      Ps->alphamax = NUM2DBL(rb_ary_entry(ary, 4));
+      Ps->gamma = NUM2DBL(rb_ary_entry(ary, 5));
+      Ps->sigma2 = NUM2DBL(rb_ary_entry(ary, 6));
+      Ps->sigma2 = NUM2DBL(rb_ary_entry(ary, 7));
+    }
+    return (void*) Ps;
+  } else {
+    if (ary == Qnil) {
+      ool_conmin_parameters_default(T, (void*) Pg);
+    } else {
+      Pg->epsgpen = NUM2DBL(rb_ary_entry(ary, 0));
+      Pg->epsgpsn = NUM2DBL(rb_ary_entry(ary, 1));
+      Pg->fmin = NUM2DBL(rb_ary_entry(ary, 2));
+      Pg->udelta0 = NUM2DBL(rb_ary_entry(ary, 3));
+      Pg->ucgmia = NUM2DBL(rb_ary_entry(ary, 4));
+      Pg->ucgmib = NUM2DBL(rb_ary_entry(ary, 5));
+      Pg->cg_scre = FIX2INT(rb_ary_entry(ary, 6));
+      Pg->cg_gpnf = NUM2DBL(rb_ary_entry(ary, 7));
+      Pg->cg_epsi = NUM2DBL(rb_ary_entry(ary, 8));
+      Pg->cg_epsf = NUM2DBL(rb_ary_entry(ary, 9));
+      Pg->cg_epsnqmp = NUM2DBL(rb_ary_entry(ary, 10));
+      Pg->cg_maxitnqmp = (size_t) FIX2INT(rb_ary_entry(ary, 11));
+      Pg->nearlyq = FIX2INT(rb_ary_entry(ary, 12));
+      Pg->nint = NUM2DBL(rb_ary_entry(ary, 13));
+      Pg->next = NUM2DBL(rb_ary_entry(ary, 14));
+      Pg->mininterp = (size_t) FIX2INT(rb_ary_entry(ary, 15));
+      Pg->maxextrap = (size_t) FIX2INT(rb_ary_entry(ary, 16));
+      Pg->trtype = FIX2INT(rb_ary_entry(ary, 17));
+      Pg->eta = NUM2DBL(rb_ary_entry(ary, 18));
+      Pg->delmin = NUM2DBL(rb_ary_entry(ary, 19));
+      Pg->lspgmi = NUM2DBL(rb_ary_entry(ary, 20));
+      Pg->lspgma = NUM2DBL(rb_ary_entry(ary, 21));
+      Pg->theta = NUM2DBL(rb_ary_entry(ary, 22));
+      Pg->gamma = NUM2DBL(rb_ary_entry(ary, 23));
+      Pg->beta = NUM2DBL(rb_ary_entry(ary, 24));
+      Pg->sigma1 = NUM2DBL(rb_ary_entry(ary, 25));
+      Pg->sigma2 = NUM2DBL(rb_ary_entry(ary, 26));
+      Pg->epsrel = NUM2DBL(rb_ary_entry(ary, 27));
+      Pg->epsabs = NUM2DBL(rb_ary_entry(ary, 28));
+      Pg->infrel = NUM2DBL(rb_ary_entry(ary, 29));
+      Pg->infabs = NUM2DBL(rb_ary_entry(ary, 30));
+    }
+    return (void*) Pg;
+  }
+}
+
+static VALUE create_parameters_ary_pgrad(ool_conmin_pgrad_parameters *Pp)
+{
+  VALUE ary;
+  ary = rb_ary_new2(5);
+  rb_ary_store(ary, 0, rb_float_new(Pp->fmin));
+  rb_ary_store(ary, 1, rb_float_new(Pp->tol));
+  rb_ary_store(ary, 2, rb_float_new(Pp->alpha));
+  rb_ary_store(ary, 3, rb_float_new(Pp->sigma1));
+  rb_ary_store(ary, 4, rb_float_new(Pp->sigma2));
+  return ary;
+}
+
+static VALUE create_parameters_ary_spg(ool_conmin_spg_parameters *Ps)
+{
+  VALUE ary;
+  ary = rb_ary_new2(8);
+  rb_ary_store(ary, 0, rb_float_new(Ps->fmin));
+  rb_ary_store(ary, 1, rb_float_new(Ps->tol));
+  rb_ary_store(ary, 2, rb_float_new(Ps->M));
+  rb_ary_store(ary, 3, rb_float_new(Ps->alphamin));
+  rb_ary_store(ary, 4, rb_float_new(Ps->alphamax));
+  rb_ary_store(ary, 5, rb_float_new(Ps->gamma));
+  rb_ary_store(ary, 6, rb_float_new(Ps->sigma2));
+  rb_ary_store(ary, 7, rb_float_new(Ps->sigma2));
+  return ary;
+}
+
+static VALUE create_parameters_ary_gencan(ool_conmin_gencan_parameters *Pg)
+{
+  VALUE ary;
+  ary = rb_ary_new2(31);
+  rb_ary_store(ary, 0, rb_float_new(Pg->epsgpen));
+  rb_ary_store(ary, 1, rb_float_new(Pg->epsgpsn));
+  rb_ary_store(ary, 2, rb_float_new(Pg->fmin));
+  rb_ary_store(ary, 3, rb_float_new(Pg->udelta0));
+  rb_ary_store(ary, 4, rb_float_new(Pg->ucgmia));
+  rb_ary_store(ary, 5, rb_float_new(Pg->ucgmib));
+  rb_ary_store(ary, 6, INT2FIX(Pg->cg_scre));
+  rb_ary_store(ary, 7, rb_float_new(Pg->cg_gpnf));
+  rb_ary_store(ary, 8, rb_float_new(Pg->cg_epsi));
+  rb_ary_store(ary, 9, rb_float_new(Pg->cg_epsf));
+  rb_ary_store(ary, 10, rb_float_new(Pg->cg_epsnqmp));
+  rb_ary_store(ary, 11, INT2FIX((int) Pg->cg_maxitnqmp));
+  rb_ary_store(ary, 12, INT2FIX(Pg->nearlyq));
+  rb_ary_store(ary, 13, rb_float_new(Pg->nint));
+  rb_ary_store(ary, 14, rb_float_new(Pg->next));
+  rb_ary_store(ary, 15, INT2FIX((int)Pg->mininterp));
+  rb_ary_store(ary, 16, INT2FIX((int)Pg->maxextrap));
+  rb_ary_store(ary, 17, INT2FIX(Pg->trtype));
+  rb_ary_store(ary, 18, rb_float_new(Pg->eta));
+  rb_ary_store(ary, 19, rb_float_new(Pg->delmin));
+  rb_ary_store(ary, 20, rb_float_new(Pg->lspgmi));
+  rb_ary_store(ary, 21, rb_float_new(Pg->lspgma));
+  rb_ary_store(ary, 22, rb_float_new(Pg->theta));
+  rb_ary_store(ary, 23, rb_float_new(Pg->gamma));
+  rb_ary_store(ary, 24, rb_float_new(Pg->beta));
+  rb_ary_store(ary, 25, rb_float_new(Pg->sigma1));
+  rb_ary_store(ary, 26, rb_float_new(Pg->sigma2));
+  rb_ary_store(ary, 27, rb_float_new(Pg->epsrel));
+  rb_ary_store(ary, 28, rb_float_new(Pg->epsabs));
+  rb_ary_store(ary, 29, rb_float_new(Pg->infrel));
+  rb_ary_store(ary, 30, rb_float_new(Pg->infabs));
+  return ary;
+}
+static VALUE rb_ool_conmin_minimizer_parameters_get(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  ool_conmin_pgrad_parameters *Pp;
+  ool_conmin_spg_parameters *Ps;
+  ool_conmin_gencan_parameters *Pg;
+  void *P;
+  VALUE ary;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  ool_conmin_parameters_get(m, P);
+  if (m->type ==   ool_conmin_minimizer_pgrad) {
+    Pp = (ool_conmin_pgrad_parameters*) P;
+    ary = create_parameters_ary_pgrad(Pp);
+  } else if (m->type == ool_conmin_minimizer_spg) {
+    Ps = (ool_conmin_spg_parameters*) P;
+    ary = create_parameters_ary_spg(Ps);
+  } else {
+    Pg = (ool_conmin_gencan_parameters*) P;
+    ary = create_parameters_ary_gencan(Pg);
+  }
+  return ary;
+}
+
+static VALUE rb_ool_conmin_minimizer_parameters_set(VALUE obj, VALUE params)
+{
+  ool_conmin_minimizer *m;
+  ool_conmin_pgrad_parameters *Pp;
+  ool_conmin_spg_parameters *Ps;
+  ool_conmin_gencan_parameters *Pg;
+  void *P;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  P = get_parameter(m->type, Pp, Ps, Pg, params);
+  ool_conmin_parameters_set(m, P);
+  return params;
+}
+
+static VALUE rb_ool_conmin_minimizer_name(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return rb_str_new2(ool_conmin_minimizer_name(m));
+}
+static VALUE rb_ool_conmin_minimizer_f(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return rb_float_new(m->f);
+}
+static VALUE rb_ool_conmin_minimizer_x(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return Data_Wrap_Struct(cgsl_vector, 0, NULL, m->x);
+}
+static VALUE rb_ool_conmin_minimizer_gradient(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return Data_Wrap_Struct(cgsl_vector, 0, NULL, m->gradient);
+}
+static VALUE rb_ool_conmin_minimizer_minimum(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return rb_float_new(ool_conmin_minimizer_minimum(m));
+}
+static VALUE rb_ool_conmin_minimizer_dx(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return Data_Wrap_Struct(cgsl_vector, 0, NULL, m->dx);
+}
+static VALUE rb_ool_conmin_minimizer_size(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return rb_float_new(ool_conmin_minimizer_size(m));
+}
+static VALUE rb_ool_conmin_minimizer_fcount(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return INT2FIX((int) ool_conmin_minimizer_fcount(m));
+}
+static VALUE rb_ool_conmin_minimizer_gcount(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return INT2FIX((int) ool_conmin_minimizer_gcount(m));
+}
+static VALUE rb_ool_conmin_minimizer_hcount(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return INT2FIX((int) ool_conmin_minimizer_hcount(m));
+}
+static VALUE rb_ool_conmin_minimizer_is_optimal(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return INT2FIX((int) ool_conmin_is_optimal(m));
+}
+static VALUE rb_ool_conmin_minimizer_is_optimal2(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  if (ool_conmin_is_optimal(m)) return Qtrue;
+  else return Qfalse;
+}
+static VALUE rb_ool_conmin_minimizer_iterate(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return INT2FIX((int) ool_conmin_minimizer_iterate(m));
+}
+static VALUE rb_ool_conmin_minimizer_restart(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  return INT2FIX((int) ool_conmin_minimizer_restart(m));
+}
+
+static VALUE rb_ool_conmin_pgrad_parameters_default(VALUE klass);
+static VALUE rb_ool_conmin_spg_parameters_default(VALUE klass);
+static VALUE rb_ool_conmin_gencan_parameters_default(VALUE klass);
+
+static VALUE rb_ool_conmin_minimizer_parameters_default(VALUE obj)
+{
+  ool_conmin_minimizer *m;
+  Data_Get_Struct(obj, ool_conmin_minimizer, m);
+  if (m->type == ool_conmin_minimizer_spg) {
+    return rb_ool_conmin_spg_parameters_default(cool_conmin_spg);
+  } else if (m->type == ool_conmin_minimizer_pgrad) {
+    return rb_ool_conmin_pgrad_parameters_default(cool_conmin_pgrad);
+  } else if (m->type == ool_conmin_minimizer_gencan) {
+    return rb_ool_conmin_gencan_parameters_default(cool_conmin_gencan);
+  } else {
+    rb_raise(rb_eRuntimeError, "Unkowm minimizer type.");
+  }
+  return Qnil;   /* never reaches here */
+}
+
+/***/
+
+static void rb_ool_conmin_function_mark(ool_conmin_function *F)
+{
+  rb_gc_mark((VALUE) F->params);
+}
+
+static double rb_ool_conmin_function_f(const gsl_vector *x, void *p);
+static void rb_ool_conmin_function_df(const gsl_vector *x, void *p, gsl_vector *g);
+static void rb_ool_conmin_function_fdf(const gsl_vector *x, void *p,
+                                       double *f, gsl_vector *g);
+static void rb_ool_conmin_function_Hv(const gsl_vector *X, void *params,
+                                      const gsl_vector *V, gsl_vector *hv);
+static void set_functions(int argc, VALUE *argv, ool_conmin_function *F);
+static void set_params(ool_conmin_function *F, VALUE p);
+static VALUE rb_ool_conmin_function_set_n(VALUE obj, VALUE nn);
+static VALUE rb_ool_conmin_function_set_functions(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_ool_conmin_function_set(int argc, VALUE *argv, VALUE obj);
+
+static VALUE rb_ool_conmin_function_alloc(int argc, VALUE *argv, VALUE klass)
+{
+  ool_conmin_function *F = NULL;
+  VALUE ary, obj;
+
+  F = ALLOC(ool_conmin_function);
+  F->f = &rb_ool_conmin_function_f;
+  F->df = &rb_ool_conmin_function_df;
+  F->fdf = &rb_ool_conmin_function_fdf;
+  F->Hv = &rb_ool_conmin_function_Hv;
+  F->n = 0;
+  ary = rb_ary_new2(5);
+
+  F->params = (void *) ary;
+  rb_ary_store(ary, 0, Qnil);  /* proc f */
+  rb_ary_store(ary, 1, Qnil);  /* proc df */
+  rb_ary_store(ary, 2, Qnil);  /* proc fdf */
+  rb_ary_store(ary, 3, Qnil);  /* proc Hv */
+  rb_ary_store(ary, 4, Qnil);  /* params */
+//  set_functions(argc, argv, F);
+  obj = Data_Wrap_Struct(klass, rb_ool_conmin_function_mark, free, F);
+  rb_ool_conmin_function_set(argc, argv, obj);
+  return obj;
+}
+
+static VALUE rb_ool_conmin_function_set(int argc, VALUE *argv, VALUE obj)
+{
+  ool_conmin_function *F;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  switch (argc) {
+  case 0:
+    break;
+  case 1:
+    rb_ool_conmin_function_set_n(obj, argv[0]);
+    break;
+  case 4:
+    set_functions(argc, argv, F);
+    break;
+  case 5:
+    if (FIXNUM_P(argv[0])) {
+      rb_ool_conmin_function_set_n(obj, argv[0]);
+      set_functions(argc-1, argv+1, F);
+    } else {
+      set_functions(argc-1, argv, F);
+      set_params(F, argv[argc-1]);
+    }
+    break;
+  case 6:
+    rb_ool_conmin_function_set_n(obj, argv[0]);
+    set_functions(argc-2, argv+1, F);
+    set_params(F, argv[argc-1]);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments.");
+  }
+  return obj;
+}
+
+static VALUE rb_ool_conmin_function_set_n(VALUE obj, VALUE nn)
+{
+  ool_conmin_function *F = NULL;
+  if (FIXNUM_P(nn)) {
+    Data_Get_Struct(obj, ool_conmin_function, F);
+    F->n = (size_t) FIX2INT(nn);
+  } else {
+    rb_raise(rb_eArgError, "Wrong argument type %s (Fixnum expected)",
+             rb_class2name(CLASS_OF(nn)));
+  }
+  return nn;
+}
+
+static VALUE rb_ool_conmin_function_n(VALUE obj)
+{
+  ool_conmin_function *F = NULL;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  return INT2FIX((int) F->n);
+}
+static double rb_ool_conmin_function_f(const gsl_vector *x, void *p)
+{
+  VALUE vx, proc, vp, result, ary;
+  vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
+  ary = (VALUE) p;
+  proc = rb_ary_entry(ary, 0);
+  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
+  if (NIL_P(vp)) result = rb_funcall(proc, RBGSL_ID_call, 1, vx);
+  else result = rb_funcall(proc, RBGSL_ID_call, 2, vx, vp);
+  return NUM2DBL(result);
+}
+
+static void rb_ool_conmin_function_df(const gsl_vector *x, void *p, gsl_vector *g)
+{
+  VALUE vx, vg, proc, vp, ary;
+  vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
+  vg = Data_Wrap_Struct(cgsl_vector, 0, NULL, g);
+  ary = (VALUE) p;
+  proc = rb_ary_entry(ary, 1);
+  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
+  if (NIL_P(vp)) {
+    rb_funcall(proc, RBGSL_ID_call, 2, vx, vg);
+  } else {
+    rb_funcall(proc, RBGSL_ID_call, 3, vx, vp, vg);
+  }
+}
+
+static void rb_ool_conmin_function_fdf(const gsl_vector *x, void *p,
+                                       double *f, gsl_vector *g)
+{
+  VALUE vx, vf, vg, proc_fdf, proc_f, proc_df, vp, ary, result;
+  vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
+  vg = Data_Wrap_Struct(cgsl_vector, 0, NULL, g);
+  vf = rb_float_new(*f);
+  ary = (VALUE) p;
+  proc_f = rb_ary_entry(ary, 0);
+  proc_df = rb_ary_entry(ary, 1);
+  proc_fdf = rb_ary_entry(ary, 2);
+  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
+  if (NIL_P(vp)) {
+    result = rb_funcall(proc_f, RBGSL_ID_call, 1, vx);
+    rb_funcall(proc_df, RBGSL_ID_call, 2, vx, vg);
+  } else {
+    result = rb_funcall(proc_f, RBGSL_ID_call, 2, vx, vp);
+    rb_funcall(proc_df, RBGSL_ID_call, 3, vx, vp, vg);
+  }
+  *f = NUM2DBL(result);
+}
+
+static void rb_ool_conmin_function_Hv(const gsl_vector *X, void *params,
+                                      const gsl_vector *V, gsl_vector *hv)
+{
+  VALUE vX, vV, vHv, ary, proc_Hv, vp;
+  vX = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector*) X);
+  vV = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector*) V);
+  vHv = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector*) hv);
+  ary = (VALUE) params;
+  proc_Hv = rb_ary_entry(ary, 3);
+  vp = rb_ary_entry(ary, RARRAY_LEN(ary)-1);
+  if (NIL_P(vp)) {
+    rb_funcall(proc_Hv, RBGSL_ID_call, 3, vX, vV, vHv);
+  } else {
+    rb_funcall(proc_Hv, RBGSL_ID_call, 4, vX, vp, vV, vHv);
+  }
+}
+
+static VALUE rb_ool_conmin_function_set_functions(int argc, VALUE *argv, VALUE obj)
+{
+  ool_conmin_function *F;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  set_functions(argc, argv, F);
+  return obj;
+}
+
+static void set_functions(int argc, VALUE *argv, ool_conmin_function *F)
+{
+  VALUE ary;
+  size_t i;
+  if (F->params == NULL) {
+    ary = rb_ary_new2(5);
+    /*    (VALUE) F->params = ary;*/
+    F->params = (void *) ary;
+  } else {
+    ary = (VALUE) F->params;
+  }
+  switch (argc) {
+  case 4:
+    for (i = 0; i < argc; i++) rb_ary_store(ary, i, argv[i]);
+    break;
+  default:
+    rb_raise(rb_eArgError,"Wrong number of arguments (%d for 4)", argc);
+  }
+}
+
+static VALUE rb_ool_conmin_function_set_f(VALUE obj, VALUE proc)
+{
+  ool_conmin_function *F;
+  VALUE ary;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  if (F->params == NULL) {
+    ary = rb_ary_new2(5);
+    F->params = (void *) ary;
+  } else {
+    ary = (VALUE) F->params;
+  }
+  rb_ary_store(ary, 0, proc);
+  return proc;
+}
+
+static VALUE rb_ool_conmin_function_set_df(VALUE obj, VALUE proc)
+{
+  ool_conmin_function *F;
+  VALUE ary;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  if (F->params == NULL) {
+    ary = rb_ary_new2(5);
+    F->params = (void *) ary;
+  } else {
+    ary = (VALUE) F->params;
+  }
+  rb_ary_store(ary, 1, proc);
+  return proc;
+}
+
+static VALUE rb_ool_conmin_function_set_fdf(VALUE obj, VALUE proc)
+{
+  ool_conmin_function *F;
+  VALUE ary;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  if (F->params == NULL) {
+    ary = rb_ary_new2(5);
+    F->params = (void *) ary;
+  } else {
+    ary = (VALUE) F->params;
+  }
+  rb_ary_store(ary, 2, proc);
+  return proc;
+}
+
+static VALUE rb_ool_conmin_function_set_Hv(VALUE obj, VALUE proc)
+{
+  ool_conmin_function *F;
+  VALUE ary;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  if (F->params == NULL) {
+    ary = rb_ary_new2(5);
+    F->params = (void *) ary;
+  } else {
+    ary = (VALUE) F->params;
+  }
+  rb_ary_store(ary, 3, proc);
+  return proc;
+}
+
+static VALUE rb_ool_conmin_function_set_params(VALUE obj, VALUE p)
+{
+  ool_conmin_function *F;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  set_params(F, p);
+  return p;
+}
+
+static void set_params(ool_conmin_function *F, VALUE p)
+{
+  VALUE ary;
+  if (F->params == NULL) {
+    ary = rb_ary_new2(5);
+    /*    (VALUE) F->params = ary;*/
+    F->params = (void *) ary;
+  } else {
+    ary = (VALUE) F->params;
+  }
+  rb_ary_store(ary, 4, p);
+}
+
+static VALUE rb_ool_conmin_function_params(VALUE obj)
+{
+  ool_conmin_function *F;
+  Data_Get_Struct(obj, ool_conmin_function, F);
+  return rb_ary_entry((VALUE) F->params, 4);
+}
+
+static VALUE rb_ool_conmin_constraint_set(int argc, VALUE *argv, VALUE obj);
+static VALUE rb_ool_conmin_constraint_set_n(VALUE obj, VALUE n);
+static VALUE rb_ool_conmin_constraint_alloc(int argc, VALUE *argv, VALUE klass)
+{
+  ool_conmin_constraint *C;
+  VALUE obj;
+  C = ALLOC(ool_conmin_constraint);
+  C->n = 0;
+  C->L = NULL;
+  C->U = NULL;
+
+  obj = Data_Wrap_Struct(klass, 0, free, C);
+  rb_ool_conmin_constraint_set(argc, argv, obj);
+  return obj;
+}
+
+static VALUE rb_ool_conmin_constraint_set_n(VALUE obj, VALUE n)
+{
+  ool_conmin_constraint *C;
+  if (!FIXNUM_P(n)) rb_raise(rb_eArgError, "Wrong argument type %s (Fixnum expected)",
+                             rb_class2name(CLASS_OF(n)));
+  Data_Get_Struct(obj, ool_conmin_constraint, C);
+  C->n = (size_t) FIX2INT(n);
+  return n;
+}
+
+static VALUE rb_ool_conmin_constraint_set_L(VALUE obj, VALUE vL)
+{
+  ool_conmin_constraint *C;
+  gsl_vector *L;
+  CHECK_VECTOR(vL);
+  Data_Get_Struct(obj, ool_conmin_constraint, C);
+  Data_Get_Struct(vL, gsl_vector, L);
+  C->L = L;
+  return vL;
+}
+
+static VALUE rb_ool_conmin_constraint_set_U(VALUE obj, VALUE vU)
+{
+  ool_conmin_constraint *C;
+  gsl_vector *U;
+  CHECK_VECTOR(vU);
+  Data_Get_Struct(obj, ool_conmin_constraint, C);
+  Data_Get_Struct(vU, gsl_vector, U);
+  C->U = U;
+  return vU;
+}
+
+static VALUE rb_ool_conmin_constraint_set_LU(VALUE obj, VALUE vL, VALUE vU)
+{
+  rb_ool_conmin_constraint_set_L(obj, vL);
+  rb_ool_conmin_constraint_set_U(obj, vU);
+  return obj;
+}
+
+static VALUE rb_ool_conmin_constraint_set(int argc, VALUE *argv, VALUE obj)
+{
+  ool_conmin_constraint *C;
+  Data_Get_Struct(obj, ool_conmin_constraint, C);
+  switch (argc) {
+  case 0:
+    break;
+  case 1:
+    rb_ool_conmin_constraint_set_n(obj, argv[0]);
+    break;
+  case 2:
+    rb_ool_conmin_constraint_set_LU(obj, argv[0], argv[1]);
+    break;
+  case 3:
+    rb_ool_conmin_constraint_set_n(obj, argv[0]);
+    rb_ool_conmin_constraint_set_LU(obj, argv[1], argv[2]);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1-3)", argc);
+  }
+  return obj;
+}
+
+static VALUE rb_ool_conmin_pgrad_parameters_default(VALUE klass)
+{
+  ool_conmin_pgrad_parameters P;
+  VALUE ary;
+  ool_conmin_parameters_default(ool_conmin_minimizer_pgrad, (void*) &P);
+  ary = create_parameters_ary_pgrad(&P);
+  RBGSL_SET_CLASS(ary, cool_conmin_pgrad_parameters);
+  return ary;
+}
+
+static VALUE rb_ool_conmin_spg_parameters_default(VALUE klass)
+{
+  ool_conmin_spg_parameters P;
+  VALUE ary;
+  ool_conmin_parameters_default(ool_conmin_minimizer_spg, (void*) &P);
+  ary = create_parameters_ary_spg(&P);
+  RBGSL_SET_CLASS(ary, cool_conmin_spg_parameters);
+  return ary;
+}
+
+static VALUE rb_ool_conmin_gencan_parameters_default(VALUE klass)
+{
+  ool_conmin_gencan_parameters P;
+  VALUE ary;
+  ool_conmin_parameters_default(ool_conmin_minimizer_gencan, (void*) &P);
+  ary = create_parameters_ary_gencan(&P);
+  RBGSL_SET_CLASS(ary, cool_conmin_gencan_parameters);
+  return ary;
+}
+
+/*************************************************/
+void Init_ool(VALUE module)
+{
+  VALUE mOOL, mConmin;
+  VALUE cool_conmin_minimizer;
+
+  mOOL = rb_define_module("OOL");
+  mConmin = rb_define_module_under(mOOL, "Conmin");
+  cool_conmin_function = rb_define_class_under(mConmin, "Function", cgsl_function);
+  cool_conmin_constraint = rb_define_class_under(mConmin, "Constraint", cGSL_Object);
+  cool_conmin_minimizer = rb_define_class_under(mConmin, "Minimizer", cGSL_Object);
+  cool_conmin_pgrad = rb_define_class_under(cool_conmin_minimizer, "Pgrad", cGSL_Object);
+  cool_conmin_spg = rb_define_class_under(cool_conmin_minimizer, "Spg", cGSL_Object);
+  cool_conmin_gencan = rb_define_class_under(cool_conmin_minimizer, "Gencan", cGSL_Object);
+
+  def_const(mOOL);
+
+  rb_define_singleton_method(cool_conmin_minimizer, "alloc", rb_ool_conmin_minimizer_alloc, -1);
+  rb_define_method(cool_conmin_minimizer, "set", rb_ool_conmin_minimizer_set, -1);
+  rb_define_method(cool_conmin_minimizer, "parameters_default", rb_ool_conmin_minimizer_parameters_default, 0);
+  rb_define_method(cool_conmin_minimizer, "name", rb_ool_conmin_minimizer_name, 0);
+  rb_define_method(cool_conmin_minimizer, "size", rb_ool_conmin_minimizer_size, 0);
+  rb_define_method(cool_conmin_minimizer, "f", rb_ool_conmin_minimizer_f, 0);
+  rb_define_method(cool_conmin_minimizer, "x", rb_ool_conmin_minimizer_x, 0);
+  rb_define_method(cool_conmin_minimizer, "dx", rb_ool_conmin_minimizer_dx, 0);
+  rb_define_method(cool_conmin_minimizer, "gradient", rb_ool_conmin_minimizer_gradient, 0);
+  rb_define_method(cool_conmin_minimizer, "minimum", rb_ool_conmin_minimizer_minimum, 0);
+  rb_define_method(cool_conmin_minimizer, "fcount", rb_ool_conmin_minimizer_fcount, 0);
+  rb_define_method(cool_conmin_minimizer, "gcount", rb_ool_conmin_minimizer_gcount, 0);
+  rb_define_method(cool_conmin_minimizer, "hcount", rb_ool_conmin_minimizer_hcount, 0);
+  rb_define_method(cool_conmin_minimizer, "is_optimal", rb_ool_conmin_minimizer_is_optimal, 0);
+  rb_define_method(cool_conmin_minimizer, "is_optimal?", rb_ool_conmin_minimizer_is_optimal2, 0);
+  rb_define_method(cool_conmin_minimizer, "iterate", rb_ool_conmin_minimizer_iterate, 0);
+  rb_define_method(cool_conmin_minimizer, "restart", rb_ool_conmin_minimizer_restart, 0);
+  rb_define_method(cool_conmin_minimizer, "parameters_get", rb_ool_conmin_minimizer_parameters_get, 0);
+  rb_define_method(cool_conmin_minimizer, "parameters_set", rb_ool_conmin_minimizer_parameters_set, 1);
+
+  rb_define_singleton_method(cool_conmin_function, "alloc", rb_ool_conmin_function_alloc, -1);
+  rb_define_method(cool_conmin_function, "set", rb_ool_conmin_function_set, -1);
+  rb_define_method(cool_conmin_function, "set_n", rb_ool_conmin_function_set_n, 1);
+  rb_define_alias(cool_conmin_function, "n=", "set_n");
+  rb_define_method(cool_conmin_function, "n", rb_ool_conmin_function_n, 0);
+  rb_define_method(cool_conmin_function, "params", rb_ool_conmin_function_params, 0);
+  rb_define_method(cool_conmin_function, "set_params", rb_ool_conmin_function_set_params, 1);
+  rb_define_alias(cool_conmin_function, "params=", "set_params");
+  rb_define_method(cool_conmin_function, "set_functions", rb_ool_conmin_function_set_functions, 1);
+  rb_define_alias(cool_conmin_function, "functions=", "set_functions");
+  rb_define_method(cool_conmin_function, "set_f", rb_ool_conmin_function_set_f, 1);
+  rb_define_alias(cool_conmin_function, "f=", "set_f");
+  rb_define_method(cool_conmin_function, "set_df", rb_ool_conmin_function_set_df, 1);
+  rb_define_alias(cool_conmin_function, "df=", "set_df");
+  rb_define_method(cool_conmin_function, "set_fdf", rb_ool_conmin_function_set_fdf, 1);
+  rb_define_alias(cool_conmin_function, "fdf=", "set_fdf");
+  rb_define_method(cool_conmin_function, "set_Hv", rb_ool_conmin_function_set_Hv, 1);
+  rb_define_alias(cool_conmin_function, "Hv=", "set_Hv");
+
+  rb_define_singleton_method(cool_conmin_constraint, "alloc", rb_ool_conmin_constraint_alloc,
+                             -1);
+  rb_define_method(cool_conmin_constraint, "set", rb_ool_conmin_constraint_set, -1);
+  rb_define_method(cool_conmin_constraint, "set_n", rb_ool_conmin_constraint_set_n, 1);
+  rb_define_alias(cool_conmin_constraint, "n=", "set_n");
+  rb_define_method(cool_conmin_constraint, "set_L", rb_ool_conmin_constraint_set_L, 1);
+  rb_define_alias(cool_conmin_constraint, "L=", "set_L");
+  rb_define_method(cool_conmin_constraint, "set_U", rb_ool_conmin_constraint_set_U, 1);
+  rb_define_alias(cool_conmin_constraint, "U=", "set_U");
+  rb_define_method(cool_conmin_constraint, "set_LU", rb_ool_conmin_constraint_set_LU, 2);
+  rb_define_alias(cool_conmin_constraint, "LU=", "set_LU");
+
+  cool_conmin_pgrad_parameters = rb_define_class_under(cool_conmin_pgrad, "Parameters",
+                                                       rb_cArray);
+  cool_conmin_spg_parameters = rb_define_class_under(cool_conmin_spg, "Parameters",
+                                                     rb_cArray);
+  cool_conmin_gencan_parameters = rb_define_class_under(cool_conmin_gencan, "Parameters",
+                                                        rb_cArray);
+  rb_define_singleton_method(cool_conmin_pgrad, "parameters_default",
+                             rb_ool_conmin_pgrad_parameters_default, 0);
+  rb_define_singleton_method(cool_conmin_spg, "parameters_default",
+                             rb_ool_conmin_spg_parameters_default, 0);
+  rb_define_singleton_method(cool_conmin_gencan, "parameters_default",
+                             rb_ool_conmin_gencan_parameters_default, 0);
+}
+
+#endif
diff --git a/ext/gsl/permutation.c b/ext/gsl_native/permutation.c
similarity index 91%
rename from ext/gsl/permutation.c
rename to ext/gsl_native/permutation.c
index 2740a47..6961829 100644
--- a/ext/gsl/permutation.c
+++ b/ext/gsl_native/permutation.c
@@ -16,9 +16,9 @@
 VALUE rb_gsl_permutation_alloc(VALUE klass, VALUE nn);
 
 /*
- * Creates a new permutation of size n. The permutation is not initialized 
- * and its elements are undefined. Use the method calloc if you want to create 
- * a permutation which is initialized to the identity. 
+ * Creates a new permutation of size n. The permutation is not initialized
+ * and its elements are undefined. Use the method calloc if you want to create
+ * a permutation which is initialized to the identity.
  */
 VALUE rb_gsl_permutation_alloc(VALUE klass, VALUE nn)
 {
@@ -51,12 +51,17 @@ static VALUE rb_gsl_permutation_init(VALUE obj)
   return obj;
 }
 
-void get_range_int_beg_en_n(VALUE range, int *beg, int *en, size_t *n, int *step);
+#ifndef CHECK_RANGE_OFFSET
+#define CHECK_RANGE_OFFSET(i) if (i < -((int) b->size) || i >= ((int) b->size)) \
+    rb_raise(rb_eRangeError, "offset %d out of range", i);
+#endif
+
 static VALUE rb_gsl_permutation_get(int argc, VALUE *argv, VALUE obj)
 {
   gsl_permutation *b, *bnew;
   gsl_index *p;
-  int beg, en, i, step;
+  long beg;
+  int i;
   size_t n, j, k;
   Data_Get_Struct(obj, gsl_permutation, b);
   switch (argc) {
@@ -67,6 +72,7 @@ static VALUE rb_gsl_permutation_get(int argc, VALUE *argv, VALUE obj)
     switch (TYPE(argv[0])) {
     case T_FIXNUM:
       i = FIX2INT(argv[0]);
+      CHECK_RANGE_OFFSET(i);
       if (i < 0) j = b->size + i; else j = (size_t) i;
       return INT2FIX((int) b->data[j]);
       break;
@@ -75,27 +81,30 @@ static VALUE rb_gsl_permutation_get(int argc, VALUE *argv, VALUE obj)
       n = RARRAY_LEN(argv[0]);
       bnew = gsl_permutation_alloc(n);
       for (j = 0; j < n; j++) {
-	i = FIX2INT(rb_ary_entry(argv[0], j));
-	if (i < 0) k = b->size + i; else k = i;
-	bnew->data[j] = b->data[k];
+        i = FIX2INT(rb_ary_entry(argv[0], j));
+        CHECK_RANGE_OFFSET(i);
+        if (i < 0) k = b->size + i; else k = (size_t) i;
+        bnew->data[j] = b->data[k];
       }
-      return Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_permutation_free, bnew);
+      return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_permutation_free, bnew);
       break;
     default:
       if (PERMUTATION_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_index, p);
-	bnew = gsl_permutation_alloc(p->size);
-	for (j = 0; j < p->size; j++) bnew->data[j] = b->data[p->data[j]];
-	return Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_permutation_free, bnew);
+        Data_Get_Struct(argv[0], gsl_index, p);
+        bnew = gsl_permutation_alloc(p->size);
+        for (j = 0; j < p->size; j++) bnew->data[j] = b->data[p->data[j]];
+        return Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_permutation_free, bnew);
       } else if (CLASS_OF(argv[0]) == rb_cRange) {
-	get_range_int_beg_en_n(argv[0], &beg, &en, &n, &step);
-	bnew = gsl_permutation_alloc(n);
-	for (j = 0; j < n; j++) 
-	  bnew->data[j] = b->data[beg+j];
-	return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_permutation_free, bnew);
+        rb_range_beg_len(argv[0], &beg, (long *) &n, (long) b->size, 2);
+        if (n == 0) rb_raise(rb_eRangeError, "range overflow");
+        if (n > b->size) n = b->size;
+        bnew = gsl_permutation_alloc(n);
+        for (j = 0; j < n; j++)
+          bnew->data[j] = b->data[beg+j];
+        return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_permutation_free, bnew);
       } else {
-	rb_raise(rb_eArgError, "wrong argument type %s (Fixnum, Array, or Range expected)", rb_class2name(CLASS_OF(argv[0])));
-	break;
+        rb_raise(rb_eArgError, "wrong argument type %s (Fixnum, Array, or Range expected)", rb_class2name(CLASS_OF(argv[0])));
+        break;
       }
     }
     break;
@@ -112,7 +121,6 @@ static VALUE rb_gsl_permutation_get(int argc, VALUE *argv, VALUE obj)
   return Qnil;
 }
 
-#ifdef GSL_1_1_LATER
 static VALUE rb_gsl_permutation_clone(VALUE obj)
 {
   gsl_permutation *p, *p2 = NULL;
@@ -133,7 +141,6 @@ static VALUE rb_gsl_permutation_memcpy(VALUE obj, VALUE pp1, VALUE pp2)
   gsl_permutation_memcpy(p1, p2);
   return pp1;
 }
-#endif
 
 static VALUE rb_gsl_permutation_swap(VALUE obj, VALUE i, VALUE j)
 {
@@ -271,7 +278,6 @@ static VALUE rb_gsl_permute_vector_inverse(VALUE obj, VALUE pp, VALUE vv)
 }
 
 /* singleton method */
-#ifdef GSL_1_2_LATER
 static VALUE rb_gsl_permutation_mul(VALUE obj, VALUE ppa, VALUE ppb)
 {
   gsl_permutation *p = NULL;
@@ -291,7 +297,6 @@ static VALUE rb_gsl_permutation_mul(VALUE obj, VALUE ppa, VALUE ppb)
   if (flag == 1) return obj;
   else return Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
 }
-#endif
 
 static VALUE rb_gsl_permutation_print(VALUE obj);
 
@@ -367,9 +372,8 @@ static VALUE rb_gsl_permutation_fprintf(int argc, VALUE *argv, VALUE obj)
   FILE *fp = NULL;
   int status, flag = 0;
 
-  if (argc != 1 && argc != 2) rb_raise(rb_eArgError, 
-				       "wrong number of arguments (%d for 1 or 2)", argc);
-
+  if (argc != 1 && argc != 2) rb_raise(rb_eArgError,
+                                       "wrong number of arguments (%d for 1 or 2)", argc);
   Data_Get_Struct(obj, gsl_permutation, h);
   fp = rb_gsl_open_writefile(argv[0], &flag);
   if (argc == 1) {
@@ -409,7 +413,6 @@ static VALUE rb_gsl_permutation_fscanf(VALUE obj, VALUE io)
   return INT2FIX(status);
 }
 
-#ifdef GSL_1_2_LATER
 static VALUE rb_gsl_permutation_linear_to_canonical(int argc, VALUE *argv, VALUE obj)
 {
   gsl_permutation *p, *q;
@@ -476,7 +479,6 @@ static VALUE rb_gsl_permutation_canonical_cycles(VALUE obj)
   Data_Get_Struct(obj, gsl_permutation, p);
   return INT2FIX(gsl_permutation_canonical_cycles(p));
 }
-#endif
 
 static VALUE rb_gsl_vector_permute(VALUE obj, VALUE pp)
 {
@@ -537,10 +539,8 @@ void Init_gsl_permutation(VALUE module)
   rb_define_alias(cgsl_permutation, "[]", "get");
   rb_define_method(cgsl_permutation, "set", rb_gsl_permutation_set, 2);
   rb_define_alias(cgsl_permutation, "[]=", "set");
-#ifdef GSL_1_1_LATER
   rb_define_singleton_method(cgsl_permutation, "memcpy", rb_gsl_permutation_memcpy, 2);
   rb_define_method(cgsl_permutation, "clone", rb_gsl_permutation_clone, 0);
-#endif
   rb_define_method(cgsl_permutation, "swap", rb_gsl_permutation_swap, 2);
   rb_define_method(cgsl_permutation, "valid", rb_gsl_permutation_valid, 0);
   rb_define_method(cgsl_permutation, "valid?", rb_gsl_permutation_valid2, 0);
@@ -556,7 +556,7 @@ void Init_gsl_permutation(VALUE module)
   rb_define_alias(cgsl_permutation, "permute", "permute_vector");
   rb_define_method(cgsl_permutation, "permute_vector_inverse", rb_gsl_permutation_permute_vector_inverse, 1);
   rb_define_alias(cgsl_permutation, "permute_inverse", "permute_vector_inverse");
-  
+
   rb_define_singleton_method(cgsl_permutation, "permute_vector", rb_gsl_permute_vector, 2);
   rb_define_singleton_method(cgsl_permutation, "permute_vector_inverse", rb_gsl_permute_vector_inverse, 2);
   rb_define_module_function(module, "permute_vector", rb_gsl_permute_vector, 2);
@@ -574,7 +574,6 @@ void Init_gsl_permutation(VALUE module)
   rb_define_method(cgsl_permutation, "fscanf", rb_gsl_permutation_fscanf, 1);
   rb_define_method(cgsl_permutation, "print", rb_gsl_permutation_print, 0);
 
-#ifdef GSL_1_2_LATER
   rb_define_singleton_method(cgsl_permutation, "mul", rb_gsl_permutation_mul, 2);
   rb_define_method(cgsl_permutation, "mul", rb_gsl_permutation_mul, 2);
   rb_define_method(cgsl_permutation, "linear_to_canonical", rb_gsl_permutation_linear_to_canonical, -1);
@@ -585,7 +584,6 @@ void Init_gsl_permutation(VALUE module)
   rb_define_method(cgsl_permutation, "inversions", rb_gsl_permutation_inversions, 0);
   rb_define_method(cgsl_permutation, "linear_cycles", rb_gsl_permutation_linear_cycles, 0);
   rb_define_method(cgsl_permutation, "canonical_cycles", rb_gsl_permutation_canonical_cycles, 0);
-#endif
 
   rb_define_method(cgsl_vector, "permute", rb_gsl_vector_permute, 1);
   rb_define_method(cgsl_vector, "permute_inverse", rb_gsl_vector_permute_inverse, 1);
@@ -594,3 +592,7 @@ void Init_gsl_permutation(VALUE module)
   rb_define_alias(cgsl_permutation, "==", "equal?");
 
 }
+
+#ifdef CHECK_RANGE_OFFSET
+#undef CHECK_RANGE_OFFSET
+#endif
diff --git a/ext/gsl/poly.c b/ext/gsl_native/poly.c
similarity index 90%
rename from ext/gsl/poly.c
rename to ext/gsl_native/poly.c
index cf32c2d..079ee1b 100644
--- a/ext/gsl/poly.c
+++ b/ext/gsl_native/poly.c
@@ -12,9 +12,6 @@
 #include "include/rb_gsl_poly.h"
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_common.h"
-#ifdef HAVE_NARARY_H
-#include "narray.h"
-#endif
 
 void Init_gsl_poly_init(VALUE module);
 void Init_gsl_poly_int_init(VALUE module);
@@ -22,7 +19,7 @@ void Init_gsl_poly2(VALUE module);
 
 #define BASE_DOUBLE
 #include "include/templates_on.h"
-#include "poly_source.c"
+#include "poly_source.h"
 #include "include/templates_off.h"
 void Init_gsl_poly(VALUE module)
 {
@@ -33,7 +30,7 @@ void Init_gsl_poly(VALUE module)
 
 #define BASE_INT
 #include "include/templates_on.h"
-#include "poly_source.c"
+#include "poly_source.h"
 #include "include/templates_off.h"
 void Init_gsl_poly_int(VALUE module)
 {
diff --git a/ext/gsl/poly2.c b/ext/gsl_native/poly2.c
similarity index 96%
rename from ext/gsl/poly2.c
rename to ext/gsl_native/poly2.c
index 4069bbe..a775441 100644
--- a/ext/gsl/poly2.c
+++ b/ext/gsl_native/poly2.c
@@ -48,7 +48,7 @@ static gsl_poly_int* mygsl_poly_hermite(int n1)
       gsl_vector_int_memcpy(p1, p0);
     }
     gsl_vector_int_free(p2);
-    gsl_vector_int_free(p1);    
+    gsl_vector_int_free(p1);
     break;
   }
   return p0;
@@ -87,7 +87,7 @@ static gsl_poly_int* mygsl_poly_cheb(int n1)
       gsl_vector_int_memcpy(p1, p0);
     }
     gsl_vector_int_free(p2);
-    gsl_vector_int_free(p1);    
+    gsl_vector_int_free(p1);
     break;
   }
   return p0;
@@ -125,7 +125,7 @@ static gsl_poly_int* mygsl_poly_chebII(int n1)
       gsl_vector_int_memcpy(p1, p0);
     }
     gsl_vector_int_free(p2);
-    gsl_vector_int_free(p1);    
+    gsl_vector_int_free(p1);
     break;
   }
   return p0;
@@ -195,7 +195,7 @@ static gsl_poly_int* mygsl_poly_bell(int n1)
       gsl_vector_int_memcpy(p0, p1);
       mygsl_vector_int_shift(p0, n);
       for (j = 0; j < n; j++) {
-	gsl_vector_int_set(p1, j, gsl_vector_int_get(p1, j+1)*(j+1));
+        gsl_vector_int_set(p1, j, gsl_vector_int_get(p1, j+1)*(j+1));
       }
       gsl_vector_int_set(p1, n, 0);
       mygsl_vector_int_shift(p1, n);
@@ -203,14 +203,14 @@ static gsl_poly_int* mygsl_poly_bell(int n1)
       /* save for the next iteration */
       gsl_vector_int_memcpy(p1, p0);
     }
-    gsl_vector_int_free(p1);    
+    gsl_vector_int_free(p1);
     break;
   }
   return p0;
 }
 
 static VALUE rb_gsl_poly_define_poly(VALUE klass, VALUE order,
-				     gsl_poly_int* (*f)(int n1)) {
+                                     gsl_poly_int* (*f)(int n1)) {
   int n1;
   gsl_poly_int *pnew = NULL;
   CHECK_FIXNUM(order);
diff --git a/ext/gsl/poly_source.c b/ext/gsl_native/poly_source.h
similarity index 80%
rename from ext/gsl/poly_source.c
rename to ext/gsl_native/poly_source.h
index 52aa52e..914456a 100644
--- a/ext/gsl/poly_source.c
+++ b/ext/gsl_native/poly_source.h
@@ -51,28 +51,21 @@
 VALUE cgsl_poly, cgsl_poly_int;
 VALUE cgsl_poly_workspace;
 VALUE cgsl_poly_complex_workspace;
-#ifdef GSL_1_1_LATER
 VALUE cgsl_poly_dd;
 VALUE cgsl_poly_taylor;
 #endif
-#endif
 
 #ifdef BASE_INT
 double gsl_poly_int_eval(const BASE c[], const int len, const double x)
 {
   int i;
   double ans = (double) c[len-1];
-  for(i=len-1; i>0; i--) ans = (double) c[i-1] + x * ans;
+  for(i = len-1; i>0; i--) ans = (double) c[i-1] + x * ans;
   return ans;
 }
 #endif
 #ifdef BASE_DOUBLE
-#ifdef HAVE_NARRAY_H
-#include "include/rb_gsl_with_narray.h"
-#endif
-#ifdef GSL_1_11_LATER
 static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b);
-#endif
 static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
 {
   gsl_vector *v = NULL, *vx, *vnew;
@@ -82,22 +75,15 @@ static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
   size_t i, N, n;
   VALUE val;
   double *ptr0;
-  double *ptr1, *ptr2;  
-#ifdef HAVE_NARRAY_H
-  int shape[1];
-#endif  
-#ifdef GSL_1_11_LATER
+  double *ptr1, *ptr2;
   gsl_complex *z, zz;
   gsl_vector_complex *vz, *vznew;
-  if (rb_obj_is_kind_of(a, cgsl_vector_complex)) 
+  if (rb_obj_is_kind_of(a, cgsl_vector_complex))
     return rb_gsl_complex_poly_complex_eval(a, x);
-#endif
   switch (TYPE(a)) {
   case T_ARRAY:
-#ifdef GSL_1_11_LATER
-    if (rb_obj_is_kind_of(rb_ary_entry(a, 0), cgsl_complex)) 
+    if (rb_obj_is_kind_of(rb_ary_entry(a, 0), cgsl_complex))
       return rb_gsl_complex_poly_complex_eval(a, x);
-#endif
     v = make_cvector_from_rarray(a);
     N = v->size;
     ptr0 = v->data;
@@ -115,7 +101,7 @@ static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
 #endif
     } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (Array, GSL::Vector or NArray expected)",
-        rb_class2name(CLASS_OF(a)));
+               rb_class2name(CLASS_OF(a)));
     }
   }
   switch (TYPE(x)) {
@@ -123,7 +109,7 @@ static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
   case T_BIGNUM:
   case T_FLOAT:
     val = rb_float_new(gsl_poly_eval(ptr0, N, NUM2DBL(x)));
-    break;    
+    break;
   case T_ARRAY:
     n = RARRAY_LEN(x);
     val = rb_ary_new2(n);
@@ -131,7 +117,7 @@ static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
       rslt = gsl_poly_eval(ptr0, N, NUM2DBL(rb_ary_entry(x, i)));
       rb_ary_store(val, i, rb_float_new(rslt));
     }
-    break;  
+    break;
   default:
     if (rb_obj_is_kind_of(x, cgsl_vector)) {
       Data_Get_Struct(x, gsl_vector, vx);
@@ -143,19 +129,19 @@ static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
     } else if (rb_obj_is_kind_of(x, cgsl_matrix)) {
       Data_Get_Struct(x, gsl_matrix, mx);
       mnew = gsl_matrix_alloc(mx->size1, mx->size2);
-      val = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);      
+      val = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
       n = mx->size1*mx->size2;
       ptr1 = mx->data;
       ptr2 = mnew->data;
 #ifdef HAVE_NARRAY_H
     } else if (NA_IsNArray(x)) {
+      int shape[1];
       shape[0] = NA_TOTAL(x);
       n = shape[0];
       val = na_make_object(NA_DFLOAT, 1, shape, CLASS_OF(x));
       ptr1 = NA_PTR_TYPE(x, double*);
-      ptr2 = NA_PTR_TYPE(val, double*);      
+      ptr2 = NA_PTR_TYPE(val, double*);
 #endif
-#ifdef GSL_1_11_LATER
     } else if (rb_obj_is_kind_of(x, cgsl_complex)) {
       Data_Get_Struct(x, gsl_complex, z);
       zz = gsl_poly_complex_eval(ptr0, N, *z);
@@ -166,15 +152,14 @@ static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
       Data_Get_Struct(x, gsl_vector_complex, vz);
       vznew = gsl_vector_complex_alloc(vz->size);
       for (i = 0; i < vz->size; i++) {
-	zz = gsl_poly_complex_eval(ptr0, N, gsl_vector_complex_get(vz, i));
-	gsl_vector_complex_set(vznew, i, zz);
+        zz = gsl_poly_complex_eval(ptr0, N, gsl_vector_complex_get(vz, i));
+        gsl_vector_complex_set(vznew, i, zz);
       }
       if (flag == 1) gsl_vector_free(v);
       return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vznew);
-#endif
     } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s (A number, Array, GSL::Vector or NArray expected)",
-        rb_class2name(CLASS_OF(a)));      
+               rb_class2name(CLASS_OF(a)));
     }
     for (i = 0; i < n; i++) {
       ptr2[i] = gsl_poly_eval(ptr0, N, ptr1[i]);
@@ -183,7 +168,7 @@ static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
   if (flag == 1) gsl_vector_free(v);
   return val;
 }
-#ifdef GSL_1_11_LATER
+
 static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b)
 {
   gsl_vector_complex *coef = NULL, *zb, *vnew;
@@ -207,7 +192,6 @@ static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b)
   } else {
     rb_raise(rb_eTypeError, "rb_gsl_complex_poly_complex_solve: wrong argument type %s (GSL::Vector::Complex or Array expected)\n", rb_class2name(CLASS_OF(a)));
   }
-
   switch (TYPE(b)) {
   case T_FIXNUM:
   case T_BIGNUM:
@@ -238,8 +222,8 @@ static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b)
       vnew = gsl_vector_complex_alloc(zb->size);
       ret = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
       for (i = 0; i < zb->size; i++) {
-	z = gsl_vector_complex_get(zb, i);
-	gsl_vector_complex_set(vnew, i, gsl_complex_poly_complex_eval(zc, N, z));
+        z = gsl_vector_complex_get(zb, i);
+        gsl_vector_complex_set(vnew, i, gsl_complex_poly_complex_eval(zc, N, z));
       }
     } else {
       rb_raise(rb_eTypeError, "Wrong argument type %s.\n", rb_class2name(CLASS_OF(b)));
@@ -249,7 +233,6 @@ static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b)
   return ret;
 }
 #endif
-#endif
 
 static VALUE FUNCTION(rb_gsl_poly,eval)(VALUE obj, VALUE xx)
 {
@@ -261,16 +244,9 @@ static VALUE FUNCTION(rb_gsl_poly,eval)(VALUE obj, VALUE xx)
   VALUE x, ary;
   size_t i, j;
 #ifdef BASE_DOUBLE
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-  size_t n;
-#endif
-#ifdef GSL_1_11_LATER
   gsl_complex *z, zz;
   gsl_vector_complex *vz, *vznew;
 #endif
-#endif
 
   Data_Get_Struct(obj, GSL_TYPE(gsl_poly), p);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
@@ -293,6 +269,9 @@ static VALUE FUNCTION(rb_gsl_poly,eval)(VALUE obj, VALUE xx)
 #ifdef BASE_DOUBLE
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
+      size_t n;
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
       n = na->total;
@@ -307,21 +286,20 @@ static VALUE FUNCTION(rb_gsl_poly,eval)(VALUE obj, VALUE xx)
       Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_vector,get)(v, i)));
+        gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_vector,get)(v, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MAT_P(xx)) {
       Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, 
-			 FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_matrix,get)(m, i, j)));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j,
+                         FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_matrix,get)(m, i, j)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
 #ifdef BASE_DOUBLE
-#ifdef GSL_1_11_LATER
     } else if (rb_obj_is_kind_of(xx, cgsl_complex)) {
       Data_Get_Struct(xx, gsl_complex, z);
       zz = gsl_poly_complex_eval(p->data, p->size, *z);
@@ -331,12 +309,11 @@ static VALUE FUNCTION(rb_gsl_poly,eval)(VALUE obj, VALUE xx)
       Data_Get_Struct(xx, gsl_vector_complex, vz);
       vznew = gsl_vector_complex_alloc(vz->size);
       for (i = 0; i < vz->size; i++) {
-	zz = gsl_poly_complex_eval(p->data, p->size, gsl_vector_complex_get(vz, i));
-	gsl_vector_complex_set(vznew, i, zz);
+        zz = gsl_poly_complex_eval(p->data, p->size, gsl_vector_complex_get(vz, i));
+        gsl_vector_complex_set(vznew, i, zz);
       }
       return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vznew);
 #endif
-#endif
     } else {
       rb_raise(rb_eTypeError, "wrong argument type");
     }
@@ -355,12 +332,6 @@ static VALUE FUNCTION(rb_gsl_poly,eval2)(int argc, VALUE *argv, VALUE obj)
   gsl_matrix  *mnew = NULL;
   VALUE xx, x, ary;
   size_t i, j, size;
-#ifdef BASE_DOUBLE
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
-#endif
   switch (argc) {
   case 2:
     Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), p);
@@ -396,6 +367,8 @@ static VALUE FUNCTION(rb_gsl_poly,eval2)(int argc, VALUE *argv, VALUE obj)
 #ifdef BASE_DOUBLE
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       GetNArray(xx, na);
       ptr1 = (double*) na->ptr;
       size = na->total;
@@ -410,17 +383,17 @@ static VALUE FUNCTION(rb_gsl_poly,eval2)(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_vector,get)(v, i)));
+        gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_vector,get)(v, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MAT_P(xx)) {
       Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, 
-			 FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_matrix,get)(m, i, j)));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j,
+                         FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_matrix,get)(m, i, j)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -441,29 +414,29 @@ static VALUE FUNCTION(rb_gsl_poly,solve_quadratic)(int argc, VALUE *argv, VALUE
   switch (argc) {
   case 3:
     n = gsl_poly_solve_quadratic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
-				 &x0, &x1);
+                                 &x0, &x1);
     break;
   case 1:
     switch (TYPE(argv[0])) {
     case T_ARRAY:
-      n = gsl_poly_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)), 
-				   NUMCONV2(rb_ary_entry(argv[0], 1)),
-				   NUMCONV2(rb_ary_entry(argv[0], 2)),
-				   &x0, &x1);
+      n = gsl_poly_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)),
+                                   NUMCONV2(rb_ary_entry(argv[0], 1)),
+                                   NUMCONV2(rb_ary_entry(argv[0], 2)),
+                                   &x0, &x1);
       break;
     default:
       CHECK_VEC(argv[0]);
       Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), v);
       n = gsl_poly_solve_quadratic(FUNCTION(gsl_vector,get)(v, 0),
-				   FUNCTION(gsl_vector,get)(v, 1),
-				   FUNCTION(gsl_vector,get)(v, 2),
-				   &x0, &x1);
+                                   FUNCTION(gsl_vector,get)(v, 1),
+                                   FUNCTION(gsl_vector,get)(v, 2),
+                                   &x0, &x1);
       break;
     }
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments (3 numbers or 1 array or 1 vector)");
+    rb_raise(rb_eArgError,
+             "wrong number of arguments (3 numbers or 1 array or 1 vector)");
     break;
   }
   // If n == 0, we want to return an empty gsl_vector, but gsl_vectors can'y be
@@ -473,8 +446,8 @@ static VALUE FUNCTION(rb_gsl_poly,solve_quadratic)(int argc, VALUE *argv, VALUE
   }
   r = gsl_vector_alloc(n);
   switch(n) {
-    case 2: gsl_vector_set(r, 1, x1); /* fall through */
-    case 1: gsl_vector_set(r, 0, x0);
+  case 2: gsl_vector_set(r, 1, x1);   /* fall through */
+  case 1: gsl_vector_set(r, 0, x0);
   }
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
 }
@@ -487,31 +460,31 @@ static VALUE FUNCTION(rb_gsl_poly,complex_solve_quadratic)(int argc, VALUE *argv
   int n;
   switch (argc) {
   case 3:
-    n = gsl_poly_complex_solve_quadratic(NUMCONV2(argv[0]), 
-					 NUMCONV2(argv[1]), NUMCONV2(argv[2]),
-					 &z0, &z1);
+    n = gsl_poly_complex_solve_quadratic(NUMCONV2(argv[0]),
+                                         NUMCONV2(argv[1]), NUMCONV2(argv[2]),
+                                         &z0, &z1);
     break;
   case 1:
     switch (TYPE(argv[0])) {
     case T_ARRAY:
-      n = gsl_poly_complex_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)), 
-					   NUMCONV2(rb_ary_entry(argv[0], 1)),
-					   NUMCONV2(rb_ary_entry(argv[0], 2)),
-					   &z0, &z1);
+      n = gsl_poly_complex_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)),
+                                           NUMCONV2(rb_ary_entry(argv[0], 1)),
+                                           NUMCONV2(rb_ary_entry(argv[0], 2)),
+                                           &z0, &z1);
       break;
     default:
       CHECK_VEC(argv[0]);
       Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
       n = gsl_poly_complex_solve_quadratic(FUNCTION(gsl_vector,get)(v, 0),
-					   FUNCTION(gsl_vector,get)(v, 1),
-					   FUNCTION(gsl_vector,get)(v, 2),
-					   &z0, &z1);
+                                           FUNCTION(gsl_vector,get)(v, 1),
+                                           FUNCTION(gsl_vector,get)(v, 2),
+                                           &z0, &z1);
       break;
     }
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments (3 numbers or 1 array or 1 vector)");
+    rb_raise(rb_eArgError,
+             "wrong number of arguments (3 numbers or 1 array or 1 vector)");
     break;
   }
   // If n == 0, we want to return an empty gsl_vector, but gsl_vectors can'y be
@@ -521,8 +494,8 @@ static VALUE FUNCTION(rb_gsl_poly,complex_solve_quadratic)(int argc, VALUE *argv
   }
   r = gsl_vector_complex_alloc(n);
   switch(n) {
-    case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
-    case 1: gsl_vector_complex_set(r, 0, z0);
+  case 2: gsl_vector_complex_set(r, 1, z1);   /* fall through */
+  case 1: gsl_vector_complex_set(r, 0, z0);
   }
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
 }
@@ -536,36 +509,36 @@ static VALUE FUNCTION(rb_gsl_poly,solve_cubic)(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 3:
     n = gsl_poly_solve_cubic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
-			     &x0, &x1, &x2);
+                             &x0, &x1, &x2);
     break;
   case 1:
     switch (TYPE(argv[0])) {
     case T_ARRAY:
-      n = gsl_poly_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)), 
-				   NUMCONV2(rb_ary_entry(argv[0], 1)),
-				   NUMCONV2(rb_ary_entry(argv[0], 2)),
-				   &x0, &x1, &x2);
+      n = gsl_poly_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)),
+                               NUMCONV2(rb_ary_entry(argv[0], 1)),
+                               NUMCONV2(rb_ary_entry(argv[0], 2)),
+                               &x0, &x1, &x2);
       break;
     default:
       CHECK_VEC(argv[0]);
       Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
       n = gsl_poly_solve_cubic(FUNCTION(gsl_vector,get)(v, 0),
-				   FUNCTION(gsl_vector,get)(v, 1),
-				   FUNCTION(gsl_vector,get)(v, 2),
-				   &x0, &x1, &x2);
+                               FUNCTION(gsl_vector,get)(v, 1),
+                               FUNCTION(gsl_vector,get)(v, 2),
+                               &x0, &x1, &x2);
       break;
     }
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments (3 numbers or 1 array or 1 vector)");
+    rb_raise(rb_eArgError,
+             "wrong number of arguments (3 numbers or 1 array or 1 vector)");
     break;
   }
   r = gsl_vector_alloc(n);
   switch(n) {
-    case 3: gsl_vector_set(r, 2, x2); /* fall through */
-    case 2: gsl_vector_set(r, 1, x1); /* fall through */
-    case 1: gsl_vector_set(r, 0, x0);
+  case 3: gsl_vector_set(r, 2, x2);   /* fall through */
+  case 2: gsl_vector_set(r, 1, x1);   /* fall through */
+  case 1: gsl_vector_set(r, 0, x0);
   }
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
 }
@@ -579,36 +552,36 @@ static VALUE FUNCTION(rb_gsl_poly,complex_solve_cubic)(int argc, VALUE *argv, VA
   switch (argc) {
   case 3:
     n = gsl_poly_complex_solve_cubic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
-				     &z0, &z1, &z2);
+                                     &z0, &z1, &z2);
     break;
   case 1:
     switch (TYPE(argv[0])) {
     case T_ARRAY:
-      n = gsl_poly_complex_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)), 
-				   NUMCONV2(rb_ary_entry(argv[0], 1)),
-				   NUMCONV2(rb_ary_entry(argv[0], 2)),
-				   &z0, &z1, &z2);
+      n = gsl_poly_complex_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)),
+                                       NUMCONV2(rb_ary_entry(argv[0], 1)),
+                                       NUMCONV2(rb_ary_entry(argv[0], 2)),
+                                       &z0, &z1, &z2);
       break;
     default:
       CHECK_VEC(argv[0]);
       Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
       n = gsl_poly_complex_solve_cubic(FUNCTION(gsl_vector,get)(v, 0),
-				   FUNCTION(gsl_vector,get)(v, 1),
-				   FUNCTION(gsl_vector,get)(v, 2),
-				   &z0, &z1, &z2);
+                                       FUNCTION(gsl_vector,get)(v, 1),
+                                       FUNCTION(gsl_vector,get)(v, 2),
+                                       &z0, &z1, &z2);
       break;
     }
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments (3 numbers or 1 array or 1 vector)");
+    rb_raise(rb_eArgError,
+             "wrong number of arguments (3 numbers or 1 array or 1 vector)");
     break;
   }
   r = gsl_vector_complex_alloc(n);
   switch(n) {
-    case 3: gsl_vector_complex_set(r, 2, z2); /* fall through */
-    case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
-    case 1: gsl_vector_complex_set(r, 0, z0);
+  case 3: gsl_vector_complex_set(r, 2, z2);   /* fall through */
+  case 2: gsl_vector_complex_set(r, 1, z1);   /* fall through */
+  case 1: gsl_vector_complex_set(r, 0, z0);
   }
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
 }
@@ -623,40 +596,40 @@ static VALUE FUNCTION(rb_gsl_poly,solve_quartic)(int argc, VALUE *argv, VALUE ob
   switch (argc) {
   case 4:
     n = gsl_poly_solve_quartic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
-			       NUMCONV2(argv[3]),
-			       &x0, &x1, &x2, &x3);
+                               NUMCONV2(argv[3]),
+                               &x0, &x1, &x2, &x3);
     break;
   case 1:
     switch (TYPE(argv[0])) {
     case T_ARRAY:
-      n = gsl_poly_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)), 
-			       NUMCONV2(rb_ary_entry(argv[0], 1)),
-			       NUMCONV2(rb_ary_entry(argv[0], 2)),
-			       NUMCONV2(rb_ary_entry(argv[0], 3)),
-			       &x0, &x1, &x2, &x3);
+      n = gsl_poly_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)),
+                                 NUMCONV2(rb_ary_entry(argv[0], 1)),
+                                 NUMCONV2(rb_ary_entry(argv[0], 2)),
+                                 NUMCONV2(rb_ary_entry(argv[0], 3)),
+                                 &x0, &x1, &x2, &x3);
       break;
     default:
       CHECK_VEC(argv[0]);
       Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
       n = gsl_poly_solve_quartic(FUNCTION(gsl_vector,get)(v, 0),
-			       FUNCTION(gsl_vector,get)(v, 1),
-			       FUNCTION(gsl_vector,get)(v, 2),
-			       FUNCTION(gsl_vector,get)(v, 3),
-			       &x0, &x1, &x2, &x3);
+                                 FUNCTION(gsl_vector,get)(v, 1),
+                                 FUNCTION(gsl_vector,get)(v, 2),
+                                 FUNCTION(gsl_vector,get)(v, 3),
+                                 &x0, &x1, &x2, &x3);
       break;
     }
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments (3 numbers or 1 array or 1 vector)");
+    rb_raise(rb_eArgError,
+             "wrong number of arguments (3 numbers or 1 array or 1 vector)");
     break;
   }
   r = gsl_vector_alloc(n);
   switch(n) {
-    case 4: gsl_vector_set(r, 3, x3); /* fall through */
-    case 3: gsl_vector_set(r, 2, x2); /* fall through */
-    case 2: gsl_vector_set(r, 1, x1); /* fall through */
-    case 1: gsl_vector_set(r, 0, x0);
+  case 4: gsl_vector_set(r, 3, x3);   /* fall through */
+  case 3: gsl_vector_set(r, 2, x2);   /* fall through */
+  case 2: gsl_vector_set(r, 1, x1);   /* fall through */
+  case 1: gsl_vector_set(r, 0, x0);
   }
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
 }
@@ -669,41 +642,41 @@ static VALUE FUNCTION(rb_gsl_poly,complex_solve_quartic)(int argc, VALUE *argv,
   int n;
   switch (argc) {
   case 4:
-    n = gsl_poly_complex_solve_quartic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), 
-				       NUMCONV2(argv[2]), NUMCONV2(argv[3]),
-				       &z0, &z1, &z2, &z3);
+    n = gsl_poly_complex_solve_quartic(NUMCONV2(argv[0]), NUMCONV2(argv[1]),
+                                       NUMCONV2(argv[2]), NUMCONV2(argv[3]),
+                                       &z0, &z1, &z2, &z3);
     break;
   case 1:
     switch (TYPE(argv[0])) {
     case T_ARRAY:
-      n = gsl_poly_complex_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)), 
-					 NUMCONV2(rb_ary_entry(argv[0], 1)),
-					 NUMCONV2(rb_ary_entry(argv[0], 2)),
-					 NUMCONV2(rb_ary_entry(argv[0], 3)),
-					 &z0, &z1, &z2, &z3);
+      n = gsl_poly_complex_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)),
+                                         NUMCONV2(rb_ary_entry(argv[0], 1)),
+                                         NUMCONV2(rb_ary_entry(argv[0], 2)),
+                                         NUMCONV2(rb_ary_entry(argv[0], 3)),
+                                         &z0, &z1, &z2, &z3);
       break;
     default:
       CHECK_VEC(argv[0]);
       Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
       n = gsl_poly_complex_solve_quartic(FUNCTION(gsl_vector,get)(v, 0),
-					 FUNCTION(gsl_vector,get)(v, 1),
-					 FUNCTION(gsl_vector,get)(v, 2),
-					 FUNCTION(gsl_vector,get)(v, 3),
-					 &z0, &z1, &z2, &z3);
+                                         FUNCTION(gsl_vector,get)(v, 1),
+                                         FUNCTION(gsl_vector,get)(v, 2),
+                                         FUNCTION(gsl_vector,get)(v, 3),
+                                         &z0, &z1, &z2, &z3);
       break;
     }
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "wrong number of arguments (3 numbers or 1 array or 1 vector)");
+    rb_raise(rb_eArgError,
+             "wrong number of arguments (3 numbers or 1 array or 1 vector)");
     break;
   }
   r = gsl_vector_complex_alloc(n);
   switch(n) {
-    case 4: gsl_vector_complex_set(r, 0, z0); /* fall through */
-    case 3: gsl_vector_complex_set(r, 1, z1); /* fall through */
-    case 2: gsl_vector_complex_set(r, 2, z2); /* fall through */
-    case 1: gsl_vector_complex_set(r, 3, z3);
+  case 4: gsl_vector_complex_set(r, 0, z0);   /* fall through */
+  case 3: gsl_vector_complex_set(r, 1, z1);   /* fall through */
+  case 2: gsl_vector_complex_set(r, 2, z2);   /* fall through */
+  case 1: gsl_vector_complex_set(r, 3, z3);
   }
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
 }
@@ -809,20 +782,19 @@ static VALUE FUNCTION(rb_gsl_poly,solve_quadratic2)(VALUE obj)
     n = gsl_poly_solve_quadratic(a2, a1, a0, &x0, &x1);
     r = gsl_vector_alloc(n);
     switch(n) {
-      case 2: gsl_vector_set(r, 1, x1); /* fall through */
-      case 1: gsl_vector_set(r, 0, x0);
+    case 2: gsl_vector_set(r, 1, x1);   /* fall through */
+    case 1: gsl_vector_set(r, 0, x0);
     }
     return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
   } else {
     n = gsl_poly_complex_solve_quadratic(a2, a1, a0, &z0, &z1);
     r2 = gsl_vector_complex_alloc(n);
     switch(n) {
-      case 2: gsl_vector_complex_set(r2, 1, z1); /* fall through */
-      case 1: gsl_vector_complex_set(r2, 0, z0);
+    case 2: gsl_vector_complex_set(r2, 1, z1);   /* fall through */
+    case 1: gsl_vector_complex_set(r2, 0, z0);
     }
     return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r2);
   }
-
 }
 
 
@@ -843,8 +815,8 @@ static VALUE FUNCTION(rb_gsl_poly,complex_solve_quadratic2)(VALUE obj)
   n = gsl_poly_complex_solve_quadratic(a2, a1, a0, &z0, &z1);
   r = gsl_vector_complex_alloc(n);
   switch(n) {
-    case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
-    case 1: gsl_vector_complex_set(r, 0, z0);
+  case 2: gsl_vector_complex_set(r, 1, z1);   /* fall through */
+  case 1: gsl_vector_complex_set(r, 0, z0);
   }
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
 }
@@ -862,16 +834,16 @@ static VALUE FUNCTION(rb_gsl_poly,solve_cubic2)(VALUE obj)
   if (v->size < 4) {
     rb_raise(rb_eArgError, "the order of the object is less than 4.");
   }
-  a3 = FUNCTION(gsl_vector,get)(v, 3);   
+  a3 = FUNCTION(gsl_vector,get)(v, 3);
   a2 = FUNCTION(gsl_vector,get)(v, 2)/a3;   /* coefficients */
   a1 = FUNCTION(gsl_vector,get)(v, 1)/a3;
   a0 = FUNCTION(gsl_vector,get)(v, 0)/a3;
   n = gsl_poly_solve_cubic(a2, a1, a0, &x0, &x1, &x2);
   r = gsl_vector_alloc(n);
   switch(n) {
-    case 3: gsl_vector_set(r, 2, x2); /* fall through */
-    case 2: gsl_vector_set(r, 1, x1); /* fall through */
-    case 1: gsl_vector_set(r, 0, x0);
+  case 3: gsl_vector_set(r, 2, x2);   /* fall through */
+  case 2: gsl_vector_set(r, 1, x1);   /* fall through */
+  case 1: gsl_vector_set(r, 0, x0);
   }
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
 }
@@ -887,16 +859,16 @@ static VALUE FUNCTION(rb_gsl_poly,complex_solve_cubic2)(VALUE obj)
   if (v->size < 4) {
     rb_raise(rb_eArgError, "the order of the object is less than 4.");
   }
-  a3 = FUNCTION(gsl_vector,get)(v, 3);   
+  a3 = FUNCTION(gsl_vector,get)(v, 3);
   a2 = FUNCTION(gsl_vector,get)(v, 2)/a3;   /* coefficients */
   a1 = FUNCTION(gsl_vector,get)(v, 1)/a3;
   a0 = FUNCTION(gsl_vector,get)(v, 0)/a3;
   n = gsl_poly_complex_solve_cubic(a2, a1, a0, &z0, &z1, &z2);
   r = gsl_vector_complex_alloc(n);
   switch(n) {
-    case 3: gsl_vector_complex_set(r, 2, z2); /* fall through */
-    case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
-    case 1: gsl_vector_complex_set(r, 0, z0);
+  case 3: gsl_vector_complex_set(r, 2, z2);   /* fall through */
+  case 2: gsl_vector_complex_set(r, 1, z1);   /* fall through */
+  case 1: gsl_vector_complex_set(r, 0, z0);
   }
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
 }
@@ -915,8 +887,8 @@ static VALUE FUNCTION(rb_gsl_poly,solve_quartic2)(VALUE obj)
   if (v->size < 5) {
     rb_raise(rb_eArgError, "the order of the object is less than 4.");
   }
-  a4 = FUNCTION(gsl_vector,get)(v, 4);   
-  a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;   
+  a4 = FUNCTION(gsl_vector,get)(v, 4);
+  a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;
   a2 = FUNCTION(gsl_vector,get)(v, 2)/a4;   /* coefficients */
   a1 = FUNCTION(gsl_vector,get)(v, 1)/a4;
   a0 = FUNCTION(gsl_vector,get)(v, 0)/a4;
@@ -941,8 +913,8 @@ static VALUE FUNCTION(rb_gsl_poly,complex_solve_quartic2)(VALUE obj)
   if (v->size < 5) {
     rb_raise(rb_eArgError, "the order of the object is less than 4.");
   }
-  a4 = FUNCTION(gsl_vector,get)(v, 4);   
-  a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;   
+  a4 = FUNCTION(gsl_vector,get)(v, 4);
+  a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;
   a2 = FUNCTION(gsl_vector,get)(v, 2)/a4;   /* coefficients */
   a1 = FUNCTION(gsl_vector,get)(v, 1)/a4;
   a0 = FUNCTION(gsl_vector,get)(v, 0)/a4;
@@ -978,7 +950,6 @@ VALUE FUNCTION(rb_gsl_poly,complex_solve2)(int argc, VALUE *argv, VALUE obj)
   for (i = 0; i < v->size; i++) {
     gsl_vector_set(a, i, FUNCTION(gsl_vector,get)(v, i));
   }
-
   if (argc == 1 && rb_obj_is_kind_of(argv[0], cgsl_poly_workspace)) {
     Data_Get_Struct(argv[0], gsl_poly_complex_workspace, w);
     flag = 0;
@@ -986,7 +957,6 @@ VALUE FUNCTION(rb_gsl_poly,complex_solve2)(int argc, VALUE *argv, VALUE obj)
     w = gsl_poly_complex_workspace_alloc(size);
     flag = 1;
   }
-  
   /*status =*/ gsl_poly_complex_solve(a->data, size, w, z->data);
 
   r = gsl_vector_complex_alloc(size - 1);
@@ -1009,7 +979,7 @@ static VALUE rb_gsl_poly_int_to_f(VALUE obj)
   size_t i;
   Data_Get_Struct(obj, gsl_vector_int, vi);
   v = gsl_vector_alloc(vi->size);
-  for (i = 0; i < v->size; i++) 
+  for (i = 0; i < v->size; i++)
     gsl_vector_set(v, i, (double) gsl_vector_int_get(vi, i));
   return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v);
 }
@@ -1023,7 +993,7 @@ static VALUE rb_gsl_poly_to_i(VALUE obj)
   size_t i;
   Data_Get_Struct(obj, gsl_vector, v);
   vi = gsl_vector_int_alloc(v->size);
-  for (i = 0; i < v->size; i++) 
+  for (i = 0; i < v->size; i++)
     gsl_vector_int_set(vi, i, (int) gsl_vector_get(v, i));
   return Data_Wrap_Struct(cgsl_poly_int, 0, gsl_vector_int_free, vi);
 }
@@ -1035,8 +1005,6 @@ static VALUE FUNCTION(rb_gsl_poly,workspace_new)(VALUE klass, VALUE n)
   return Data_Wrap_Struct(klass, 0, gsl_poly_complex_workspace_free, w);
 }
 
-#ifdef GSL_1_1_LATER
-
 /* singleton method of the class Poly */
 static VALUE rb_gsl_poly_dd_init(VALUE obj, VALUE vxa, VALUE vya)
 {
@@ -1065,7 +1033,7 @@ static VALUE rb_gsl_poly_dd_eval(VALUE obj, VALUE xxa, VALUE xx)
   case T_BIGNUM:
   case T_FLOAT:
     return rb_float_new(gsl_poly_dd_eval(dd->data, xa->data, dd->size,
-					 NUM2DBL(xx)));
+                                         NUM2DBL(xx)));
     break;
   case T_ARRAY:
     size = RARRAY_LEN(xx);
@@ -1073,9 +1041,9 @@ static VALUE rb_gsl_poly_dd_eval(VALUE obj, VALUE xxa, VALUE xx)
     for (i = 0; i < size; i++) {
       x = rb_ary_entry(xx, i);
       Need_Float(x);
-      rb_ary_store(ary, i, 
-		   rb_float_new(gsl_poly_dd_eval(dd->data, xa->data, 
-						 dd->size, NUM2DBL(x))));
+      rb_ary_store(ary, i,
+                   rb_float_new(gsl_poly_dd_eval(dd->data, xa->data,
+                                                 dd->size, NUM2DBL(x))));
     }
     return ary;
     break;
@@ -1085,9 +1053,9 @@ static VALUE rb_gsl_poly_dd_eval(VALUE obj, VALUE xxa, VALUE xx)
       size = v->size;
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < size; i++) {
-	gsl_vector_set(vnew, i, 
-		       gsl_poly_dd_eval(dd->data, xa->data, 
-					dd->size, FUNCTION(gsl_vector,get)(v, i)));
+        gsl_vector_set(vnew, i,
+                       gsl_poly_dd_eval(dd->data, xa->data,
+                                        dd->size, FUNCTION(gsl_vector,get)(v, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MAT_P(xx)) {
@@ -1095,11 +1063,11 @@ static VALUE rb_gsl_poly_dd_eval(VALUE obj, VALUE xxa, VALUE xx)
       size = m->size1;
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, 
-			 gsl_poly_dd_eval(dd->data, xa->data, 
-					  dd->size, gsl_matrix_get(m, i, j)));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j,
+                         gsl_poly_dd_eval(dd->data, xa->data,
+                                          dd->size, gsl_matrix_get(m, i, j)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -1161,7 +1129,6 @@ static VALUE rb_gsl_poly_dd_taylor(int argc, VALUE *argv, VALUE obj)
 }
 
 #endif
-#endif
 
 static VALUE FUNCTION(rb_gsl_poly,order)(VALUE obj)
 {
@@ -1171,7 +1138,7 @@ static VALUE FUNCTION(rb_gsl_poly,order)(VALUE obj)
 }
 
 int FUNCTION(gsl_poly,conv)(const BASE *a, size_t na, const BASE *b, size_t nb,
-		  BASE *c, size_t *nc)
+                            BASE *c, size_t *nc)
 {
   BASE x;
   size_t i, j;
@@ -1192,7 +1159,7 @@ GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,conv_vector)(const GSL_TYPE(gsl_vector)
 {
   GSL_TYPE(gsl_vector) *vnew = NULL;
   size_t n, tmp;
-  if (v1->size == 1) { 
+  if (v1->size == 1) {
     vnew = FUNCTION(make_vector,clone)(v2);
     FUNCTION(gsl_vector,scale)(vnew, FUNCTION(gsl_vector,get)(v1, 0));
     return vnew;
@@ -1249,8 +1216,8 @@ GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,integ)(const GSL_TYPE(gsl_vector) *v)
   return vnew;
 }
 
-GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,deconv_vector)(const GSL_TYPE(gsl_vector) *c, const GSL_TYPE(gsl_vector) *a, 
-				   GSL_TYPE(gsl_vector) **r)
+GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,deconv_vector)(const GSL_TYPE(gsl_vector) *c, const GSL_TYPE(gsl_vector) *a,
+                                                       GSL_TYPE(gsl_vector) **r)
 {
   GSL_TYPE(gsl_vector) *vnew = NULL, *a2 = NULL, *c2 = NULL, *vtmp = NULL;
   GSL_TYPE(gsl_vector) *rtmp = NULL;
@@ -1270,8 +1237,8 @@ GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,deconv_vector)(const GSL_TYPE(gsl_vector
       jj = c2->size-1-k-j;
       //if (jj > k || jj < 0) continue;
       if (jj <= k) {
-      y = FUNCTION(gsl_vector,get)(a2, jj);
-      x -= y*z;
+        y = FUNCTION(gsl_vector,get)(a2, jj);
+        x -= y*z;
       }
       if (j == 0) break;
     }
@@ -1357,11 +1324,11 @@ VALUE FUNCTION(rb_gsl_poly,deconv)(VALUE obj, VALUE bb)
   }
   vnew = FUNCTION(gsl_poly,deconv_vector)(v, v2, &r);
   if (flag == 1) FUNCTION(gsl_vector,free)(v2);
-  if (FUNCTION(gsl_vector,isnull)(r)) 
+  if (FUNCTION(gsl_vector,isnull)(r))
     return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
   else
     return rb_ary_new3(2, Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew),
-		       Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
+                       Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
 }
 
 static VALUE FUNCTION(rb_gsl_poly,reduce)(VALUE obj)
@@ -1410,7 +1377,7 @@ static VALUE FUNCTION(rb_gsl_poly,conv2)(VALUE klass, VALUE v1, VALUE v2)
   p3 = FUNCTION(gsl_poly,conv_vector)(p1, p2);
   if (flag1 == 1) FUNCTION(gsl_vector,free)(p1);
   if (flag2 == 1) FUNCTION(gsl_vector,free)(p2);
-  if (flag1 == 1 && flag2 == 1) {	
+  if (flag1 == 1 && flag2 == 1) {
     ary = rb_ary_new2(p3->size);
     for (i = 0; i < p3->size; i++)
       rb_ary_store(ary, i, C_TO_VALUE2(FUNCTION(gsl_vector,get)(p3, i)));
@@ -1431,15 +1398,15 @@ static VALUE FUNCTION(rb_gsl_poly,deconv2)(VALUE klass, VALUE v1, VALUE v2)
   vnew = FUNCTION(gsl_poly,deconv_vector)(p1, p2, &r);
   if (flag1 == 1) FUNCTION(gsl_vector,free)(p1);
   if (flag2 == 1) FUNCTION(gsl_vector,free)(p2);
-  if (FUNCTION(gsl_vector,isnull)(r)) 
+  if (FUNCTION(gsl_vector,isnull)(r))
     return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
   else
     return rb_ary_new3(2, Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew),
-		       Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
+                       Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
 }
 
-GSL_TYPE(gsl_poly)* FUNCTION(gsl_poly,add)(const GSL_TYPE(gsl_poly) *a, 
-	const GSL_TYPE(gsl_poly) *b)
+GSL_TYPE(gsl_poly)* FUNCTION(gsl_poly,add)(const GSL_TYPE(gsl_poly) *a,
+                                           const GSL_TYPE(gsl_poly) *b)
 {
   GSL_TYPE(gsl_poly) *c = NULL;
   const GSL_TYPE(gsl_poly) *longer;
@@ -1449,7 +1416,7 @@ GSL_TYPE(gsl_poly)* FUNCTION(gsl_poly,add)(const GSL_TYPE(gsl_poly) *a,
     longer = a;
   } else {
     c = FUNCTION(gsl_vector,alloc)(b->size);
-      longer = b;
+    longer = b;
   }
   n = GSL_MIN(a->size, b->size);
   for (i = 0; i < n; i++) {
@@ -1521,7 +1488,7 @@ static VALUE FUNCTION(rb_gsl_poly,coerce)(VALUE obj, VALUE other)
     vb = FUNCTION(gsl_vector,calloc)(1);
     FUNCTION(gsl_vector,set)(vb, 0, (BASE) NUM2DBL(other));
     return rb_ary_new3(2, Data_Wrap_Struct(CLASS_OF(obj), 0, FUNCTION(gsl_vector,free), vb),
-		       obj);
+                       obj);
     break;
   default:
     CHECK_VEC(other);
@@ -1548,10 +1515,10 @@ static VALUE FUNCTION(rb_gsl_poly,companion_matrix)(VALUE obj)
   size = p->size - 1;
   m = gsl_matrix_calloc(size, size);
   z = FUNCTION(gsl_vector,get)(p, size);
-  for (j = 0; j < size; j++) 
+  for (j = 0; j < size; j++)
     gsl_matrix_set(m, 0, size-j-1, -FUNCTION(gsl_vector,get)(p, j)/z);
   for (i = 1; i < size; i++) {
-   gsl_matrix_set(m, i, i-1, 1.0);
+    gsl_matrix_set(m, i, i-1, 1.0);
   }
   return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, m);
 }
@@ -1580,7 +1547,7 @@ static VALUE rb_gsl_poly_fit(int argc, VALUE *argv, VALUE obj)
   double chisq, val;
   int status, flag = 0;
   VALUE vc, vcov;
-  if (argc != 3 && argc != 4) 
+  if (argc != 3 && argc != 4)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
   x = &xx.vector;
   y = &yy.vector;
@@ -1621,7 +1588,7 @@ static VALUE rb_gsl_poly_wfit(int argc, VALUE *argv, VALUE obj)
   double chisq, val;
   int status, flag = 0;
   VALUE vc, vcov;
-  if (argc != 4 && argc != 5) 
+  if (argc != 4 && argc != 5)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 4 or 5)", argc);
   Data_Get_Vector(argv[0], x);
   Data_Get_Vector(argv[1], w);
@@ -1654,17 +1621,11 @@ static VALUE rb_gsl_poly_wfit(int argc, VALUE *argv, VALUE obj)
 #endif
 
 #ifdef BASE_DOUBLE
-#ifdef GSL_1_13_LATER
 static VALUE rb_gsl_poly_eval_derivs_singleton(int argc, VALUE *argv, VALUE klass)
 {
   VALUE ary;
   gsl_vector *v = NULL, *v2 = NULL;
   size_t i, lenc, lenres;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-  int shape[1];
-#endif
 
   if (argc < 2) rb_raise(rb_eArgError, "Wrong number of arguments (%d for >= 2)", argc);
   if (rb_obj_is_kind_of(argv[0], rb_cArray)) {
@@ -1696,6 +1657,9 @@ static VALUE rb_gsl_poly_eval_derivs_singleton(int argc, VALUE *argv, VALUE klas
   }
 #ifdef HAVE_NARRAY_H
   if (NA_IsNArray(argv[0])) {
+    struct NARRAY *na;
+    double *ptr1, *ptr2;
+    int shape[1];
     GetNArray(argv[0], na);
     ptr1 = (double*) na->ptr;
     lenc = na->total;
@@ -1731,7 +1695,6 @@ static VALUE rb_gsl_poly_eval_derivs(int argc, VALUE *argv, VALUE obj)
   return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v2);
 }
 #endif
-#endif
 
 void FUNCTION(Init_gsl_poly,init)(VALUE module)
 {
@@ -1742,78 +1705,78 @@ void FUNCTION(Init_gsl_poly,init)(VALUE module)
 
   cgsl_poly_workspace = rb_define_class_under(cgsl_poly, "Workspace", cGSL_Object);
   mgsl_poly_complex = rb_define_module_under(cgsl_poly, "Complex");
-  cgsl_poly_complex_workspace = rb_define_class_under(mgsl_poly_complex, 
-						      "Workspace", cGSL_Object);
-  rb_define_singleton_method(cgsl_poly_workspace, "alloc", 
-			     rb_gsl_poly_workspace_new, 1);
+  cgsl_poly_complex_workspace = rb_define_class_under(mgsl_poly_complex,
+                                                      "Workspace", cGSL_Object);
+  rb_define_singleton_method(cgsl_poly_workspace, "alloc",
+                             rb_gsl_poly_workspace_new, 1);
   rb_define_singleton_method(cgsl_poly_complex_workspace, "alloc",
-			     rb_gsl_poly_workspace_new, 1);
+                             rb_gsl_poly_workspace_new, 1);
 
-  rb_define_singleton_method(mgsl_poly_complex, "solve_quadratic", 
-			     FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
+  rb_define_singleton_method(mgsl_poly_complex, "solve_quadratic",
+                             FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
   rb_define_singleton_method(mgsl_poly_complex, "solve_cubic",
-			     FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
+                             FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
 #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
   rb_define_singleton_method(mgsl_poly_complex, "solve_quartic",
-			     FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
+                             FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
 #endif
 
   rb_define_singleton_method(mgsl_poly_complex, "solve",
-			     FUNCTION(rb_gsl_poly,complex_solve), -1);
-  rb_define_singleton_method(mgsl_poly_complex, "roots", 
-			     FUNCTION(rb_gsl_poly,complex_solve), -1);
+                             FUNCTION(rb_gsl_poly,complex_solve), -1);
+  rb_define_singleton_method(mgsl_poly_complex, "roots",
+                             FUNCTION(rb_gsl_poly,complex_solve), -1);
 #endif
 
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_quadratic", 
-			     FUNCTION(rb_gsl_poly,solve_quadratic), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_cubic", 
-			     FUNCTION(rb_gsl_poly,solve_cubic), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_quadratic",
+                             FUNCTION(rb_gsl_poly,solve_quadratic), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_cubic",
+                             FUNCTION(rb_gsl_poly,solve_cubic), -1);
 
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic", 
-			     FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic", 
-			     FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic",
+                             FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic",
+                             FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
 #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
   rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_quartic",
-			     FUNCTION(rb_gsl_poly,solve_quartic), -1);
+                             FUNCTION(rb_gsl_poly,solve_quartic), -1);
 
   rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_quartic",
-			     FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
+                             FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
 #endif
   rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve",
-			     FUNCTION(rb_gsl_poly,complex_solve), -1);
+                             FUNCTION(rb_gsl_poly,complex_solve), -1);
 
   rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve",
-			     FUNCTION(rb_gsl_poly,complex_solve), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "roots", 
-			     FUNCTION(rb_gsl_poly,complex_solve), -1);
+                             FUNCTION(rb_gsl_poly,complex_solve), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "roots",
+                             FUNCTION(rb_gsl_poly,complex_solve), -1);
 
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "eval", 
-			     FUNCTION(rb_gsl_poly,eval2), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "eval",
+                             FUNCTION(rb_gsl_poly,eval2), -1);
 
   rb_define_method(GSL_TYPE(cgsl_poly), "eval",
-		   FUNCTION(rb_gsl_poly,eval), 1);
+                   FUNCTION(rb_gsl_poly,eval), 1);
   rb_define_alias(GSL_TYPE(cgsl_poly), "at", "eval");
 
-  rb_define_method(GSL_TYPE(cgsl_poly), "solve_quadratic", 
-		   FUNCTION(rb_gsl_poly,solve_quadratic2), 0);
-  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic", 
-		   FUNCTION(rb_gsl_poly,complex_solve_quadratic2), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "solve_quadratic",
+                   FUNCTION(rb_gsl_poly,solve_quadratic2), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic",
+                   FUNCTION(rb_gsl_poly,complex_solve_quadratic2), 0);
 
-  rb_define_method(GSL_TYPE(cgsl_poly), "solve_cubic", 
-		   FUNCTION(rb_gsl_poly,solve_cubic2), 0);
-  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic", 
-		   FUNCTION(rb_gsl_poly,complex_solve_cubic2), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "solve_cubic",
+                   FUNCTION(rb_gsl_poly,solve_cubic2), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic",
+                   FUNCTION(rb_gsl_poly,complex_solve_cubic2), 0);
 
 #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
-  rb_define_method(GSL_TYPE(cgsl_poly), "solve_quartic", 
-		   FUNCTION(rb_gsl_poly,solve_quartic2), 0);
-  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quartic", 
-		   FUNCTION(rb_gsl_poly,complex_solve_quartic2), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "solve_quartic",
+                   FUNCTION(rb_gsl_poly,solve_quartic2), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quartic",
+                   FUNCTION(rb_gsl_poly,complex_solve_quartic2), 0);
 #endif
 
-  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve", 
-		   FUNCTION(rb_gsl_poly,complex_solve2), -1);
+  rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve",
+                   FUNCTION(rb_gsl_poly,complex_solve2), -1);
   rb_define_alias(GSL_TYPE(cgsl_poly), "solve", "complex_solve");
   rb_define_alias(GSL_TYPE(cgsl_poly), "roots", "complex_solve");
 
@@ -1824,11 +1787,8 @@ void FUNCTION(Init_gsl_poly,init)(VALUE module)
 #ifdef BASE_DOUBLE
   //  rb_define_singleton_method(cgsl_poly, "eval", rb_gsl_poly_eval_singleton, 2);
   rb_define_method(cgsl_poly, "to_i", rb_gsl_poly_to_i, 0);
-#ifdef GSL_1_11_LATER
   rb_define_singleton_method(cgsl_poly, "complex_eval", rb_gsl_poly_eval_singleton, 2);
   rb_define_method(cgsl_vector_complex, "eval", rb_gsl_complex_poly_complex_eval, 1);
-#endif
-#ifdef GSL_1_1_LATER
   cgsl_poly_dd = rb_define_class_under(cgsl_poly, "DividedDifference", cgsl_poly);
   cgsl_poly_taylor = rb_define_class_under(cgsl_poly, "Taylor", cgsl_poly);
   rb_define_singleton_method(cgsl_poly, "dd_init", rb_gsl_poly_dd_init, 2);
@@ -1836,7 +1796,6 @@ void FUNCTION(Init_gsl_poly,init)(VALUE module)
   rb_define_method(cgsl_poly_dd, "eval",rb_gsl_poly_dd_eval, 2);
   rb_define_method(cgsl_poly_dd, "taylor", rb_gsl_poly_dd_taylor, -1);
 #endif
-#endif
 
   rb_define_method(GSL_TYPE(cgsl_poly), "order", FUNCTION(rb_gsl_poly,order), 0);
 
@@ -1844,15 +1803,15 @@ void FUNCTION(Init_gsl_poly,init)(VALUE module)
   rb_define_method(GSL_TYPE(cgsl_poly), "conv", FUNCTION(rb_gsl_poly,conv), 1);
   rb_define_alias(GSL_TYPE(cgsl_poly), "*", "conv");
   rb_define_singleton_method(GSL_TYPE(cgsl_poly), "conv",
-			     FUNCTION(rb_gsl_poly,conv2), 2);
+                             FUNCTION(rb_gsl_poly,conv2), 2);
 
   rb_define_method(GSL_TYPE(cgsl_poly), "deconv",
-		   FUNCTION(rb_gsl_poly,deconv), 1);
+                   FUNCTION(rb_gsl_poly,deconv), 1);
   rb_define_singleton_method(GSL_TYPE(cgsl_poly), "deconv",
-			     FUNCTION(rb_gsl_poly,deconv2), 2);
+                             FUNCTION(rb_gsl_poly,deconv2), 2);
 
-  rb_define_method(GSL_TYPE(cgsl_poly), "reduce", 
-		   FUNCTION(rb_gsl_poly,reduce), 1);
+  rb_define_method(GSL_TYPE(cgsl_poly), "reduce",
+                   FUNCTION(rb_gsl_poly,reduce), 1);
   rb_define_method(GSL_TYPE(cgsl_poly), "deriv", FUNCTION(rb_gsl_poly,deriv), 1);
   rb_define_method(GSL_TYPE(cgsl_poly), "integ", FUNCTION(rb_gsl_poly,integ), 1);
 
@@ -1866,29 +1825,27 @@ void FUNCTION(Init_gsl_poly,init)(VALUE module)
   rb_define_method(GSL_TYPE(cgsl_poly), "-@", FUNCTION(rb_gsl_poly,uminus), 0);
   rb_define_method(GSL_TYPE(cgsl_poly), "+@", FUNCTION(rb_gsl_poly,uplus), 0);
 
-  rb_define_method(GSL_TYPE(cgsl_poly), "coerce", 
-		   FUNCTION(rb_gsl_poly,coerce), 1);
+  rb_define_method(GSL_TYPE(cgsl_poly), "coerce",
+                   FUNCTION(rb_gsl_poly,coerce), 1);
   rb_define_method(GSL_TYPE(cgsl_poly), "to_gv", FUNCTION(rb_gsl_poly,to_gv), 0);
   rb_define_alias(GSL_TYPE(cgsl_poly), "to_v", "to_gv");
 
-  rb_define_method(GSL_TYPE(cgsl_poly), "companion_matrix", 
-		   FUNCTION(rb_gsl_poly,companion_matrix), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "companion_matrix",
+                   FUNCTION(rb_gsl_poly,companion_matrix), 0);
   rb_define_alias(GSL_TYPE(cgsl_poly), "compan", "companion_matrix");
 
   /*****/
-  rb_define_method(GSL_TYPE(cgsl_poly), "info", 
-		   FUNCTION(rb_gsl_poly,info), 0);
+  rb_define_method(GSL_TYPE(cgsl_poly), "info",
+                   FUNCTION(rb_gsl_poly,info), 0);
 
 #ifdef BASE_DOUBLE
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "fit", 
-		   FUNCTION(rb_gsl_poly,fit), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "wfit", 
-		   FUNCTION(rb_gsl_poly,wfit), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "fit",
+                             FUNCTION(rb_gsl_poly,fit), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_poly), "wfit",
+                             FUNCTION(rb_gsl_poly,wfit), -1);
 
-#ifdef GSL_1_13_LATER
   rb_define_singleton_method(cgsl_poly, "eval_derivs", rb_gsl_poly_eval_derivs_singleton, -1);
   rb_define_method(cgsl_vector, "eval_derivs", rb_gsl_poly_eval_derivs, -1);
-#endif
 
 #endif
 }
diff --git a/ext/gsl/qrng.c b/ext/gsl_native/qrng.c
similarity index 91%
rename from ext/gsl/qrng.c
rename to ext/gsl_native/qrng.c
index 22b1d0b..0890bf9 100644
--- a/ext/gsl/qrng.c
+++ b/ext/gsl_native/qrng.c
@@ -38,34 +38,29 @@ static const gsl_qrng_type* get_gsl_qrng_type(VALUE t)
     strcpy(name, STR2CSTR(t));
     if (strstr(name, "niederreiter_2")) return T = gsl_qrng_niederreiter_2;
 #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
-	else if (strstr(name, "hdsobol")) return T = qrngextra_hdsobol;
+    else if (strstr(name, "hdsobol")) return T = qrngextra_hdsobol;
 #endif
     else if (strstr(name, "sobol")) return T = gsl_qrng_sobol;
-#ifdef GSL_1_11_LATER
     else if (strstr(name, "reversehalton")) return T = gsl_qrng_reversehalton;
     else if (strstr(name, "halton")) return T = gsl_qrng_halton;
-
-#endif
     else rb_raise(rb_eArgError, "unknown type");
     break;
   case T_FIXNUM:
     switch (FIX2INT(t)) {
     case GSL_QRNG_NIEDERREITER_2: T = gsl_qrng_niederreiter_2; break;
     case GSL_QRNG_SOBOL: T = gsl_qrng_sobol; break;
-#ifdef GSL_1_11_LATER
     case GSL_QRNG_HALTON: T = gsl_qrng_halton; break;
     case GSL_QRNG_REVERSEHALTON: T = gsl_qrng_reversehalton; break;
-#endif
 #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
-	case GSL_QRNG_HDSOBOL: T = qrngextra_hdsobol; break;
+    case GSL_QRNG_HDSOBOL: T = qrngextra_hdsobol; break;
 #endif
-    default: 
+    default:
       rb_raise(rb_eArgError, "unknown type");
     }
     break;
-  default: 
+  default:
     rb_raise(rb_eTypeError, "wrong argument type %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(t)));
+             rb_class2name(CLASS_OF(t)));
   }
   return T;
 }
@@ -81,7 +76,6 @@ static VALUE rb_gsl_qrng_new(VALUE klass, VALUE t, VALUE dd)
   return Data_Wrap_Struct(klass, 0, gsl_qrng_free, q);
 }
 
-#ifdef GSL_1_2_LATER
 static VALUE rb_gsl_qrng_init(VALUE obj)
 {
   gsl_qrng *q = NULL;
@@ -89,7 +83,6 @@ static VALUE rb_gsl_qrng_init(VALUE obj)
   gsl_qrng_init(q);
   return obj;
 }
-#endif
 
 static VALUE rb_gsl_qrng_name(VALUE obj)
 {
@@ -148,9 +141,7 @@ void Init_gsl_qrng(VALUE module)
 
   rb_define_singleton_method(cgsl_qrng, "new", rb_gsl_qrng_new, 2);
   rb_define_singleton_method(cgsl_qrng, "alloc", rb_gsl_qrng_new, 2);
-#ifdef GSL_1_2_LATER
   rb_define_method(cgsl_qrng, "init", rb_gsl_qrng_init, 0);
-#endif
   rb_define_method(cgsl_qrng, "name", rb_gsl_qrng_name, 0);
   rb_define_method(cgsl_qrng, "size", rb_gsl_qrng_size, 0);
   rb_define_method(cgsl_qrng, "clone", rb_gsl_qrng_clone, 0);
@@ -161,11 +152,9 @@ void Init_gsl_qrng(VALUE module)
 
   rb_define_const(cgsl_qrng, "NIEDERREITER_2", INT2FIX(GSL_QRNG_NIEDERREITER_2));
   rb_define_const(cgsl_qrng, "SOBOL", INT2FIX(GSL_QRNG_SOBOL));
-#ifdef GSL_1_11_LATER
   rb_define_const(cgsl_qrng, "HALTON", INT2FIX(GSL_QRNG_HALTON));
   rb_define_const(cgsl_qrng, "REVERSEHALTON", INT2FIX(GSL_QRNG_REVERSEHALTON));
-#endif
 #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
-    rb_define_const(cgsl_qrng, "HDSOBOL", INT2FIX(GSL_QRNG_HDSOBOL));
+  rb_define_const(cgsl_qrng, "HDSOBOL", INT2FIX(GSL_QRNG_HDSOBOL));
 #endif
 }
diff --git a/ext/gsl/randist.c b/ext/gsl_native/randist.c
similarity index 83%
rename from ext/gsl/randist.c
rename to ext/gsl_native/randist.c
index f52b294..2e5c21f 100644
--- a/ext/gsl/randist.c
+++ b/ext/gsl_native/randist.c
@@ -16,13 +16,13 @@
 
 VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double));
 VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa, double (*f)(double, double));
-VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb, 
-			   double (*f)(double, double, double));
-VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa, 
-				double (*f)(unsigned int, double));
+VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
+                           double (*f)(double, double, double));
+VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
+                                double (*f)(unsigned int, double));
 
 static VALUE rb_gsl_ran_eval0(int argc, VALUE *argv, VALUE obj,
-			      double (*f)(const gsl_rng*))
+                              double (*f)(const gsl_rng*))
 {
   gsl_rng *r;
   switch (TYPE(obj)) {
@@ -30,7 +30,7 @@ static VALUE rb_gsl_ran_eval0(int argc, VALUE *argv, VALUE obj,
     switch (argc) {
     case 1:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
@@ -45,14 +45,14 @@ static VALUE rb_gsl_ran_eval0(int argc, VALUE *argv, VALUE obj,
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return rb_float_new((*f)(r));
 }
 
 static VALUE rb_gsl_ran_eval1(int argc, VALUE *argv, VALUE obj,
-			      double (*f)(const gsl_rng*, double))
+                              double (*f)(const gsl_rng*, double))
 {
   gsl_rng *r;
   gsl_vector *v;
@@ -65,15 +65,15 @@ static VALUE rb_gsl_ran_eval1(int argc, VALUE *argv, VALUE obj,
       n = NUM2INT(argv[2]);
       a = NUM2DBL(argv[1]);
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, (*f)(r, a));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, (*f)(r, a));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 2:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       a = NUM2DBL(argv[1]);
       break;
     default:
@@ -86,10 +86,10 @@ static VALUE rb_gsl_ran_eval1(int argc, VALUE *argv, VALUE obj,
     case 2:
       n = NUM2INT(argv[1]);
       a = NUM2DBL(argv[0]);
-      Data_Get_Struct(obj, gsl_rng, r);    
+      Data_Get_Struct(obj, gsl_rng, r);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, (*f)(r, a));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, (*f)(r, a));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 1:
@@ -99,14 +99,14 @@ static VALUE rb_gsl_ran_eval1(int argc, VALUE *argv, VALUE obj,
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return rb_float_new((*f)(r, a));
 }
 
 static VALUE rb_gsl_ran_eval1_uint(int argc, VALUE *argv, VALUE obj,
-			      unsigned int (*f)(const gsl_rng*, double))
+                                   unsigned int (*f)(const gsl_rng*, double))
 {
   gsl_rng *r;
   gsl_vector_int *v;
@@ -119,15 +119,15 @@ static VALUE rb_gsl_ran_eval1_uint(int argc, VALUE *argv, VALUE obj,
       n = NUM2INT(argv[2]);
       a = NUM2DBL(argv[1]);
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       v = gsl_vector_int_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_int_set(v, i, (int) (*f)(r, a));
+      for (i = 0; i < n; i++)
+        gsl_vector_int_set(v, i, (int) (*f)(r, a));
       return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, v);
       break;
     case 2:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       a = NUM2DBL(argv[1]);
       break;
     default:
@@ -140,10 +140,10 @@ static VALUE rb_gsl_ran_eval1_uint(int argc, VALUE *argv, VALUE obj,
     case 2:
       n = NUM2INT(argv[1]);
       a = NUM2DBL(argv[0]);
-      Data_Get_Struct(obj, gsl_rng, r);    
+      Data_Get_Struct(obj, gsl_rng, r);
       v = gsl_vector_int_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_int_set(v, i, (*f)(r, a));
+      for (i = 0; i < n; i++)
+        gsl_vector_int_set(v, i, (*f)(r, a));
       return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, v);
       break;
     case 1:
@@ -153,14 +153,14 @@ static VALUE rb_gsl_ran_eval1_uint(int argc, VALUE *argv, VALUE obj,
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return INT2FIX((*f)(r, a));
 }
 
 static VALUE rb_gsl_ran_eval2(int argc, VALUE *argv, VALUE obj,
-			      double (*f)(const gsl_rng*, double, double))
+                              double (*f)(const gsl_rng*, double, double))
 {
   gsl_rng *r;
   gsl_vector *v;
@@ -171,7 +171,7 @@ static VALUE rb_gsl_ran_eval2(int argc, VALUE *argv, VALUE obj,
     switch (argc) {
     case 4:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]);
       n = NUM2INT(argv[3]);
       v = gsl_vector_alloc(n);
@@ -180,7 +180,7 @@ static VALUE rb_gsl_ran_eval2(int argc, VALUE *argv, VALUE obj,
       break;
     case 3:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]);
       break;
     default:
@@ -191,7 +191,7 @@ static VALUE rb_gsl_ran_eval2(int argc, VALUE *argv, VALUE obj,
   default:
     switch (argc) {
     case 3:
-      Data_Get_Struct(obj, gsl_rng, r);  
+      Data_Get_Struct(obj, gsl_rng, r);
       a = NUM2DBL(argv[0]); b = NUM2DBL(argv[1]);
       n = NUM2INT(argv[2]);
       v = gsl_vector_alloc(n);
@@ -205,14 +205,14 @@ static VALUE rb_gsl_ran_eval2(int argc, VALUE *argv, VALUE obj,
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return rb_float_new((*f)(r, a, b));
 }
 
 static VALUE rb_gsl_ran_eval3(int argc, VALUE *argv, VALUE obj,
-			      double (*f)(const gsl_rng*, double, double, double))
+                              double (*f)(const gsl_rng*, double, double, double))
 {
   gsl_rng *r;
   gsl_vector *v;
@@ -223,7 +223,7 @@ static VALUE rb_gsl_ran_eval3(int argc, VALUE *argv, VALUE obj,
     switch (argc) {
     case 5:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]); c = NUM2DBL(argv[3]);
       n = NUM2INT(argv[4]);
       v = gsl_vector_alloc(n);
@@ -232,7 +232,7 @@ static VALUE rb_gsl_ran_eval3(int argc, VALUE *argv, VALUE obj,
       break;
     case 4:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]); c = NUM2DBL(argv[3]);
       break;
     default:
@@ -243,7 +243,7 @@ static VALUE rb_gsl_ran_eval3(int argc, VALUE *argv, VALUE obj,
   default:
     switch (argc) {
     case 4:
-      Data_Get_Struct(obj, gsl_rng, r);  
+      Data_Get_Struct(obj, gsl_rng, r);
       a = NUM2DBL(argv[0]); b = NUM2DBL(argv[1]); c = NUM2DBL(argv[2]);
       n = NUM2INT(argv[3]);
       v = gsl_vector_alloc(n);
@@ -257,7 +257,7 @@ static VALUE rb_gsl_ran_eval3(int argc, VALUE *argv, VALUE obj,
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return rb_float_new((*f)(r, a, b, c));
@@ -265,7 +265,7 @@ static VALUE rb_gsl_ran_eval3(int argc, VALUE *argv, VALUE obj,
 
 static VALUE rb_gsl_ran_gaussian(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v;
   size_t n, i;
   double sigma = 1.0;
@@ -276,18 +276,18 @@ static VALUE rb_gsl_ran_gaussian(int argc, VALUE *argv, VALUE obj)
       n = NUM2INT(argv[2]);
       sigma = NUM2DBL(argv[1]);
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, gsl_ran_gaussian(r, sigma));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, gsl_ran_gaussian(r, sigma));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 2:
       sigma = NUM2DBL(argv[1]);
-      /* no break */
+    /* no break */
     case 1:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       return rb_float_new(gsl_ran_gaussian(r, sigma));
       break;
     default:
@@ -297,19 +297,19 @@ static VALUE rb_gsl_ran_gaussian(int argc, VALUE *argv, VALUE obj)
     }
     break;
   default:
-    Data_Get_Struct(obj, gsl_rng, r);    
+    Data_Get_Struct(obj, gsl_rng, r);
     switch (argc) {
     case 2:
       n = NUM2INT(argv[1]);
       sigma = NUM2DBL(argv[0]);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, gsl_ran_gaussian(r, sigma));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, gsl_ran_gaussian(r, sigma));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 1:
       sigma = NUM2DBL(argv[0]);
-      /* no break */
+    /* no break */
     case 0:
       return rb_float_new(gsl_ran_gaussian(r, sigma));
       break;
@@ -325,17 +325,17 @@ static VALUE rb_gsl_ran_gaussian(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_gaussian_ratio_method(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   double sigma = 1.0;
   switch (TYPE(obj)) {
   case T_MODULE: case T_CLASS: case T_OBJECT:
     switch (argc) {
     case 2:
       sigma = NUM2DBL(argv[1]);
-      /* no break */
+    /* no break */
     case 1:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       return rb_float_new(gsl_ran_gaussian_ratio_method(r, sigma));
       break;
     default:
@@ -344,11 +344,11 @@ static VALUE rb_gsl_ran_gaussian_ratio_method(int argc, VALUE *argv, VALUE obj)
     }
     break;
   default:
-    Data_Get_Struct(obj, gsl_rng, r);    
+    Data_Get_Struct(obj, gsl_rng, r);
     switch (argc) {
     case 1:
       sigma = NUM2DBL(argv[0]);
-      /* no break */
+    /* no break */
     case 0:
       return rb_float_new(gsl_ran_gaussian_ratio_method(r, sigma));
       break;
@@ -374,7 +374,7 @@ static VALUE rb_gsl_ran_gaussian_pdf(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_gaussian_tail(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v;
   size_t n, i;
   double a, sigma = 1.0;
@@ -386,18 +386,18 @@ static VALUE rb_gsl_ran_gaussian_tail(int argc, VALUE *argv, VALUE obj)
       sigma = NUM2DBL(argv[2]);
       a = NUM2DBL(argv[1]);
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, gsl_ran_gaussian_tail(r, a, sigma));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, gsl_ran_gaussian_tail(r, a, sigma));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 3:
       sigma = NUM2DBL(argv[2]);
-      /* no break */
+    /* no break */
     case 2:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       a = NUM2DBL(argv[1]);
       return rb_float_new(gsl_ran_gaussian_tail(r, a, sigma));
       break;
@@ -407,20 +407,20 @@ static VALUE rb_gsl_ran_gaussian_tail(int argc, VALUE *argv, VALUE obj)
     }
     break;
   default:
-    Data_Get_Struct(obj, gsl_rng, r);    
+    Data_Get_Struct(obj, gsl_rng, r);
     switch (argc) {
     case 3:
       n = NUM2INT(argv[2]);
       sigma = NUM2DBL(argv[1]);
       a = NUM2DBL(argv[0]);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, gsl_ran_gaussian_tail(r, a, sigma));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, gsl_ran_gaussian_tail(r, a, sigma));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 2:
       sigma = NUM2DBL(argv[1]);
-      /* no break */
+    /* no break */
     case 1:
       a = NUM2DBL(argv[0]);
       return rb_float_new(gsl_ran_gaussian_tail(r, a, sigma));
@@ -450,14 +450,14 @@ static VALUE rb_gsl_ran_gaussian_tail_pdf(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_bivariate_gaussian(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   double sigmax, sigmay, x, y, rho;
   switch (TYPE(obj)) {
   case T_MODULE: case T_CLASS: case T_OBJECT:
     switch (argc) {
     case 4:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r); 
+      Data_Get_Struct(argv[0], gsl_rng, r);
       sigmax = NUM2DBL(argv[1]); sigmay = NUM2DBL(argv[2]);
       rho = NUM2DBL(argv[3]);
       break;
@@ -469,7 +469,7 @@ static VALUE rb_gsl_ran_bivariate_gaussian(int argc, VALUE *argv, VALUE obj)
   default:
     switch (argc) {
     case 3:
-      Data_Get_Struct(obj, gsl_rng, r);  
+      Data_Get_Struct(obj, gsl_rng, r);
       sigmax = NUM2DBL(argv[0]); sigmay = NUM2DBL(argv[1]);
       rho = NUM2DBL(argv[2]);
       break;
@@ -720,7 +720,7 @@ static VALUE rb_gsl_ran_binomial(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 3:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       p = NUM2DBL(argv[1]);
       n = FIX2UINT(argv[2]);
       break;
@@ -739,16 +739,15 @@ static VALUE rb_gsl_ran_binomial(int argc, VALUE *argv, VALUE obj)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return UINT2NUM(gsl_ran_binomial(r, p, n));
 }
 
-#ifdef GSL_1_4_LATER
 static VALUE rb_gsl_ran_binomial_tpe(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   double p;
   unsigned int n;
   switch (TYPE(obj)) {
@@ -756,7 +755,7 @@ static VALUE rb_gsl_ran_binomial_tpe(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 3:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       p = NUM2DBL(argv[1]);
       n = FIX2UINT(argv[2]);
       break;
@@ -775,12 +774,11 @@ static VALUE rb_gsl_ran_binomial_tpe(int argc, VALUE *argv, VALUE obj)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return UINT2NUM(gsl_ran_binomial_tpe(r, p, n));
 }
-#endif
 
 static VALUE rb_gsl_ran_binomial_pdf(VALUE obj, VALUE x, VALUE p, VALUE n)
 {
@@ -797,7 +795,7 @@ static VALUE rb_gsl_ran_negative_binomial(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 3:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       p = NUM2DBL(argv[1]);
       n = FIX2UINT(argv[2]);
       break;
@@ -816,7 +814,7 @@ static VALUE rb_gsl_ran_negative_binomial(int argc, VALUE *argv, VALUE obj)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return UINT2NUM(gsl_ran_negative_binomial(r, p, n));
@@ -829,7 +827,7 @@ static VALUE rb_gsl_ran_negative_binomial_pdf(VALUE obj, VALUE x, VALUE p, VALUE
 
 static VALUE rb_gsl_ran_pascal(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   double p;
   unsigned int n;
   switch (TYPE(obj)) {
@@ -837,7 +835,7 @@ static VALUE rb_gsl_ran_pascal(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 3:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       p = NUM2DBL(argv[1]);
       n = FIX2UINT(argv[2]);
       break;
@@ -856,7 +854,7 @@ static VALUE rb_gsl_ran_pascal(int argc, VALUE *argv, VALUE obj)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return UINT2NUM(gsl_ran_pascal(r, p, n));
@@ -886,7 +884,7 @@ static VALUE rb_gsl_ran_hypergeometric(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 4:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       n1 = FIX2UINT(argv[1]);
       n2 = FIX2UINT(argv[2]);
       t = FIX2UINT(argv[3]);
@@ -907,7 +905,7 @@ static VALUE rb_gsl_ran_hypergeometric(int argc, VALUE *argv, VALUE obj)
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
       break;
     }
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     break;
   }
   return UINT2NUM(gsl_ran_hypergeometric(r, n1, n2, t));
@@ -930,14 +928,14 @@ static VALUE rb_gsl_ran_logarithmic_pdf(VALUE obj, VALUE x, VALUE mu)
 
 static VALUE rb_gsl_ran_dir_2d(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   double x, y;
   switch (TYPE(obj)) {
   case T_MODULE: case T_CLASS: case T_OBJECT:
     switch (argc) {
     case 1:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
@@ -947,7 +945,7 @@ static VALUE rb_gsl_ran_dir_2d(int argc, VALUE *argv, VALUE obj)
   default:
     switch (argc) {
     case 0:
-      Data_Get_Struct(obj, gsl_rng, r);  
+      Data_Get_Struct(obj, gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
@@ -960,14 +958,14 @@ static VALUE rb_gsl_ran_dir_2d(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_dir_2d_trig_method(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   double x, y;
   switch (TYPE(obj)) {
   case T_MODULE: case T_CLASS: case T_OBJECT:
     switch (argc) {
     case 1:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
@@ -977,7 +975,7 @@ static VALUE rb_gsl_ran_dir_2d_trig_method(int argc, VALUE *argv, VALUE obj)
   default:
     switch (argc) {
     case 0:
-      Data_Get_Struct(obj, gsl_rng, r);  
+      Data_Get_Struct(obj, gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
@@ -990,14 +988,14 @@ static VALUE rb_gsl_ran_dir_2d_trig_method(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_dir_3d(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   double x, y, z;
   switch (TYPE(obj)) {
   case T_MODULE: case T_CLASS: case T_OBJECT:
     switch (argc) {
     case 1:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
@@ -1007,7 +1005,7 @@ static VALUE rb_gsl_ran_dir_3d(int argc, VALUE *argv, VALUE obj)
   default:
     switch (argc) {
     case 0:
-      Data_Get_Struct(obj, gsl_rng, r);  
+      Data_Get_Struct(obj, gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
@@ -1020,7 +1018,7 @@ static VALUE rb_gsl_ran_dir_3d(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_dir_nd(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   size_t n;
   gsl_vector *v;
   switch (TYPE(obj)) {
@@ -1028,7 +1026,7 @@ static VALUE rb_gsl_ran_dir_nd(int argc, VALUE *argv, VALUE obj)
     switch (argc) {
     case 2:
       CHECK_RNG(argv[0]); CHECK_FIXNUM(argv[1]);
-      Data_Get_Struct(argv[0], gsl_rng, r);  
+      Data_Get_Struct(argv[0], gsl_rng, r);
       n = FIX2INT(argv[1]);
       break;
     default:
@@ -1041,7 +1039,7 @@ static VALUE rb_gsl_ran_dir_nd(int argc, VALUE *argv, VALUE obj)
     case 1:
       CHECK_FIXNUM(argv[0]);
       n = FIX2INT(argv[0]);
-      Data_Get_Struct(obj, gsl_rng, r);  
+      Data_Get_Struct(obj, gsl_rng, r);
       break;
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
@@ -1055,7 +1053,7 @@ static VALUE rb_gsl_ran_dir_nd(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_shuffle(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v = NULL;
   gsl_permutation *p = NULL;
   switch (TYPE(obj)) {
@@ -1067,13 +1065,13 @@ static VALUE rb_gsl_ran_shuffle(int argc, VALUE *argv, VALUE obj)
       CHECK_RNG(argv[0]);
       Data_Get_Struct(argv[0], gsl_rng, r);
       if (VECTOR_P(argv[1])) {
-	Data_Get_Struct(argv[1], gsl_vector, v);
-	gsl_ran_shuffle(r, v->data, v->size, sizeof(double));
+        Data_Get_Struct(argv[1], gsl_vector, v);
+        gsl_ran_shuffle(r, v->data, v->size, sizeof(double));
       } else if (PERMUTATION_P(argv[1])) {
-	Data_Get_Struct(argv[1], gsl_permutation, p);
-	gsl_ran_shuffle(r, p->data, p->size, sizeof(size_t));
+        Data_Get_Struct(argv[1], gsl_permutation, p);
+        gsl_ran_shuffle(r, p->data, p->size, sizeof(size_t));
       } else {
-	rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Permutation expected)", rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Permutation expected)", rb_class2name(CLASS_OF(argv[1])));
       }
       break;
     case 3:
@@ -1081,15 +1079,15 @@ static VALUE rb_gsl_ran_shuffle(int argc, VALUE *argv, VALUE obj)
       CHECK_FIXNUM(argv[2]);
       Data_Get_Struct(argv[0], gsl_rng, r);
       if (VECTOR_P(argv[1])) {
-	Data_Get_Struct(argv[1], gsl_vector, v);
-	gsl_ran_shuffle(r, v->data, FIX2INT(argv[2]), sizeof(double));
+        Data_Get_Struct(argv[1], gsl_vector, v);
+        gsl_ran_shuffle(r, v->data, FIX2INT(argv[2]), sizeof(double));
       } else if (PERMUTATION_P(argv[1])) {
-	Data_Get_Struct(argv[1], gsl_permutation, p);
-	gsl_ran_shuffle(r, p->data, FIX2INT(argv[2]), sizeof(size_t));
+        Data_Get_Struct(argv[1], gsl_permutation, p);
+        gsl_ran_shuffle(r, p->data, FIX2INT(argv[2]), sizeof(size_t));
       } else {
-	rb_raise(rb_eTypeError, 
-		 "wrong argument type %s (Vector or Permutation expected)", 
-		 rb_class2name(CLASS_OF(argv[1])));
+        rb_raise(rb_eTypeError,
+                 "wrong argument type %s (Vector or Permutation expected)",
+                 rb_class2name(CLASS_OF(argv[1])));
       }
       break;
     default:
@@ -1098,31 +1096,31 @@ static VALUE rb_gsl_ran_shuffle(int argc, VALUE *argv, VALUE obj)
     }
     break;
   default:
-    Data_Get_Struct(obj, gsl_rng, r);  
+    Data_Get_Struct(obj, gsl_rng, r);
     switch (argc) {
     case 1:
       if (VECTOR_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_vector, v);
-	gsl_ran_shuffle(r, v->data, v->size, sizeof(double));
+        Data_Get_Struct(argv[0], gsl_vector, v);
+        gsl_ran_shuffle(r, v->data, v->size, sizeof(double));
       } else if (PERMUTATION_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_permutation, p);
-	gsl_ran_shuffle(r, p->data, p->size, sizeof(size_t));
+        Data_Get_Struct(argv[0], gsl_permutation, p);
+        gsl_ran_shuffle(r, p->data, p->size, sizeof(size_t));
       } else {
-	rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Permutation expected)", rb_class2name(CLASS_OF(argv[0])));
+        rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Permutation expected)", rb_class2name(CLASS_OF(argv[0])));
       }
       break;
     case 2:
       CHECK_FIXNUM(argv[1]);
       if (VECTOR_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_vector, v);
-	gsl_ran_shuffle(r, v->data, FIX2INT(argv[1]), sizeof(double));
+        Data_Get_Struct(argv[0], gsl_vector, v);
+        gsl_ran_shuffle(r, v->data, FIX2INT(argv[1]), sizeof(double));
       } else if (PERMUTATION_P(argv[0])) {
-	Data_Get_Struct(argv[0], gsl_permutation, p);
-	gsl_ran_shuffle(r, p->data, FIX2INT(argv[1]), sizeof(size_t));
+        Data_Get_Struct(argv[0], gsl_permutation, p);
+        gsl_ran_shuffle(r, p->data, FIX2INT(argv[1]), sizeof(size_t));
       } else {
-	rb_raise(rb_eTypeError, 
-		 "wrong argument type %s (Vector or Permutation expected)", 
-		 rb_class2name(CLASS_OF(argv[0])));
+        rb_raise(rb_eTypeError,
+                 "wrong argument type %s (Vector or Permutation expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       }
     default:
       rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
@@ -1135,31 +1133,31 @@ static VALUE rb_gsl_ran_shuffle(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_choose(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v = NULL, *v2 = NULL;
   size_t k, n;
-  Data_Get_Struct(obj, gsl_rng, r);  
+  Data_Get_Struct(obj, gsl_rng, r);
   switch (argc) {
   case 2:
     CHECK_VECTOR(argv[0]);
     CHECK_FIXNUM(argv[1]);
-    Data_Get_Struct(argv[0], gsl_vector, v);  
+    Data_Get_Struct(argv[0], gsl_vector, v);
     n = v->size;
     k = FIX2INT(argv[1]);
     if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
     v2 = gsl_vector_alloc(k);
     gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
-    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
+    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);
     break;
   case 1:
     CHECK_VECTOR(argv[0]);
-    Data_Get_Struct(argv[0], gsl_vector, v);  
+    Data_Get_Struct(argv[0], gsl_vector, v);
     n = v->size;
     k = v->size;
     if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
     v2 = gsl_vector_alloc(k);
     gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
-    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
+    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);
     break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
@@ -1169,7 +1167,7 @@ static VALUE rb_gsl_ran_choose(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_choose_singleton(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v = NULL, *v2 = NULL;
   size_t k, n;
   switch (argc) {
@@ -1177,26 +1175,26 @@ static VALUE rb_gsl_ran_choose_singleton(int argc, VALUE *argv, VALUE obj)
     CHECK_RNG(argv[0]);
     CHECK_VECTOR(argv[1]);
     CHECK_FIXNUM(argv[2]);
-    Data_Get_Struct(argv[0], gsl_rng, r);  
-    Data_Get_Struct(argv[1], gsl_vector, v);  
+    Data_Get_Struct(argv[0], gsl_rng, r);
+    Data_Get_Struct(argv[1], gsl_vector, v);
     n = v->size;
     k = FIX2INT(argv[2]);
     if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
     v2 = gsl_vector_alloc(k);
     gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
-    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
+    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);
     break;
   case 2:
     CHECK_RNG(argv[0]);
     CHECK_VECTOR(argv[1]);
-    Data_Get_Struct(argv[0], gsl_rng, r);  
-    Data_Get_Struct(argv[1], gsl_vector, v);  
+    Data_Get_Struct(argv[0], gsl_rng, r);
+    Data_Get_Struct(argv[1], gsl_vector, v);
     n = v->size;
     k = v->size;
     if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
     v2 = gsl_vector_alloc(k);
     gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
-    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
+    return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);
     break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
@@ -1206,32 +1204,31 @@ static VALUE rb_gsl_ran_choose_singleton(int argc, VALUE *argv, VALUE obj)
 
 static VALUE rb_gsl_ran_sample(VALUE obj, VALUE vv, VALUE kk)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v = NULL, *v2 = NULL;
   size_t k, n;
-  Data_Get_Struct(obj, gsl_rng, r);  
-  Data_Get_Struct(vv, gsl_vector, v);  
+  Data_Get_Struct(obj, gsl_rng, r);
+  Data_Get_Struct(vv, gsl_vector, v);
   n = v->size;
   k = FIX2INT(kk);
   v2 = gsl_vector_alloc(k);
   gsl_ran_sample(r, v2->data, k, v->data, n, sizeof(double));
-  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
+  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);
 }
 
-#ifdef GSL_1_3_LATER
 static VALUE rb_gsl_ran_dirichlet(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v = NULL, *v2 = NULL;
-  Data_Get_Struct(obj, gsl_rng, r);    
+  Data_Get_Struct(obj, gsl_rng, r);
   if (argc == 1) {
-    Data_Get_Struct(argv[0], gsl_vector, v);    
+    Data_Get_Struct(argv[0], gsl_vector, v);
     v2 = gsl_vector_alloc(v->size);
     gsl_ran_dirichlet(r, v->size, v->data, v2->data);
     return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);
   } else if (argc == 2) {
-    Data_Get_Struct(argv[0], gsl_vector, v);    
-    Data_Get_Struct(argv[1], gsl_vector, v2);    
+    Data_Get_Struct(argv[0], gsl_vector, v);
+    Data_Get_Struct(argv[1], gsl_vector, v2);
     gsl_ran_dirichlet(r, v->size, v->data, v2->data);
     return obj;
   } else {
@@ -1242,18 +1239,17 @@ static VALUE rb_gsl_ran_dirichlet(int argc, VALUE *argv, VALUE obj)
 static VALUE rb_gsl_ran_dirichlet_pdf(VALUE obj, VALUE a, VALUE t)
 {
   gsl_vector *alpha = NULL, *theta = NULL;
-  Data_Get_Struct(a, gsl_vector, alpha);    
-  Data_Get_Struct(t, gsl_vector, theta);    
+  Data_Get_Struct(a, gsl_vector, alpha);
+  Data_Get_Struct(t, gsl_vector, theta);
   return rb_float_new(gsl_ran_dirichlet_pdf(alpha->size, alpha->data, theta->data));
 }
 static VALUE rb_gsl_ran_dirichlet_lnpdf(VALUE obj, VALUE a, VALUE t)
 {
   gsl_vector *alpha = NULL, *theta = NULL;
-  Data_Get_Struct(a, gsl_vector, alpha);    
-  Data_Get_Struct(t, gsl_vector, theta);    
+  Data_Get_Struct(a, gsl_vector, alpha);
+  Data_Get_Struct(t, gsl_vector, theta);
   return rb_float_new(gsl_ran_dirichlet_lnpdf(alpha->size, alpha->data, theta->data));
 }
-#endif
 
 static VALUE rb_gsl_ran_discrete_new(VALUE klass, VALUE vv)
 {
@@ -1280,21 +1276,13 @@ static VALUE rb_gsl_ran_discrete_pdf(VALUE obj, VALUE k, VALUE gg)
   return rb_float_new(gsl_ran_discrete_pdf(FIX2INT(k), g));
 }
 
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
-
 /*****/
 VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double))
 {
   VALUE x, ary;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
-  size_t i, j, n;  
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
+  size_t i, j, n;
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch(TYPE(xx)) {
   case T_FIXNUM:
@@ -1316,6 +1304,8 @@ VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double))
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       xx = na_change_type(xx, NA_DFLOAT);
       GetNArray(xx, na);
       ptr1 = (double *) na->ptr;
@@ -1330,16 +1320,16 @@ VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double))
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i)));
+        gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j)));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -1351,18 +1341,14 @@ VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double))
   return Qnil;
 }
 
-VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa, 
-			      double (*f)(double, double))
+VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa,
+                           double (*f)(double, double))
 {
   VALUE x, ary;
   double a;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
   size_t i, j, n;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
   Need_Float(aa);
   a = NUM2DBL(aa);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
@@ -1386,6 +1372,8 @@ VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       xx = na_change_type(xx, NA_DFLOAT);
       GetNArray(xx, na);
       ptr1 = (double *) na->ptr;
@@ -1400,16 +1388,16 @@ VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa,
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i), a));
+        gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i), a));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j), a));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j), a));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -1421,18 +1409,14 @@ VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa,
   return Qnil;
 }
 
-VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb, 
-			      double (*f)(double, double, double))
+VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
+                           double (*f)(double, double, double))
 {
   VALUE x, ary;
   double a, b;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
   size_t i, j, n;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  double *ptr1, *ptr2;
-#endif
   Need_Float(aa);  Need_Float(bb);
   a = NUM2DBL(aa); b = NUM2DBL(bb);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
@@ -1456,6 +1440,8 @@ VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      double *ptr1, *ptr2;
       xx = na_change_type(xx, NA_DFLOAT);
       GetNArray(xx, na);
       ptr1 = (double *) na->ptr;
@@ -1470,16 +1456,16 @@ VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i), a, b));
+        gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i), a, b));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j), a, b));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j), a, b));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -1491,8 +1477,8 @@ VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
   return Qnil;
 }
 
-VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa, 
-				       double (*f)(unsigned int, double))
+VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
+                                double (*f)(unsigned int, double))
 {
   VALUE x, ary;
   double a;
@@ -1501,10 +1487,6 @@ VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
   gsl_matrix *m = NULL, *mnew = NULL;
   gsl_matrix_int *mi = NULL;
   size_t i, j, n;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *na;
-  char *ptr1, *ptr2;
-#endif
   Need_Float(aa);
   a = NUM2DBL(aa);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
@@ -1527,6 +1509,8 @@ VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      struct NARRAY *na;
+      char *ptr1, *ptr2;
       GetNArray(xx, na);
       n = na->total;
       ary = na_make_object(na->type, na->rank, na->shape, CLASS_OF(xx));
@@ -1534,13 +1518,13 @@ VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
       ptr2 = (char *)NA_STRUCT(ary)->ptr;
       switch (na->type) {
       case NA_LINT:
-	for (i = 0; i < n; i++) 
-	  ((int*)ptr2)[i] = (*f)((unsigned int) ((int*)ptr1)[i], a);
-	break;
+        for (i = 0; i < n; i++)
+          ((int*)ptr2)[i] = (*f)((unsigned int) ((int*)ptr1)[i], a);
+        break;
       default:
-	for (i = 0; i < n; i++) 
-	  ((double*)ptr2)[i] = (*f)((unsigned int) ((double*)ptr1)[i], a);
-	break;
+        for (i = 0; i < n; i++)
+          ((double*)ptr2)[i] = (*f)((unsigned int) ((double*)ptr1)[i], a);
+        break;
       }
       return ary;
     }
@@ -1549,32 +1533,32 @@ VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, (*f)((unsigned int) gsl_vector_get(v, i), a));
+        gsl_vector_set(vnew, i, (*f)((unsigned int) gsl_vector_get(v, i), a));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (VECTOR_INT_P(xx)) {
       Data_Get_Struct(xx, gsl_vector_int, vi);
       vnew = gsl_vector_alloc(vi->size);
       for (i = 0; i < vi->size; i++) {
-	gsl_vector_set(vnew, i, (*f)((unsigned int) gsl_vector_int_get(vi, i), a));
+        gsl_vector_set(vnew, i, (*f)((unsigned int) gsl_vector_int_get(vi, i), a));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, (*f)((unsigned int) gsl_matrix_get(m, i, j), a));
-	}
+        for (j = 0; j < m->size2; j++) {
+          gsl_matrix_set(mnew, i, j, (*f)((unsigned int) gsl_matrix_get(m, i, j), a));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else if (MATRIX_INT_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix_int, mi);
       mnew = gsl_matrix_alloc(mi->size1, mi->size2);
       for (i = 0; i < mi->size1; i++) {
-	for (j = 0; j < mi->size2; j++) {
-	  gsl_matrix_set(mnew, i, j, (*f)((unsigned int) gsl_matrix_int_get(mi, i, j), a));
-	}
+        for (j = 0; j < mi->size2; j++) {
+          gsl_matrix_set(mnew, i, j, (*f)((unsigned int) gsl_matrix_int_get(mi, i, j), a));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -1600,11 +1584,10 @@ static VALUE rb_gsl_ran_erlang_pdf(VALUE obj, VALUE x, VALUE a, VALUE n)
 }
 */
 
-#ifdef GSL_1_8_LATER
 
 static VALUE rb_gsl_ran_gaussian_ziggurat(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_rng *r = NULL;	
+  gsl_rng *r = NULL;
   gsl_vector *v;
   size_t n, i;
   double sigma = 1.0;
@@ -1615,18 +1598,18 @@ static VALUE rb_gsl_ran_gaussian_ziggurat(int argc, VALUE *argv, VALUE obj)
       n = NUM2INT(argv[2]);
       sigma = NUM2DBL(argv[1]);
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, gsl_ran_gaussian_ziggurat(r, sigma));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, gsl_ran_gaussian_ziggurat(r, sigma));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 2:
       sigma = NUM2DBL(argv[1]);
-      /* no break */
+    /* no break */
     case 1:
       CHECK_RNG(argv[0]);
-      Data_Get_Struct(argv[0], gsl_rng, r);    
+      Data_Get_Struct(argv[0], gsl_rng, r);
       return rb_float_new(gsl_ran_gaussian_ziggurat(r, sigma));
       break;
     default:
@@ -1636,19 +1619,19 @@ static VALUE rb_gsl_ran_gaussian_ziggurat(int argc, VALUE *argv, VALUE obj)
     }
     break;
   default:
-    Data_Get_Struct(obj, gsl_rng, r);    
+    Data_Get_Struct(obj, gsl_rng, r);
     switch (argc) {
     case 2:
       n = NUM2INT(argv[1]);
       sigma = NUM2DBL(argv[0]);
       v = gsl_vector_alloc(n);
-      for (i = 0; i < n; i++) 
-	gsl_vector_set(v, i, gsl_ran_gaussian_ziggurat(r, sigma));
+      for (i = 0; i < n; i++)
+        gsl_vector_set(v, i, gsl_ran_gaussian_ziggurat(r, sigma));
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     case 1:
       sigma = NUM2DBL(argv[0]);
-      /* no break */
+    /* no break */
     case 0:
       return rb_float_new(gsl_ran_gaussian_ziggurat(r, sigma));
       break;
@@ -1666,7 +1649,6 @@ static VALUE rb_gsl_ran_gamma_mt(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_gamma_mt);
 }
-#endif
 
 void Init_gsl_ran(VALUE module)
 {
@@ -1674,18 +1656,18 @@ void Init_gsl_ran(VALUE module)
   VALUE cgsl_ran_discrete;
 
   mgsl_ran = rb_define_module_under(module, "Ran");
-  
+
   rb_define_module_function(mgsl_ran, "gaussian", rb_gsl_ran_gaussian, -1);
   rb_define_module_function(mgsl_ran, "ugaussian", rb_gsl_ran_gaussian, -1);
   rb_define_method(cgsl_rng, "gaussian", rb_gsl_ran_gaussian, -1);
   rb_define_alias(cgsl_rng, "ugaussian", "gaussian");
 
-  rb_define_module_function(mgsl_ran, "gaussian_ratio_method", 
-			    rb_gsl_ran_gaussian_ratio_method, -1);
+  rb_define_module_function(mgsl_ran, "gaussian_ratio_method",
+                            rb_gsl_ran_gaussian_ratio_method, -1);
   rb_define_module_function(mgsl_ran, "ugaussian_ratio_method",
-			    rb_gsl_ran_gaussian_ratio_method, -1);
-  rb_define_method(cgsl_rng, "gaussian_ratio_method", 
-		   rb_gsl_ran_gaussian_ratio_method, -1);
+                            rb_gsl_ran_gaussian_ratio_method, -1);
+  rb_define_method(cgsl_rng, "gaussian_ratio_method",
+                   rb_gsl_ran_gaussian_ratio_method, -1);
   rb_define_alias(cgsl_rng, "ugaussian_ratio_method", "gaussian_ratio_method");
   rb_define_module_function(mgsl_ran,  "gaussian_pdf", rb_gsl_ran_gaussian_pdf, -1);
   rb_define_module_function(mgsl_ran,  "ugaussian_pdf", rb_gsl_ran_gaussian_pdf, -1);
@@ -1694,22 +1676,22 @@ void Init_gsl_ran(VALUE module)
   rb_define_module_function(mgsl_ran, "ugaussian_tail", rb_gsl_ran_gaussian_tail, -1);
   rb_define_method(cgsl_rng, "gaussian_tail", rb_gsl_ran_gaussian_tail, -1);
   rb_define_alias(cgsl_rng, "ugaussian_tail", "gaussian_tail");
-  rb_define_module_function(mgsl_ran,  "gaussian_tail_pdf", 
-			    rb_gsl_ran_gaussian_tail_pdf, -1);
-  rb_define_module_function(mgsl_ran,  "ugaussian_tail_pdf", 
-			    rb_gsl_ran_gaussian_tail_pdf, -1);
-
-  rb_define_module_function(mgsl_ran, "bivariate_gaussian", 
-		   rb_gsl_ran_bivariate_gaussian, -1);
-  rb_define_method(cgsl_rng, "bivariate_gaussian", 
-		   rb_gsl_ran_bivariate_gaussian, -1);
-  rb_define_module_function(mgsl_ran,  "bivariate_gaussian_pdf", 
-			    rb_gsl_ran_bivariate_gaussian_pdf, 5);
+  rb_define_module_function(mgsl_ran,  "gaussian_tail_pdf",
+                            rb_gsl_ran_gaussian_tail_pdf, -1);
+  rb_define_module_function(mgsl_ran,  "ugaussian_tail_pdf",
+                            rb_gsl_ran_gaussian_tail_pdf, -1);
+
+  rb_define_module_function(mgsl_ran, "bivariate_gaussian",
+                            rb_gsl_ran_bivariate_gaussian, -1);
+  rb_define_method(cgsl_rng, "bivariate_gaussian",
+                   rb_gsl_ran_bivariate_gaussian, -1);
+  rb_define_module_function(mgsl_ran,  "bivariate_gaussian_pdf",
+                            rb_gsl_ran_bivariate_gaussian_pdf, 5);
 
   rb_define_module_function(mgsl_ran, "exponential", rb_gsl_ran_exponential, -1);
   rb_define_method(cgsl_rng, "exponential", rb_gsl_ran_exponential, -1);
-  rb_define_module_function(mgsl_ran,  "exponential_pdf", 
-			    rb_gsl_ran_exponential_pdf, 2);
+  rb_define_module_function(mgsl_ran,  "exponential_pdf",
+                            rb_gsl_ran_exponential_pdf, 2);
 
   rb_define_module_function(mgsl_ran, "laplace", rb_gsl_ran_laplace, -1);
   rb_define_method(cgsl_rng, "laplace", rb_gsl_ran_laplace, -1);
@@ -1729,8 +1711,8 @@ void Init_gsl_ran(VALUE module)
 
   rb_define_module_function(mgsl_ran, "rayleigh_tail", rb_gsl_ran_rayleigh_tail, -1);
   rb_define_method(cgsl_rng, "rayleigh_tail", rb_gsl_ran_rayleigh_tail, -1);
-  rb_define_module_function(mgsl_ran,  "rayleigh_tail_pdf", 
-			    rb_gsl_ran_rayleigh_tail_pdf, 3);
+  rb_define_module_function(mgsl_ran,  "rayleigh_tail_pdf",
+                            rb_gsl_ran_rayleigh_tail_pdf, 3);
 
   rb_define_module_function(mgsl_ran, "landau", rb_gsl_ran_landau, -1);
   rb_define_method(cgsl_rng, "landau", rb_gsl_ran_landau, -1);
@@ -1799,14 +1781,12 @@ void Init_gsl_ran(VALUE module)
 
   rb_define_module_function(mgsl_ran, "binomial", rb_gsl_ran_binomial, -1);
   rb_define_method(cgsl_rng, "binomial", rb_gsl_ran_binomial, -1);
-#ifdef GSL_1_4_LATER
   rb_define_module_function(mgsl_ran, "binomial_tpe", rb_gsl_ran_binomial_tpe, -1);
   rb_define_method(cgsl_rng, "binomial_tpe", rb_gsl_ran_binomial_tpe, -1);
-#endif
   rb_define_module_function(mgsl_ran,  "binomial_pdf", rb_gsl_ran_binomial_pdf, 3);
 
-  rb_define_module_function(mgsl_ran, "negative_binomial", 
-			    rb_gsl_ran_negative_binomial, -1);
+  rb_define_module_function(mgsl_ran, "negative_binomial",
+                            rb_gsl_ran_negative_binomial, -1);
   rb_define_method(cgsl_rng, "negative_binomial", rb_gsl_ran_negative_binomial, -1);
   rb_define_module_function(mgsl_ran,  "negative_binomial_pdf", rb_gsl_ran_negative_binomial_pdf, 3);
 
@@ -1820,17 +1800,17 @@ void Init_gsl_ran(VALUE module)
 
   rb_define_module_function(mgsl_ran, "hypergeometric", rb_gsl_ran_hypergeometric, -1);
   rb_define_method(cgsl_rng, "hypergeometric", rb_gsl_ran_hypergeometric, -1);
-  rb_define_module_function(mgsl_ran,  "hypergeometric_pdf", 
-			    rb_gsl_ran_hypergeometric_pdf, 4);
+  rb_define_module_function(mgsl_ran,  "hypergeometric_pdf",
+                            rb_gsl_ran_hypergeometric_pdf, 4);
 
   rb_define_module_function(mgsl_ran, "logarithmic", rb_gsl_ran_logarithmic, -1);
   rb_define_method(cgsl_rng, "logarithmic", rb_gsl_ran_logarithmic, -1);
   rb_define_module_function(mgsl_ran,  "logarithmic_pdf",
-			    rb_gsl_ran_logarithmic_pdf, 2);
+                            rb_gsl_ran_logarithmic_pdf, 2);
 
   rb_define_module_function(mgsl_ran, "dir_2d", rb_gsl_ran_dir_2d, -1);
-  rb_define_module_function(mgsl_ran, "dir_2d_trig_method", 
-			    rb_gsl_ran_dir_2d_trig_method, -1);
+  rb_define_module_function(mgsl_ran, "dir_2d_trig_method",
+                            rb_gsl_ran_dir_2d_trig_method, -1);
   rb_define_module_function(mgsl_ran, "dir_3d", rb_gsl_ran_dir_3d, -1);
   rb_define_module_function(mgsl_ran, "dir_nd", rb_gsl_ran_dir_nd, -1);
 
@@ -1853,21 +1833,16 @@ void Init_gsl_ran(VALUE module)
   rb_define_method(cgsl_rng, "discrete", rb_gsl_ran_discrete, 1);
   rb_define_module_function(mgsl_ran,  "discrete_pdf", rb_gsl_ran_discrete_pdf, 2);
 
-#ifdef GSL_1_3_LATER
   rb_define_method(cgsl_rng, "dirichlet", rb_gsl_ran_dirichlet, -1);
   rb_define_module_function(mgsl_ran,  "dirichlet_pdf", rb_gsl_ran_dirichlet_pdf, 2);
   rb_define_module_function(mgsl_ran,  "dirichlet_lnpdf", rb_gsl_ran_dirichlet_lnpdf, 2);
-#endif
 
   /*  rb_define_method(cgsl_rng, "erlang", rb_gsl_ran_erlang, 2);
   rb_define_method(module, "ran_erlang_pdf", rb_gsl_ran_erlang_pdf, 3);
   rb_define_method(mgsl_ran, "erlang_pdf", rb_gsl_ran_erlang_pdf, 3);*/
 
-#ifdef GSL_1_8_LATER
   rb_define_module_function(mgsl_ran, "gaussian_ziggurat", rb_gsl_ran_gaussian_ziggurat, -1);
   rb_define_method(cgsl_rng, "gaussian_ziggurat", rb_gsl_ran_gaussian_ziggurat, -1);
   rb_define_module_function(mgsl_ran, "gamma_mt", rb_gsl_ran_gamma_mt, -1);
   rb_define_method(cgsl_rng, "gamma_mt", rb_gsl_ran_gamma_mt, -1);
-#endif
-
 }
diff --git a/ext/gsl/rational.c b/ext/gsl_native/rational.c
similarity index 96%
rename from ext/gsl/rational.c
rename to ext/gsl_native/rational.c
index 22fe230..6ec7028 100644
--- a/ext/gsl/rational.c
+++ b/ext/gsl_native/rational.c
@@ -199,7 +199,7 @@ static VALUE rb_gsl_poly_make_rational(VALUE obj, VALUE other)
     case T_ARRAY:
       p2 = gsl_vector_alloc(RARRAY_LEN(other));
       for (i = 0; i < p2->size; i++)
-	gsl_vector_set(p2, i, NUM2DBL(rb_ary_entry(other, i)));
+        gsl_vector_set(p2, i, NUM2DBL(rb_ary_entry(other, i)));
       rnew = gsl_rational_new(p, p2);
       gsl_vector_free(p2);
       break;
@@ -210,8 +210,8 @@ static VALUE rb_gsl_poly_make_rational(VALUE obj, VALUE other)
       return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, p2);
       break;
     default:
-      rb_raise(rb_eTypeError, "wrong argument type %s", 
-	       rb_class2name(CLASS_OF(other)));
+      rb_raise(rb_eTypeError, "wrong argument type %s",
+               rb_class2name(CLASS_OF(other)));
       break;
     }
   }
@@ -280,7 +280,7 @@ static VALUE rb_gsl_rational_uminus(VALUE obj)
   if (RATIONAL_P(obj)) {
     Data_Get_Struct(obj, gsl_rational, r);
     rnew = gsl_rational_new(r->pnum, r->pden);
-    for (i = 0; i < rnew->pnum->size; i++) 
+    for (i = 0; i < rnew->pnum->size; i++)
       gsl_vector_set(rnew->pnum, i, -gsl_vector_get(r->pnum, i));
     return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew);
   } else {
@@ -342,7 +342,7 @@ static VALUE rb_gsl_rational_div(VALUE obj, VALUE other)
     case T_ARRAY:
       p = gsl_vector_alloc(RARRAY_LEN(other));
       for (i = 0; i < p->size; i++)
-	gsl_vector_set(p, i, NUM2DBL(rb_ary_entry(other, i)));
+        gsl_vector_set(p, i, NUM2DBL(rb_ary_entry(other, i)));
       rnew = gsl_rational_div_poly(r, p);
       gsl_vector_free(p);
       break;
@@ -352,8 +352,8 @@ static VALUE rb_gsl_rational_div(VALUE obj, VALUE other)
       gsl_vector_scale(rnew->pnum, 1.0/NUM2DBL(other));
       break;
     default:
-      rb_raise(rb_eTypeError, "wrong argument type %s", 
-	       rb_class2name(CLASS_OF(other)));
+      rb_raise(rb_eTypeError, "wrong argument type %s",
+               rb_class2name(CLASS_OF(other)));
       break;
     }
   }
@@ -407,8 +407,8 @@ static VALUE rb_gsl_rational_coerce(VALUE obj, VALUE other)
   ptmp = gsl_vector_alloc(1);
   gsl_vector_set(ptmp, 0, 1.0);
   r = gsl_rational_new2(p, ptmp);
-  return rb_ary_new3(2, 
-		     Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, r), obj);
+  return rb_ary_new3(2,
+                     Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, r), obj);
 }
 
 static VALUE rb_gsl_rational_zero(VALUE obj)
diff --git a/ext/gsl/rng.c b/ext/gsl_native/rng.c
similarity index 96%
rename from ext/gsl/rng.c
rename to ext/gsl_native/rng.c
index 3bb31f6..568b3ed 100644
--- a/ext/gsl/rng.c
+++ b/ext/gsl_native/rng.c
@@ -9,7 +9,7 @@
   WITHOUT ANY WARRANTY.
 */
 
-/* 
+/*
    Document-class: <i>GSL::Rng</i>
    Random number generator
 */
@@ -24,22 +24,22 @@ VALUE cgsl_rng;
 
 enum rb_gsl_rng_generator {
   GSL_RNG_DEFAULT,
-  GSL_RNG_MT19937, GSL_RNG_MT19937_1999, GSL_RNG_MT19937_1998, 
-  GSL_RNG_RANLXS0, GSL_RNG_RANLXS1, GSL_RNG_RANLXS2, 
-  GSL_RNG_RANLXD1, GSL_RNG_RANLXD2, 
+  GSL_RNG_MT19937, GSL_RNG_MT19937_1999, GSL_RNG_MT19937_1998,
+  GSL_RNG_RANLXS0, GSL_RNG_RANLXS1, GSL_RNG_RANLXS2,
+  GSL_RNG_RANLXD1, GSL_RNG_RANLXD2,
   GSL_RNG_RANLUX, GSL_RNG_RANLUX389,
-  GSL_RNG_CMRG, GSL_RNG_MRG, 
+  GSL_RNG_CMRG, GSL_RNG_MRG,
   GSL_RNG_TAUS, GSL_RNG_TAUS2, GSL_RNG_TAUS113,  GSL_RNG_GFSR4,
-  GSL_RNG_RAND, 
+  GSL_RNG_RAND,
   GSL_RNG_RANDOM_BSD, GSL_RNG_RANDOM_GLIBC2,
-  GSL_RNG_RANDOM8_GLIBC2, GSL_RNG_RANDOM32_GLIBC2, GSL_RNG_RANDOM64_GLIBC2, 
+  GSL_RNG_RANDOM8_GLIBC2, GSL_RNG_RANDOM32_GLIBC2, GSL_RNG_RANDOM64_GLIBC2,
   GSL_RNG_RANDOM128_GLIBC2, GSL_RNG_RANDOM256_GLIBC2,
-  GSL_RNG_RANDOM8_BSD, GSL_RNG_RANDOM32_BSD, GSL_RNG_RANDOM64_BSD, 
+  GSL_RNG_RANDOM8_BSD, GSL_RNG_RANDOM32_BSD, GSL_RNG_RANDOM64_BSD,
   GSL_RNG_RANDOM128_BSD, GSL_RNG_RANDOM256_BSD,
-  GSL_RNG_RANDOM_LIBC5, GSL_RNG_RANDOM8_LIBC5, GSL_RNG_RANDOM32_LIBC5, 
-  GSL_RNG_RANDOM64_LIBC5, GSL_RNG_RANDOM128_LIBC5, GSL_RNG_RANDOM256_LIBC5, 
-  GSL_RNG_RAND48, 
-  GSL_RNG_RAN0, GSL_RNG_RAN1, GSL_RNG_RAN2, GSL_RNG_RAN3, 
+  GSL_RNG_RANDOM_LIBC5, GSL_RNG_RANDOM8_LIBC5, GSL_RNG_RANDOM32_LIBC5,
+  GSL_RNG_RANDOM64_LIBC5, GSL_RNG_RANDOM128_LIBC5, GSL_RNG_RANDOM256_LIBC5,
+  GSL_RNG_RAND48,
+  GSL_RNG_RAN0, GSL_RNG_RAN1, GSL_RNG_RAN2, GSL_RNG_RAN3,
   GSL_RNG_RANF, GSL_RNG_RANMAR, GSL_RNG_R250, GSL_RNG_TT800, GSL_RNG_VAX,
   GSL_RNG_TRANSPUTER, GSL_RNG_RANDU, GSL_RNG_MINSTD,
   GSL_RNG_UNI, GSL_RNG_UNI32, GSL_RNG_SLATEC, GSL_RNG_ZUF,
@@ -70,16 +70,16 @@ static VALUE rb_gsl_rng_alloc(int argc, VALUE *argv, VALUE klass)
     T = gsl_rng_default;
     seed = gsl_rng_default_seed;
   } else {
-    T = get_gsl_rng_type(argv[0]);    
+    T = get_gsl_rng_type(argv[0]);
     if (argc == 1) {
       seed = gsl_rng_default_seed;
     } else if (argc == 2) {
       itype = TYPE(argv[1]);
       if (itype == T_FIXNUM || itype == T_BIGNUM) {
-	seed = FIX2INT(argv[1]);
+        seed = FIX2INT(argv[1]);
       } else {
-	rb_raise(rb_eArgError, 
-		 "bad argument 2, seed must be an integer.");
+        rb_raise(rb_eArgError,
+                 "bad argument 2, seed must be an integer.");
       }
     } else {
       rb_raise(rb_eArgError, "too many arguments (%d for 0 or 1)", argc);
@@ -110,7 +110,6 @@ static const gsl_rng_type* get_gsl_rng_type_name(char *name)
 {
   if (str_tail_grep(name, "default") == 0) return gsl_rng_default;
   else if (str_tail_grep(name, "mt19937") == 0) return gsl_rng_mt19937;
-#ifdef GSL_1_1_LATER
   else if (str_tail_grep(name, "borosh13") == 0) return gsl_rng_borosh13;
   else if (str_tail_grep(name, "coveyou") == 0) return gsl_rng_coveyou;
   else if (str_tail_grep(name, "fishman18") == 0) return gsl_rng_fishman18;
@@ -120,15 +119,12 @@ static const gsl_rng_type* get_gsl_rng_type_name(char *name)
   else if (str_tail_grep(name, "waterman14") == 0) return gsl_rng_waterman14;
   else if (str_tail_grep(name, "knuthran") == 0) return gsl_rng_knuthran;
   else if (str_tail_grep(name, "knuthran2") == 0) return gsl_rng_knuthran2;
-#endif
-#ifdef GSL_1_2_LATER
   else if (str_tail_grep(name, "mt19937_1999") == 0) return gsl_rng_mt19937_1999;
   else if (str_tail_grep(name, "mt19937-1999") == 0) return gsl_rng_mt19937_1999;
-  else if (str_tail_grep(name, "mt19937_1998") == 0) return gsl_rng_mt19937_1998;  
-  else if (str_tail_grep(name, "mt19937-1998") == 0) return gsl_rng_mt19937_1998;  
+  else if (str_tail_grep(name, "mt19937_1998") == 0) return gsl_rng_mt19937_1998;
+  else if (str_tail_grep(name, "mt19937-1998") == 0) return gsl_rng_mt19937_1998;
   else if (str_tail_grep(name, "taus113") == 0) return gsl_rng_taus113;
   else if (str_tail_grep(name, "taus2") == 0) return gsl_rng_taus2;
-#endif
   else if (str_tail_grep(name, "mt19937") == 0) return gsl_rng_mt19937;
   else if (str_tail_grep(name, "ranlxs0") == 0) return gsl_rng_ranlxs0;
   else if (str_tail_grep(name, "ranlxs1") == 0) return gsl_rng_ranlxs1;
@@ -147,7 +143,7 @@ static const gsl_rng_type* get_gsl_rng_type_name(char *name)
   else if (str_tail_grep(name, "random32_libc5") == 0) return gsl_rng_random32_libc5;
   else if (str_tail_grep(name, "random64_libc5") == 0) return gsl_rng_random64_libc5;
   else if (str_tail_grep(name, "random128_libc5") == 0) return gsl_rng_random128_libc5;
-  else if (str_tail_grep(name, "random256_libc5") == 0) return gsl_rng_random256_libc5;  
+  else if (str_tail_grep(name, "random256_libc5") == 0) return gsl_rng_random256_libc5;
   else if (str_tail_grep(name, "random-libc5") == 0) return gsl_rng_random_libc5;
   else if (str_tail_grep(name, "random8-libc5") == 0) return gsl_rng_random8_libc5;
   else if (str_tail_grep(name, "random32-libc5") == 0) return gsl_rng_random32_libc5;
@@ -201,18 +197,16 @@ static const gsl_rng_type* get_gsl_rng_type_name(char *name)
   else if (str_tail_grep(name, "rngextra-rng1") == 0) return rngextra_rng1;
   else if (str_tail_grep(name, "rngextra-rng2") == 0) return rngextra_rng2;
 #else
-  else if (str_tail_grep(name, "rngextra_rng1")*str_tail_grep(name, "rngextra_rng2") == 0) 
+  else if (str_tail_grep(name, "rngextra_rng1")*str_tail_grep(name, "rngextra_rng2") == 0)
     rb_raise(rb_eNotImpError, "Install the rngextra package found at <http://www.network-theory.co.uk/download/rngextra/>.");
-  else if (str_tail_grep(name, "rngextra_rng2")*str_tail_grep(name, "rngextra_rng2") == 0) 
+  else if (str_tail_grep(name, "rngextra_rng2")*str_tail_grep(name, "rngextra_rng2") == 0)
     rb_raise(rb_eNotImpError, "Install the rngextra package found at <http://www.network-theory.co.uk/download/rngextra/>.");
-  else if (str_tail_grep(name, "rngextra-rng1")*str_tail_grep(name, "rngextra_rng2") == 0) 
+  else if (str_tail_grep(name, "rngextra-rng1")*str_tail_grep(name, "rngextra_rng2") == 0)
     rb_raise(rb_eNotImpError, "Install the rngextra package found at <http://www.network-theory.co.uk/download/rngextra/>.");
-  else if (str_tail_grep(name, "rngextra-rng2")*str_tail_grep(name, "rngextra_rng2") == 0) 
+  else if (str_tail_grep(name, "rngextra-rng2")*str_tail_grep(name, "rngextra_rng2") == 0)
     rb_raise(rb_eNotImpError, "Install the rngextra package found at <http://www.network-theory.co.uk/download/rngextra/>.");
 #endif
-#ifdef GSL_1_9_LATER
   else if (str_tail_grep(name, "knuthran2002") == 0) return gsl_rng_knuthran2002;
-#endif
   else
     rb_raise(rb_eArgError, "unknown generator type \"%s\"", name);
 }
@@ -224,12 +218,10 @@ static const gsl_rng_type* get_gsl_rng_type_int(int itype)
   switch (itype) {
   case GSL_RNG_DEFAULT: T = gsl_rng_default; break;
   case GSL_RNG_MT19937: T = gsl_rng_mt19937; break; /* default */
-#ifdef GSL_1_2_LATER
   case GSL_RNG_MT19937_1999: T = gsl_rng_mt19937_1999; break;
   case GSL_RNG_MT19937_1998: T = gsl_rng_mt19937_1998; break;
   case GSL_RNG_TAUS113: T = gsl_rng_taus113; break;
   case GSL_RNG_TAUS2: T = gsl_rng_taus2; break;
-#endif
   case GSL_RNG_RANLXS0: T = gsl_rng_ranlxs0; break;
   case GSL_RNG_RANLXS1: T = gsl_rng_ranlxs1; break;
   case GSL_RNG_RANLXS2: T = gsl_rng_ranlxs2; break;
@@ -277,7 +269,6 @@ static const gsl_rng_type* get_gsl_rng_type_int(int itype)
   case GSL_RNG_UNI32: T = gsl_rng_uni32; break;
   case GSL_RNG_SLATEC: T = gsl_rng_slatec; break;
   case GSL_RNG_ZUF: T = gsl_rng_zuf; break;
-#ifdef GSL_1_1_LATER
   case GSL_RNG_BOROSH13: T = gsl_rng_borosh13; break;
   case GSL_RNG_COVEYOU: T = gsl_rng_coveyou; break;
   case GSL_RNG_FISHMAN18: T = gsl_rng_fishman18; break;
@@ -287,7 +278,6 @@ static const gsl_rng_type* get_gsl_rng_type_int(int itype)
   case GSL_RNG_KNUTHRAN2: T = gsl_rng_knuthran2; break;
   case GSL_RNG_LECUYER21: T = gsl_rng_lecuyer21; break;
   case GSL_RNG_WATERMAN14: T = gsl_rng_waterman14; break;
-#endif
 #ifdef HAVE_RNGEXTRA_RNGEXTRA_H
   case GSL_RNGEXTRA_RNG1: T = rngextra_rng1; break;
   case GSL_RNGEXTRA_RNG2: T = rngextra_rng2; break;
@@ -297,14 +287,12 @@ static const gsl_rng_type* get_gsl_rng_type_int(int itype)
     rb_raise(rb_eNotImpError, "Install the rngextra package found at <http://www.network-theory.co.uk/download/rngextra/>.");
     break;
 #endif
-#ifdef GSL_1_9_LATER
   case GSL_RNG_KNUTHRAN2002: T = gsl_rng_knuthran2002; break;
-#endif
   default:
     rb_raise(rb_eTypeError, "wrong generator type");
   }
 
-  return  T;
+  return T;
 }
 
 static void rb_gsl_rng_define_const_type(VALUE module)
@@ -404,10 +392,10 @@ static VALUE rb_gsl_rng_set(VALUE obj, VALUE s)
 
 /*
   Document-method: <i>GSL::Rng#get</i>
-    Returns a random integer from the generator. 
-    The minimum and maximum values depend on the algorithm used, 
-    but all integers in the range [min,max] are equally likely. 
-    The values of min and max can determined using the auxiliary 
+    Returns a random integer from the generator.
+    The minimum and maximum values depend on the algorithm used,
+    but all integers in the range [min,max] are equally likely.
+    The values of min and max can determined using the auxiliary
     methodss GSL::Rng#max and GSL::Rng#min.
 */
 static VALUE rb_gsl_rng_get(int argc, VALUE *argv, VALUE obj)
@@ -533,7 +521,6 @@ static VALUE rb_gsl_rng_print_state(VALUE obj)
   return obj;
 }
 
-#ifdef GSL_1_4_LATER
 static VALUE rb_gsl_rng_fwrite(VALUE obj, VALUE io)
 {
   gsl_rng *h = NULL;
@@ -557,7 +544,6 @@ static VALUE rb_gsl_rng_fread(VALUE obj, VALUE io)
   if (flag == 1) fclose(f);
   return INT2FIX(status);
 }
-#endif
 
 static VALUE rb_gsl_rng_memcpy(VALUE obj, VALUE dst, VALUE org)
 {
@@ -574,7 +560,7 @@ void Init_gsl_rng(VALUE module)
   cgsl_rng = rb_define_class_under(module, "Rng", cGSL_Object);
 
   rb_gsl_rng_define_const_type(module);
-  
+
   rb_define_singleton_method(cgsl_rng, "alloc", rb_gsl_rng_alloc, -1);
 
   rb_define_singleton_method(cgsl_rng, "default_seed", rb_gsl_rng_default_seed, 0);
@@ -603,9 +589,7 @@ void Init_gsl_rng(VALUE module)
   rb_define_alias(cgsl_rng, "duplicate", "clone");
   rb_define_method(cgsl_rng, "print_state", rb_gsl_rng_print_state, 0);
 
-#ifdef GSL_1_4_LATER
   rb_define_method(cgsl_rng, "fwrite", rb_gsl_rng_fwrite, 1);
   rb_define_method(cgsl_rng, "fread", rb_gsl_rng_fread, 1);
-#endif
   rb_define_singleton_method(cgsl_rng, "memcpy", rb_gsl_rng_memcpy, 2);
 }
diff --git a/ext/gsl/root.c b/ext/gsl_native/root.c
similarity index 89%
rename from ext/gsl/root.c
rename to ext/gsl_native/root.c
index 9a9b5af..dfed2c8 100644
--- a/ext/gsl/root.c
+++ b/ext/gsl_native/root.c
@@ -2,7 +2,7 @@
   root.c
   Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
   (C) Copyright 2004 by Yoshiki Tsunesada
-  
+
   Ruby/GSL is free software: you can redistribute it and/or modify it
   under the terms of the GNU General Public License.
   This library is distributed in the hope that it will be useful, but
@@ -42,8 +42,8 @@ static VALUE rb_gsl_fsolver_new(VALUE klass, VALUE t)
     } else if (!str_tail_grep(name, "brent")) {
       T = gsl_root_fsolver_brent;
     } else {
-      rb_raise(rb_eTypeError, 
-	       "type must be \"bisection\" or \"falsepos\", or \"brent\".");
+      rb_raise(rb_eTypeError,
+               "type must be \"bisection\" or \"falsepos\", or \"brent\".");
     }
     break;
   case T_FIXNUM:
@@ -64,7 +64,7 @@ static VALUE rb_gsl_fsolver_new(VALUE klass, VALUE t)
     break;
   default:
     rb_raise(rb_eTypeError, "wrong argument type %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(t)));
+             rb_class2name(CLASS_OF(t)));
     break;
   }
   s = gsl_root_fsolver_alloc(T);
@@ -124,28 +124,28 @@ static VALUE rb_gsl_fsolver_name(VALUE obj)
 static VALUE rb_gsl_fsolver_test_interval(VALUE obj, VALUE eabs, VALUE erel)
 {
   gsl_root_fsolver *s = NULL;
-  Need_Float(eabs); Need_Float(erel); 
+  Need_Float(eabs); Need_Float(erel);
   Data_Get_Struct(obj, gsl_root_fsolver, s);
   return INT2FIX(gsl_root_test_interval(s->x_lower, s->x_upper,
-					NUM2DBL(eabs), NUM2DBL(erel)));
+                                        NUM2DBL(eabs), NUM2DBL(erel)));
 }
 
 static VALUE rb_gsl_root_test_interval(VALUE obj, VALUE xl, VALUE xu, VALUE eabs,
-				       VALUE erel)
+                                       VALUE erel)
 {
   Need_Float(xl); Need_Float(xu);
-  Need_Float(eabs); Need_Float(erel); 
+  Need_Float(eabs); Need_Float(erel);
   return INT2FIX(gsl_root_test_interval(NUM2DBL(xl), NUM2DBL(xu),
-					NUM2DBL(eabs), NUM2DBL(erel)));
+                                        NUM2DBL(eabs), NUM2DBL(erel)));
 }
 
 static VALUE rb_gsl_root_test_delta(VALUE obj, VALUE xl, VALUE xu, VALUE eabs,
-				       VALUE erel)
+                                    VALUE erel)
 {
   Need_Float(xl); Need_Float(xu);
-  Need_Float(eabs); Need_Float(erel); 
+  Need_Float(eabs); Need_Float(erel);
   return INT2FIX(gsl_root_test_delta(NUM2DBL(xl), NUM2DBL(xu),
-				     NUM2DBL(eabs), NUM2DBL(erel)));
+                                     NUM2DBL(eabs), NUM2DBL(erel)));
 }
 
 static VALUE rb_gsl_root_test_residual(VALUE obj, VALUE xl,VALUE eabs)
@@ -154,7 +154,7 @@ static VALUE rb_gsl_root_test_residual(VALUE obj, VALUE xl,VALUE eabs)
   return INT2FIX(gsl_root_test_residual(NUM2DBL(xl),  NUM2DBL(eabs)));
 }
 
-static VALUE rb_gsl_fsolver_solve(int argc, VALUE *argv, VALUE *obj)
+static VALUE rb_gsl_fsolver_solve(int argc, VALUE *argv, VALUE obj)
 {
   gsl_root_fsolver *s = NULL;
   gsl_function *F = NULL;
@@ -165,15 +165,15 @@ static VALUE rb_gsl_fsolver_solve(int argc, VALUE *argv, VALUE *obj)
     Check_Type(argv[2], T_ARRAY);
     epsabs = NUM2DBL(rb_ary_entry(argv[2], 0));
     epsrel = NUM2DBL(rb_ary_entry(argv[2], 1));
-    /* no break */
+  /* no break */
   case 2:
     Check_Type(argv[1], T_ARRAY);
     xl = NUM2DBL(rb_ary_entry(argv[1], 0));
     xh = NUM2DBL(rb_ary_entry(argv[1], 1));
     break;
   default:
-    rb_raise(rb_eArgError, 
-	     "Usage: solve(f = Function, range = Array, eps = Array)");
+    rb_raise(rb_eArgError,
+             "Usage: solve(f = Function, range = Array, eps = Array)");
     break;
   }
   CHECK_FUNCTION(argv[0]);
@@ -228,7 +228,7 @@ static VALUE rb_gsl_fdfsolver_new(VALUE klass, VALUE t)
     break;
   default:
     rb_raise(rb_eTypeError, "wrong argument type %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(t)));
+             rb_class2name(CLASS_OF(t)));
     break;
   }
   s = gsl_root_fdfsolver_alloc(T);
@@ -269,7 +269,7 @@ static VALUE rb_gsl_fdfsolver_name(VALUE obj)
   return rb_str_new2(gsl_root_fdfsolver_name(s));
 }
 
-static VALUE rb_gsl_fdfsolver_solve(int argc, VALUE *argv, VALUE *obj)
+static VALUE rb_gsl_fdfsolver_solve(int argc, VALUE *argv, VALUE obj)
 {
   gsl_root_fdfsolver *s = NULL;
   double x = 0.0, x0, epsabs = 0.0, epsrel = 1e-6;
@@ -280,7 +280,7 @@ static VALUE rb_gsl_fdfsolver_solve(int argc, VALUE *argv, VALUE *obj)
     Check_Type(argv[2], T_ARRAY);
     epsabs = NUM2DBL(rb_ary_entry(argv[2], 0));
     epsrel = NUM2DBL(rb_ary_entry(argv[2], 1));
-    /* no break */
+  /* no break */
   case 2:
     Need_Float(argv[1]);
     x0 = NUM2DBL(argv[1]);
@@ -292,7 +292,7 @@ static VALUE rb_gsl_fdfsolver_solve(int argc, VALUE *argv, VALUE *obj)
   CHECK_FUNCTION_FDF(argv[0]);
   Data_Get_Struct(argv[0], gsl_function_fdf, F);
   Data_Get_Struct(obj, gsl_root_fdfsolver, s);
-  gsl_root_fdfsolver_set(s, F, x0);  
+  gsl_root_fdfsolver_set(s, F, x0);
   do {
     iter++;
     status = gsl_root_fdfsolver_iterate (s);
@@ -361,32 +361,32 @@ void Init_gsl_root(VALUE module)
   mgsl_root = rb_define_module_under(module, "Root");
 
   cgsl_fsolver = rb_define_class_under(mgsl_root, "FSolver", cGSL_Object);
-  rb_define_singleton_method(cgsl_fsolver, "alloc", rb_gsl_fsolver_new, 1);  
-
-  rb_define_method(cgsl_fsolver, "set", rb_gsl_fsolver_set, 3);  
-  rb_define_method(cgsl_fsolver, "iterate", rb_gsl_fsolver_iterate, 0);  
-  rb_define_method(cgsl_fsolver, "root", rb_gsl_fsolver_root, 0);  
-  rb_define_method(cgsl_fsolver, "name", rb_gsl_fsolver_name, 0);  
-  rb_define_method(cgsl_fsolver, "x_lower", rb_gsl_fsolver_x_lower, 0);  
-  rb_define_method(cgsl_fsolver, "x_upper", rb_gsl_fsolver_x_upper, 0);  
-  rb_define_method(cgsl_fsolver, "test_interval", rb_gsl_fsolver_test_interval, 2);  
-  rb_define_method(cgsl_fsolver, "solve", rb_gsl_fsolver_solve, -1);  
-
-  rb_define_singleton_method(mgsl_root, "test_interval", 
-			    rb_gsl_root_test_interval, 4);
-  rb_define_singleton_method(mgsl_root, "test_delta", 
-			    rb_gsl_root_test_delta, 4);
-  rb_define_singleton_method(mgsl_root, "test_residual", 
-			    rb_gsl_root_test_residual, 2);
+  rb_define_singleton_method(cgsl_fsolver, "alloc", rb_gsl_fsolver_new, 1);
+
+  rb_define_method(cgsl_fsolver, "set", rb_gsl_fsolver_set, 3);
+  rb_define_method(cgsl_fsolver, "iterate", rb_gsl_fsolver_iterate, 0);
+  rb_define_method(cgsl_fsolver, "root", rb_gsl_fsolver_root, 0);
+  rb_define_method(cgsl_fsolver, "name", rb_gsl_fsolver_name, 0);
+  rb_define_method(cgsl_fsolver, "x_lower", rb_gsl_fsolver_x_lower, 0);
+  rb_define_method(cgsl_fsolver, "x_upper", rb_gsl_fsolver_x_upper, 0);
+  rb_define_method(cgsl_fsolver, "test_interval", rb_gsl_fsolver_test_interval, 2);
+  rb_define_method(cgsl_fsolver, "solve", rb_gsl_fsolver_solve, -1);
+
+  rb_define_singleton_method(mgsl_root, "test_interval",
+                             rb_gsl_root_test_interval, 4);
+  rb_define_singleton_method(mgsl_root, "test_delta",
+                             rb_gsl_root_test_delta, 4);
+  rb_define_singleton_method(mgsl_root, "test_residual",
+                             rb_gsl_root_test_residual, 2);
 
   cgsl_fdfsolver = rb_define_class_under(mgsl_root, "FdfSolver", cGSL_Object);
-  rb_define_singleton_method(cgsl_fdfsolver, "alloc", rb_gsl_fdfsolver_new, 1);  
+  rb_define_singleton_method(cgsl_fdfsolver, "alloc", rb_gsl_fdfsolver_new, 1);
 
-  rb_define_method(cgsl_fdfsolver, "set", rb_gsl_fdfsolver_set, 2);  
-  rb_define_method(cgsl_fdfsolver, "iterate", rb_gsl_fdfsolver_iterate, 0);  
-  rb_define_method(cgsl_fdfsolver, "root", rb_gsl_fdfsolver_root, 0);  
-  rb_define_method(cgsl_fdfsolver, "name", rb_gsl_fdfsolver_name, 0);  
-  rb_define_method(cgsl_fdfsolver, "solve", rb_gsl_fdfsolver_solve, -1);  
+  rb_define_method(cgsl_fdfsolver, "set", rb_gsl_fdfsolver_set, 2);
+  rb_define_method(cgsl_fdfsolver, "iterate", rb_gsl_fdfsolver_iterate, 0);
+  rb_define_method(cgsl_fdfsolver, "root", rb_gsl_fdfsolver_root, 0);
+  rb_define_method(cgsl_fdfsolver, "name", rb_gsl_fdfsolver_name, 0);
+  rb_define_method(cgsl_fdfsolver, "solve", rb_gsl_fdfsolver_solve, -1);
 
   rb_define_method(cgsl_function, "fsolve", rb_gsl_function_rootfinder, -1);
   rb_define_alias(cgsl_function, "solve", "fsolve");
diff --git a/ext/gsl/sf.c b/ext/gsl_native/sf.c
similarity index 85%
rename from ext/gsl/sf.c
rename to ext/gsl_native/sf.c
index 6059ef2..aa50546 100644
--- a/ext/gsl/sf.c
+++ b/ext/gsl_native/sf.c
@@ -12,9 +12,6 @@
 
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_sf.h"
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 VALUE cgsl_sf_result, cgsl_sf_result_e10;
 
@@ -154,10 +151,6 @@ VALUE rb_gsl_sf_eval_int_double(double (*func)(int, double), VALUE jj, VALUE arg
   VALUE ary, xx;
   size_t i, j, k, n;
   double val;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   CHECK_FIXNUM(jj);
   j = FIX2INT(jj);
   if (CLASS_OF(argv) == rb_cRange) argv = rb_gsl_range2ary(argv);
@@ -181,6 +174,8 @@ VALUE rb_gsl_sf_eval_int_double(double (*func)(int, double), VALUE jj, VALUE arg
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -195,10 +190,10 @@ VALUE rb_gsl_sf_eval_int_double(double (*func)(int, double), VALUE jj, VALUE arg
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  val = (*func)(j, gsl_matrix_get(m, i, k));
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < m->size2; k++) {
+          val = (*func)(j, gsl_matrix_get(m, i, k));
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -207,8 +202,8 @@ VALUE rb_gsl_sf_eval_int_double(double (*func)(int, double), VALUE jj, VALUE arg
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(j, gsl_vector_get(v, i));
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(j, gsl_vector_get(v, i));
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -223,10 +218,6 @@ VALUE rb_gsl_sf_eval_double_int(double (*func)(double, int), VALUE argv, VALUE j
   VALUE ary, xx;
   size_t i, j, k, n;
   double val;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   CHECK_FIXNUM(jj);
   j = FIX2INT(jj);
   if (CLASS_OF(argv) == rb_cRange) argv = rb_gsl_range2ary(argv);
@@ -250,6 +241,8 @@ VALUE rb_gsl_sf_eval_double_int(double (*func)(double, int), VALUE argv, VALUE j
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -264,10 +257,10 @@ VALUE rb_gsl_sf_eval_double_int(double (*func)(double, int), VALUE argv, VALUE j
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  val = (*func)(gsl_matrix_get(m, i, k), j);
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < m->size2; k++) {
+          val = (*func)(gsl_matrix_get(m, i, k), j);
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -276,8 +269,8 @@ VALUE rb_gsl_sf_eval_double_int(double (*func)(double, int), VALUE argv, VALUE j
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(gsl_vector_get(v, i), j);
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(gsl_vector_get(v, i), j);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -287,17 +280,13 @@ VALUE rb_gsl_sf_eval_double_int(double (*func)(double, int), VALUE argv, VALUE j
 }
 
 VALUE rb_gsl_sf_eval_int_int_double(double (*func)(int, int, double), VALUE jj,
-				    VALUE jj2, VALUE argv)
+                                    VALUE jj2, VALUE argv)
 {
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
   VALUE ary, xx;
   size_t i, j, k, j2, n;
   double val;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   CHECK_FIXNUM(jj); CHECK_FIXNUM(jj2);
   j = FIX2INT(jj);
   j2 = FIX2INT(jj2);
@@ -322,6 +311,8 @@ VALUE rb_gsl_sf_eval_int_int_double(double (*func)(int, int, double), VALUE jj,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -357,18 +348,14 @@ VALUE rb_gsl_sf_eval_int_int_double(double (*func)(int, int, double), VALUE jj,
   }
 }
 
-VALUE rb_gsl_sf_eval_int_double_double(double (*func)(int, double, double), VALUE jj, 
-				       VALUE ff, VALUE argv)
+VALUE rb_gsl_sf_eval_int_double_double(double (*func)(int, double, double), VALUE jj,
+                                       VALUE ff, VALUE argv)
 {
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
   VALUE ary, xx;
   size_t i, j, k, n;
   double f, val;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   CHECK_FIXNUM(jj);
   Need_Float(ff);
   j = FIX2INT(jj);
@@ -394,6 +381,8 @@ VALUE rb_gsl_sf_eval_int_double_double(double (*func)(int, double, double), VALU
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -408,10 +397,10 @@ VALUE rb_gsl_sf_eval_int_double_double(double (*func)(int, double, double), VALU
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  val = (*func)(j, f, gsl_matrix_get(m, i, k));
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < m->size2; k++) {
+          val = (*func)(j, f, gsl_matrix_get(m, i, k));
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -420,8 +409,8 @@ VALUE rb_gsl_sf_eval_int_double_double(double (*func)(int, double, double), VALU
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(j, f, gsl_vector_get(v, i));
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(j, f, gsl_vector_get(v, i));
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -436,10 +425,6 @@ VALUE rb_gsl_sf_eval_double_double(double (*func)(double, double), VALUE ff, VAL
   VALUE ary, xx;
   size_t i, k, n;
   double val, f;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   Need_Float(ff);
   f = NUM2DBL(ff);
   if (CLASS_OF(argv) == rb_cRange) argv = rb_gsl_range2ary(argv);
@@ -463,6 +448,8 @@ VALUE rb_gsl_sf_eval_double_double(double (*func)(double, double), VALUE ff, VAL
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -477,9 +464,9 @@ VALUE rb_gsl_sf_eval_double_double(double (*func)(double, double), VALUE ff, VAL
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  gsl_matrix_set(mnew, i, k, (*func)(f, gsl_matrix_get(m, i, k)));
-	}
+        for (k = 0; k < m->size2; k++) {
+          gsl_matrix_set(mnew, i, k, (*func)(f, gsl_matrix_get(m, i, k)));
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -487,7 +474,7 @@ VALUE rb_gsl_sf_eval_double_double(double (*func)(double, double), VALUE ff, VAL
       Data_Get_Struct(argv, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	gsl_vector_set(vnew, i, (*func)(f, gsl_vector_get(v, i)));
+        gsl_vector_set(vnew, i, (*func)(f, gsl_vector_get(v, i)));
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -495,18 +482,14 @@ VALUE rb_gsl_sf_eval_double_double(double (*func)(double, double), VALUE ff, VAL
   }
 }
 
-VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double), 
-			     VALUE ff, VALUE ff2, VALUE argv)
+VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double),
+                             VALUE ff, VALUE ff2, VALUE argv)
 {
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
   VALUE ary, xx;
   size_t i, k, n;
   double val, f, f2;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   Need_Float(ff); Need_Float(ff2);
   f = NUM2DBL(ff);
   f2 = NUM2DBL(ff2);
@@ -531,6 +514,8 @@ VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double),
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -545,10 +530,10 @@ VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double),
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  val = (*func)(f, f2, gsl_matrix_get(m, i, k));
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < m->size2; k++) {
+          val = (*func)(f, f2, gsl_matrix_get(m, i, k));
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -557,8 +542,8 @@ VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double),
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(f, f2, gsl_vector_get(v, i));
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(f, f2, gsl_vector_get(v, i));
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -566,18 +551,14 @@ VALUE rb_gsl_sf_eval_double3(double (*func)(double, double, double),
   }
 }
 
-VALUE rb_gsl_sf_eval_double4(double (*func)(double, double, double, double), 
-			     VALUE ff, VALUE ff2, VALUE ff3, VALUE argv)
+VALUE rb_gsl_sf_eval_double4(double (*func)(double, double, double, double),
+                             VALUE ff, VALUE ff2, VALUE ff3, VALUE argv)
 {
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *m = NULL, *mnew = NULL;
   VALUE ary, xx;
   size_t i, k, n;
   double val, f, f2, f3;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   Need_Float(ff); Need_Float(ff2); Need_Float(ff3);
   f = NUM2DBL(ff);
   f2 = NUM2DBL(ff2);
@@ -603,6 +584,8 @@ VALUE rb_gsl_sf_eval_double4(double (*func)(double, double, double, double),
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -617,10 +600,10 @@ VALUE rb_gsl_sf_eval_double4(double (*func)(double, double, double, double),
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  val = (*func)(f, f2, f3, gsl_matrix_get(m, i, k));
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < m->size2; k++) {
+          val = (*func)(f, f2, f3, gsl_matrix_get(m, i, k));
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -629,8 +612,8 @@ VALUE rb_gsl_sf_eval_double4(double (*func)(double, double, double, double),
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(f, f2, f3, gsl_vector_get(v, i));
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(f, f2, f3, gsl_vector_get(v, i));
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -645,10 +628,6 @@ VALUE rb_gsl_sf_eval1_int(double (*func)(int), VALUE argv)
   VALUE ary;
   size_t i, k, n;
   double val;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   if (CLASS_OF(argv) == rb_cRange) argv = rb_gsl_range2ary(argv);
   switch (TYPE(argv)) {
   case T_FIXNUM:
@@ -668,6 +647,8 @@ VALUE rb_gsl_sf_eval1_int(double (*func)(int), VALUE argv)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -682,10 +663,10 @@ VALUE rb_gsl_sf_eval1_int(double (*func)(int), VALUE argv)
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  val = (*func)((int) gsl_matrix_get(m, i, k));
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < m->size2; k++) {
+          val = (*func)((int) gsl_matrix_get(m, i, k));
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -694,8 +675,8 @@ VALUE rb_gsl_sf_eval1_int(double (*func)(int), VALUE argv)
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)((int) gsl_vector_get(v, i));
-	gsl_vector_set(vnew, i, val);
+        val = (*func)((int) gsl_vector_get(v, i));
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -710,10 +691,6 @@ VALUE rb_gsl_sf_eval1_uint(double (*func)(unsigned int), VALUE argv)
   VALUE ary;
   size_t i, k, n;
   double val;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   if (CLASS_OF(argv) == rb_cRange) argv = rb_gsl_range2ary(argv);
   switch (TYPE(argv)) {
   case T_FIXNUM:
@@ -733,6 +710,8 @@ VALUE rb_gsl_sf_eval1_uint(double (*func)(unsigned int), VALUE argv)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       argv = na_change_type(argv, NA_DFLOAT);
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
@@ -747,10 +726,10 @@ VALUE rb_gsl_sf_eval1_uint(double (*func)(unsigned int), VALUE argv)
       Data_Get_Struct(argv, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (k = 0; k < m->size2; k++) {
-	  val = (*func)((unsigned int) gsl_matrix_get(m, i, k));
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < m->size2; k++) {
+          val = (*func)((unsigned int) gsl_matrix_get(m, i, k));
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -759,8 +738,8 @@ VALUE rb_gsl_sf_eval1_uint(double (*func)(unsigned int), VALUE argv)
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)((unsigned int) gsl_vector_get(v, i));
-	gsl_vector_set(vnew, i, val);
+        val = (*func)((unsigned int) gsl_vector_get(v, i));
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -777,10 +756,6 @@ VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VA
   double val;
   /*gsl_mode_t mode;
   char c;*/
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   switch (TYPE(m)) {
   case T_STRING:
     /*c = tolower(NUM2CHR(m));
@@ -794,7 +769,7 @@ VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VA
     break;
   default:
     rb_raise(rb_eArgError, "wrong type argument %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(m)));
+             rb_class2name(CLASS_OF(m)));
   }
   if (CLASS_OF(argv) == rb_cRange) argv = rb_gsl_range2ary(argv);
   switch (TYPE(argv)) {
@@ -817,6 +792,8 @@ VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VA
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
       n = na->total;
@@ -830,10 +807,10 @@ VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VA
       Data_Get_Struct(argv, gsl_matrix, mm);
       mnew = gsl_matrix_alloc(mm->size1, mm->size2);
       for (i = 0; i < mm->size1; i++) {
-	for (k = 0; k < mm->size2; k++) {
-	  val = (*func)(gsl_matrix_get(mm, i, k), m);
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < mm->size2; k++) {
+          val = (*func)(gsl_matrix_get(mm, i, k), m);
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -842,8 +819,8 @@ VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VA
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(gsl_vector_get(v, i), m);
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(gsl_vector_get(v, i), m);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -851,8 +828,8 @@ VALUE rb_gsl_sf_eval_double_m(double (*func)(double, gsl_mode_t), VALUE argv, VA
   }
 }
 
-VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t), 
-			       VALUE argv, VALUE x2, VALUE m)
+VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t),
+                               VALUE argv, VALUE x2, VALUE m)
 {
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *mm = NULL, *mnew = NULL;
@@ -861,10 +838,6 @@ VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t),
   double val, xx2;
   /*gsl_mode_t mode;
   char c;*/
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   Need_Float(x2);
   xx2 = NUM2DBL(x2);
   /*c = tolower(NUM2CHR(m));
@@ -893,6 +866,8 @@ VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t),
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
       n = na->total;
@@ -906,10 +881,10 @@ VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t),
       Data_Get_Struct(argv, gsl_matrix, mm);
       mnew = gsl_matrix_alloc(mm->size1, mm->size2);
       for (i = 0; i < mm->size1; i++) {
-	for (k = 0; k < mm->size2; k++) {
-	  val = (*func)(gsl_matrix_get(mm, i, k), xx2, m);
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < mm->size2; k++) {
+          val = (*func)(gsl_matrix_get(mm, i, k), xx2, m);
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -918,8 +893,8 @@ VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t),
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(gsl_vector_get(v, i), xx2, m);
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(gsl_vector_get(v, i), xx2, m);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -927,8 +902,8 @@ VALUE rb_gsl_sf_eval_double2_m(double (*func)(double, double, gsl_mode_t),
   }
 }
 
-VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t), 
-			       VALUE argv, VALUE x2, VALUE x3, VALUE m)
+VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t),
+                               VALUE argv, VALUE x2, VALUE x3, VALUE m)
 {
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *mm = NULL, *mnew = NULL;
@@ -937,10 +912,6 @@ VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t
   double val, xx2, xx3;
   /*gsl_mode_t mode;
   char c;*/
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   Need_Float(x2); Need_Float(x3);
   xx2 = NUM2DBL(x2);
   xx3 = NUM2DBL(x3);
@@ -970,6 +941,8 @@ VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
       n = na->total;
@@ -983,10 +956,10 @@ VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t
       Data_Get_Struct(argv, gsl_matrix, mm);
       mnew = gsl_matrix_alloc(mm->size1, mm->size2);
       for (i = 0; i < mm->size1; i++) {
-	for (k = 0; k < mm->size2; k++) {
-	  val = (*func)(gsl_matrix_get(mm, i, k), xx2, xx3, m);
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < mm->size2; k++) {
+          val = (*func)(gsl_matrix_get(mm, i, k), xx2, xx3, m);
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -995,8 +968,8 @@ VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(gsl_vector_get(v, i), xx2, xx3, m);
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(gsl_vector_get(v, i), xx2, xx3, m);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -1005,8 +978,8 @@ VALUE rb_gsl_sf_eval_double3_m(double (*func)(double, double, double, gsl_mode_t
 }
 
 VALUE rb_gsl_sf_eval_double4_m(double (*func)(double, double, double, double,
-					      gsl_mode_t), 
-			       VALUE argv, VALUE x2, VALUE x3, VALUE x4, VALUE m)
+                                              gsl_mode_t),
+                               VALUE argv, VALUE x2, VALUE x3, VALUE x4, VALUE m)
 {
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *mm = NULL, *mnew = NULL;
@@ -1015,10 +988,6 @@ VALUE rb_gsl_sf_eval_double4_m(double (*func)(double, double, double, double,
   double val, xx2, xx3, xx4;
   /*gsl_mode_t mode;
   char c;*/
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   Need_Float(x2); Need_Float(x3); Need_Float(x4);
   xx2 = NUM2DBL(x2);  xx3 = NUM2DBL(x3); xx4 = NUM2DBL(x4);
   /*c = tolower(NUM2CHR(m));
@@ -1032,7 +1001,7 @@ VALUE rb_gsl_sf_eval_double4_m(double (*func)(double, double, double, double,
   case T_FIXNUM:
   case T_BIGNUM:
     return rb_float_new((*func)(NUM2DBL(argv), NUM2DBL(x2), NUM2DBL(x3),
-				NUM2DBL(x4), m));
+                                NUM2DBL(x4), m));
     break;
   case T_ARRAY:
     n = RARRAY_LEN(argv);
@@ -1048,6 +1017,8 @@ VALUE rb_gsl_sf_eval_double4_m(double (*func)(double, double, double, double,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
       n = na->total;
@@ -1061,10 +1032,10 @@ VALUE rb_gsl_sf_eval_double4_m(double (*func)(double, double, double, double,
       Data_Get_Struct(argv, gsl_matrix, mm);
       mnew = gsl_matrix_alloc(mm->size1, mm->size2);
       for (i = 0; i < mm->size1; i++) {
-	for (k = 0; k < mm->size2; k++) {
-	  val = (*func)(gsl_matrix_get(mm, i, k), xx2, xx3, xx4, m);
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < mm->size2; k++) {
+          val = (*func)(gsl_matrix_get(mm, i, k), xx2, xx3, xx4, m);
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -1073,8 +1044,8 @@ VALUE rb_gsl_sf_eval_double4_m(double (*func)(double, double, double, double,
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(gsl_vector_get(v, i),  xx2, xx3, xx4, m);
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(gsl_vector_get(v, i),  xx2, xx3, xx4, m);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -1111,8 +1082,8 @@ VALUE rb_gsl_sf_eval_e_uint(int (*func)(unsigned int, gsl_sf_result*), VALUE x)
   return v;
 }
 
-VALUE rb_gsl_sf_eval_e_int_uint(int (*func)(int, unsigned int, gsl_sf_result*), 
-				VALUE n, VALUE x)
+VALUE rb_gsl_sf_eval_e_int_uint(int (*func)(int, unsigned int, gsl_sf_result*),
+                                VALUE n, VALUE x)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -1122,8 +1093,8 @@ VALUE rb_gsl_sf_eval_e_int_uint(int (*func)(int, unsigned int, gsl_sf_result*),
   return v;
 }
 
-VALUE rb_gsl_sf_eval_e_double_uint(int (*func)(double, unsigned int, gsl_sf_result*), 
-				VALUE y, VALUE x)
+VALUE rb_gsl_sf_eval_e_double_uint(int (*func)(double, unsigned int, gsl_sf_result*),
+                                   VALUE y, VALUE x)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -1133,8 +1104,8 @@ VALUE rb_gsl_sf_eval_e_double_uint(int (*func)(double, unsigned int, gsl_sf_resu
   return v;
 }
 
-VALUE rb_gsl_sf_eval_e_int_double(int (*func)(int, double, gsl_sf_result*), 
-				  VALUE n, VALUE x)
+VALUE rb_gsl_sf_eval_e_int_double(int (*func)(int, double, gsl_sf_result*),
+                                  VALUE n, VALUE x)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -1145,8 +1116,8 @@ VALUE rb_gsl_sf_eval_e_int_double(int (*func)(int, double, gsl_sf_result*),
   return v;
 }
 
-VALUE rb_gsl_sf_eval_e_int_double2(int (*func)(int, double, double, gsl_sf_result*), 
-				  VALUE n, VALUE x1, VALUE x2)
+VALUE rb_gsl_sf_eval_e_int_double2(int (*func)(int, double, double, gsl_sf_result*),
+                                   VALUE n, VALUE x1, VALUE x2)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -1158,8 +1129,8 @@ VALUE rb_gsl_sf_eval_e_int_double2(int (*func)(int, double, double, gsl_sf_resul
 }
 
 
-VALUE rb_gsl_sf_eval_e_int_int_double(int (*func)(int, int, double, gsl_sf_result*), 
-				      VALUE n1, VALUE n2, VALUE x)
+VALUE rb_gsl_sf_eval_e_int_int_double(int (*func)(int, int, double, gsl_sf_result*),
+                                      VALUE n1, VALUE n2, VALUE x)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -1170,20 +1141,20 @@ VALUE rb_gsl_sf_eval_e_int_int_double(int (*func)(int, int, double, gsl_sf_resul
   return v;
 }
 
-VALUE rb_gsl_sf_eval_e_double2(int (*func)(double, double, gsl_sf_result*), 
-				  VALUE x1, VALUE x2)
+VALUE rb_gsl_sf_eval_e_double2(int (*func)(double, double, gsl_sf_result*),
+                               VALUE x1, VALUE x2)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
-  Need_Float(x1); Need_Float(x2); 
+  Need_Float(x1); Need_Float(x2);
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
   (*func)(NUM2DBL(x1), NUM2DBL(x2), rslt);
   return v;
 }
 
 
-VALUE rb_gsl_sf_eval_e_double3(int (*func)(double, double, double, gsl_sf_result*), 
-				  VALUE x1, VALUE x2, VALUE x3)
+VALUE rb_gsl_sf_eval_e_double3(int (*func)(double, double, double, gsl_sf_result*),
+                               VALUE x1, VALUE x2, VALUE x3)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -1193,8 +1164,8 @@ VALUE rb_gsl_sf_eval_e_double3(int (*func)(double, double, double, gsl_sf_result
   return v;
 }
 
-VALUE rb_gsl_sf_eval_e_m(int (*func)(double, gsl_mode_t, gsl_sf_result*), 
-			 VALUE x, VALUE m)
+VALUE rb_gsl_sf_eval_e_m(int (*func)(double, gsl_mode_t, gsl_sf_result*),
+                         VALUE x, VALUE m)
 {
   gsl_mode_t mode;
   char c;
@@ -1214,7 +1185,7 @@ VALUE rb_gsl_sf_eval_e_m(int (*func)(double, gsl_mode_t, gsl_sf_result*),
     break;
   default:
     rb_raise(rb_eArgError, "wrong type argument %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(m)));
+             rb_class2name(CLASS_OF(m)));
     break;
   }
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
@@ -1223,8 +1194,8 @@ VALUE rb_gsl_sf_eval_e_m(int (*func)(double, gsl_mode_t, gsl_sf_result*),
 }
 
 
-VALUE rb_gsl_sf_eval_e_double2_m(int (*func)(double, double, gsl_mode_t, gsl_sf_result*), 
-			 VALUE x1, VALUE x2, VALUE m)
+VALUE rb_gsl_sf_eval_e_double2_m(int (*func)(double, double, gsl_mode_t, gsl_sf_result*),
+                                 VALUE x1, VALUE x2, VALUE m)
 {
   gsl_mode_t mode;
   char c;
@@ -1244,7 +1215,7 @@ VALUE rb_gsl_sf_eval_e_double2_m(int (*func)(double, double, gsl_mode_t, gsl_sf_
     break;
   default:
     rb_raise(rb_eArgError, "wrong type argument %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(m)));
+             rb_class2name(CLASS_OF(m)));
     break;
   }
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
@@ -1252,8 +1223,8 @@ VALUE rb_gsl_sf_eval_e_double2_m(int (*func)(double, double, gsl_mode_t, gsl_sf_
   return v;
 }
 
-VALUE rb_gsl_sf_eval_e_double3_m(int (*func)(double, double, double, gsl_mode_t, gsl_sf_result*), 
-			 VALUE x1, VALUE x2, VALUE x3, VALUE m)
+VALUE rb_gsl_sf_eval_e_double3_m(int (*func)(double, double, double, gsl_mode_t, gsl_sf_result*),
+                                 VALUE x1, VALUE x2, VALUE x3, VALUE m)
 {
   gsl_mode_t mode;
   char c;
@@ -1273,7 +1244,7 @@ VALUE rb_gsl_sf_eval_e_double3_m(int (*func)(double, double, double, gsl_mode_t,
     break;
   default:
     rb_raise(rb_eArgError, "wrong type argument %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(m)));
+             rb_class2name(CLASS_OF(m)));
     break;
   }
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
@@ -1282,8 +1253,8 @@ VALUE rb_gsl_sf_eval_e_double3_m(int (*func)(double, double, double, gsl_mode_t,
 }
 
 
-VALUE rb_gsl_sf_eval_e_double4_m(int (*func)(double, double, double, double, gsl_mode_t, gsl_sf_result*), 
-			 VALUE x1, VALUE x2, VALUE x3, VALUE x4, VALUE m)
+VALUE rb_gsl_sf_eval_e_double4_m(int (*func)(double, double, double, double, gsl_mode_t, gsl_sf_result*),
+                                 VALUE x1, VALUE x2, VALUE x3, VALUE x4, VALUE m)
 {
   gsl_mode_t mode;
   char c;
@@ -1303,9 +1274,9 @@ VALUE rb_gsl_sf_eval_e_double4_m(int (*func)(double, double, double, double, gsl
     break;
   default:
     rb_raise(rb_eArgError, "wrong type argument %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(m)));
+             rb_class2name(CLASS_OF(m)));
     break;
-  }    
+  }
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
   (*func)(NUM2DBL(x1), NUM2DBL(x2),NUM2DBL(x3), NUM2DBL(x4), mode, rslt);
   return v;
@@ -1319,10 +1290,6 @@ VALUE eval_sf(double (*func)(double, gsl_mode_t), VALUE argv)
   double val;
   gsl_vector *v = NULL, *vnew = NULL;
   gsl_matrix *mm = NULL, *mnew = NULL;
-#ifdef HAVE_NARRAY_H
-  double *ptr1, *ptr2;
-  struct NARRAY *na;
-#endif
   switch (TYPE(argv)) {
   case T_FLOAT:
   case T_FIXNUM:
@@ -1343,6 +1310,8 @@ VALUE eval_sf(double (*func)(double, gsl_mode_t), VALUE argv)
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv)) {
+      double *ptr1, *ptr2;
+      struct NARRAY *na;
       ptr1 = NA_PTR_TYPE(argv, double*);
       GetNArray(argv, na);
       n = na->total;
@@ -1356,10 +1325,10 @@ VALUE eval_sf(double (*func)(double, gsl_mode_t), VALUE argv)
       Data_Get_Struct(argv, gsl_matrix, mm);
       mnew = gsl_matrix_alloc(mm->size1, mm->size2);
       for (i = 0; i < mm->size1; i++) {
-	for (k = 0; k < mm->size2; k++) {
-	  val = (*func)(gsl_matrix_get(mm, i, k), GSL_PREC_DOUBLE);
-	  gsl_matrix_set(mnew, i, k, val);
-	}
+        for (k = 0; k < mm->size2; k++) {
+          val = (*func)(gsl_matrix_get(mm, i, k), GSL_PREC_DOUBLE);
+          gsl_matrix_set(mnew, i, k, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -1368,8 +1337,8 @@ VALUE eval_sf(double (*func)(double, gsl_mode_t), VALUE argv)
       n = v->size;
       vnew = gsl_vector_alloc(n);
       for (i = 0; i < n; i++) {
-	val = (*func)(gsl_vector_get(v, i), GSL_PREC_DOUBLE);
-	gsl_vector_set(vnew, i, val);
+        val = (*func)(gsl_vector_get(v, i), GSL_PREC_DOUBLE);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     }
@@ -1404,18 +1373,18 @@ VALUE rb_gsl_sf_eval_complex(double (*f)(double), VALUE obj)
     mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
     for (i = 0; i < m->size1; i++) {
       for (j = 0; j < m->size2; j++) {
-	c = gsl_matrix_complex_get(m, i, j);
-	GSL_SET_REAL(&c, (*f)(GSL_REAL(c)));
-	GSL_SET_IMAG(&c, (*f)(GSL_IMAG(c)));
-	gsl_matrix_complex_set(mnew, i, j, c);
+        c = gsl_matrix_complex_get(m, i, j);
+        GSL_SET_REAL(&c, (*f)(GSL_REAL(c)));
+        GSL_SET_IMAG(&c, (*f)(GSL_IMAG(c)));
+        gsl_matrix_complex_set(mnew, i, j, c);
       }
     }
     return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew);
   } else {
-    rb_raise(rb_eTypeError, 
-	     "wrong argument type %s "
-	     " (GSL::Complex or GSL::Vector::Complex expected)", 
-	     rb_class2name(CLASS_OF(obj)));
+    rb_raise(rb_eTypeError,
+             "wrong argument type %s "
+             " (GSL::Complex or GSL::Vector::Complex expected)",
+             rb_class2name(CLASS_OF(obj)));
   }
 }
 
@@ -1424,10 +1393,10 @@ void Init_gsl_sf(VALUE module)
   VALUE mgsl_sf;
   mgsl_sf = rb_define_module_under(module, "Sf");
 
-  cgsl_sf_result = rb_define_class_under(mgsl_sf, "Result", 
-					 cGSL_Object);
+  cgsl_sf_result = rb_define_class_under(mgsl_sf, "Result",
+                                         cGSL_Object);
   rb_define_singleton_method(cgsl_sf_result, "new", rb_gsl_sf_result_new,
-			     0);
+                             0);
   rb_define_method(cgsl_sf_result, "print", rb_gsl_sf_result_print, 0);
   rb_define_method(cgsl_sf_result, "inspect", rb_gsl_sf_result_inspect, 0);
   rb_define_method(cgsl_sf_result, "val", rb_gsl_sf_result_val, 0);
@@ -1435,10 +1404,10 @@ void Init_gsl_sf(VALUE module)
   rb_define_method(cgsl_sf_result, "to_a", rb_gsl_sf_result_to_a, 0);
   rb_define_method(cgsl_sf_result, "to_s", rb_gsl_sf_result_to_s, 0);
 
-  cgsl_sf_result_e10 = rb_define_class_under(mgsl_sf, "Result_e10", 
-					     cGSL_Object);
-  rb_define_singleton_method(cgsl_sf_result_e10, "new", 
-			     rb_gsl_sf_result_e10_new, 0);
+  cgsl_sf_result_e10 = rb_define_class_under(mgsl_sf, "Result_e10",
+                                             cGSL_Object);
+  rb_define_singleton_method(cgsl_sf_result_e10, "new",
+                             rb_gsl_sf_result_e10_new, 0);
   rb_define_method(cgsl_sf_result_e10, "val", rb_gsl_sf_result_e10_val, 0);
   rb_define_method(cgsl_sf_result_e10, "err", rb_gsl_sf_result_e10_err, 0);
   rb_define_method(cgsl_sf_result_e10, "e10", rb_gsl_sf_result_e10_e10, 0);
@@ -1473,8 +1442,5 @@ void Init_gsl_sf(VALUE module)
   Init_gsl_sf_transport(mgsl_sf);
   Init_gsl_sf_trigonometric(mgsl_sf);
   Init_gsl_sf_zeta(mgsl_sf);
-  
-#ifdef GSL_1_9_LATER  
-	Init_sf_mathieu(mgsl_sf);
-#endif
+  Init_sf_mathieu(mgsl_sf);
 }
diff --git a/ext/gsl/sf_airy.c b/ext/gsl_native/sf_airy.c
similarity index 100%
rename from ext/gsl/sf_airy.c
rename to ext/gsl_native/sf_airy.c
diff --git a/ext/gsl/sf_bessel.c b/ext/gsl_native/sf_bessel.c
similarity index 98%
rename from ext/gsl/sf_bessel.c
rename to ext/gsl_native/sf_bessel.c
index 3b66422..65d5038 100644
--- a/ext/gsl/sf_bessel.c
+++ b/ext/gsl_native/sf_bessel.c
@@ -45,7 +45,7 @@ static VALUE rb_gsl_sf_bessel_Jn_e(VALUE obj, VALUE n, VALUE x)
 }
 
 static VALUE rb_gsl_sf_bessel_Xn_array(VALUE obj, VALUE n0, VALUE n1, VALUE x,
-				       int (*f)(int, int, double, double[]))
+                                       int (*f)(int, int, double, double[]))
 {
   int nmin, nmax, n;
   gsl_vector *v = NULL;
@@ -167,7 +167,7 @@ static VALUE rb_gsl_sf_bessel_In_scaled_e(VALUE obj, VALUE n, VALUE x)
 }
 
 static VALUE rb_gsl_sf_bessel_In_scaled_array(VALUE obj, VALUE n0, VALUE n1,
-					      VALUE x)
+                                              VALUE x)
 {
   return rb_gsl_sf_bessel_Xn_array(obj, n0, n1, x, gsl_sf_bessel_In_scaled_array);
 }
@@ -239,7 +239,7 @@ static VALUE rb_gsl_sf_bessel_Kn_scaled_e(VALUE obj, VALUE n, VALUE x)
 }
 
 static VALUE rb_gsl_sf_bessel_Kn_scaled_array(VALUE obj, VALUE n0, VALUE n1,
-					      VALUE x)
+                                              VALUE x)
 {
   return rb_gsl_sf_bessel_Xn_array(obj, n0, n1, x, gsl_sf_bessel_Kn_scaled_array);
 }
@@ -286,7 +286,7 @@ static VALUE rb_gsl_sf_bessel_jl_e(VALUE obj, VALUE n, VALUE x)
 }
 
 static VALUE rb_gsl_sf_bessel_xl_array(VALUE obj, VALUE n1, VALUE x,
-				       int (*f)(int, double, double[]))
+                                       int (*f)(int, double, double[]))
 {
   int nmax, n;
   // local variable "status" declared and set, but never used
@@ -446,7 +446,7 @@ static VALUE rb_gsl_sf_bessel_kl_scaled_e(VALUE obj, VALUE n, VALUE x)
 }
 
 static VALUE rb_gsl_sf_bessel_kl_scaled_array(VALUE obj, VALUE n1,
-					      VALUE x)
+                                              VALUE x)
 {
   return rb_gsl_sf_bessel_xl_array(obj, n1, x, gsl_sf_bessel_kl_scaled_array);
 }
@@ -497,7 +497,7 @@ static VALUE rb_gsl_sf_bessel_sequence_Jnu_e(int argc, VALUE *argv, VALUE obj)
       break;
     default:
       rb_raise(rb_eTypeError, "wrong argument type %s (String or Fixnum expected)",
-	       rb_class2name(CLASS_OF(m)));
+               rb_class2name(CLASS_OF(m)));
       break;
     }
   default:
diff --git a/ext/gsl/sf_clausen.c b/ext/gsl_native/sf_clausen.c
similarity index 100%
rename from ext/gsl/sf_clausen.c
rename to ext/gsl_native/sf_clausen.c
diff --git a/ext/gsl/sf_coulomb.c b/ext/gsl_native/sf_coulomb.c
similarity index 77%
rename from ext/gsl/sf_coulomb.c
rename to ext/gsl_native/sf_coulomb.c
index f354893..c314642 100644
--- a/ext/gsl/sf_coulomb.c
+++ b/ext/gsl_native/sf_coulomb.c
@@ -23,15 +23,15 @@ static VALUE rb_gsl_sf_hydrogenicR_1_e(VALUE obj,  VALUE Z, VALUE r)
   return rb_gsl_sf_eval_e_double2(gsl_sf_hydrogenicR_1_e, Z, r);
 }
 
-static VALUE rb_gsl_sf_hydrogenicR(VALUE obj, VALUE n, VALUE l, 
-				   VALUE Z, VALUE r)
+static VALUE rb_gsl_sf_hydrogenicR(VALUE obj, VALUE n, VALUE l,
+                                   VALUE Z, VALUE r)
 {
   return rb_float_new(gsl_sf_hydrogenicR(FIX2INT(n), FIX2INT(l),
-					   NUM2DBL(Z), NUM2DBL(r)));
+                                         NUM2DBL(Z), NUM2DBL(r)));
 }
 
-static VALUE rb_gsl_sf_hydrogenicR_e(VALUE obj, VALUE n, VALUE l, 
-				     VALUE Z, VALUE r)
+static VALUE rb_gsl_sf_hydrogenicR_e(VALUE obj, VALUE n, VALUE l,
+                                     VALUE Z, VALUE r)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -41,12 +41,12 @@ static VALUE rb_gsl_sf_hydrogenicR_e(VALUE obj, VALUE n, VALUE l,
   Need_Float(Z); Need_Float(r);
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
   /*status =*/ gsl_sf_hydrogenicR_e(FIX2INT(n), FIX2INT(l),
-			    NUM2DBL(Z), NUM2DBL(r), rslt);
+                                    NUM2DBL(Z), NUM2DBL(r), rslt);
   return v;
 }
 
 static VALUE rb_gsl_sf_coulomb_wave_FG_e(VALUE obj, VALUE eta, VALUE x,
-					 VALUE L_F, VALUE k)
+                                         VALUE L_F, VALUE k)
 
 {
   gsl_sf_result *F, *Fp, *G, *Gp;
@@ -60,13 +60,13 @@ static VALUE rb_gsl_sf_coulomb_wave_FG_e(VALUE obj, VALUE eta, VALUE x,
   vG = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, G);
   vGp = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, Gp);
   status = gsl_sf_coulomb_wave_FG_e(NUM2DBL(eta), NUM2DBL(x), NUM2DBL(L_F),
-				    FIX2INT(k), F, Fp, G, Gp, &exp_F, &exp_G);
+                                    FIX2INT(k), F, Fp, G, Gp, &exp_F, &exp_G);
   return rb_ary_new3(7, vF, vFp, vG, vGp,
-		     rb_float_new(exp_F), rb_float_new(exp_G), INT2FIX(status));
+                     rb_float_new(exp_F), rb_float_new(exp_G), INT2FIX(status));
 }
 
 static VALUE rb_gsl_sf_coulomb_wave_F_array(VALUE obj, VALUE Lmin, VALUE kmax,
-					 VALUE eta, VALUE x)
+                                            VALUE eta, VALUE x)
 {
   double F_exponent;
   int status;
@@ -76,15 +76,15 @@ static VALUE rb_gsl_sf_coulomb_wave_F_array(VALUE obj, VALUE Lmin, VALUE kmax,
   Need_Float(Lmin); Need_Float(eta); Need_Float(x);
   size = FIX2INT(kmax);
   v = gsl_vector_alloc(size);
-  status = gsl_sf_coulomb_wave_F_array(NUM2DBL(Lmin), size, NUM2DBL(eta), 
-				   NUM2DBL(x), v->data, &F_exponent);
-  
-  return rb_ary_new3(3, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v), 
-		     rb_float_new(F_exponent), INT2FIX(status));
+  status = gsl_sf_coulomb_wave_F_array(NUM2DBL(Lmin), size, NUM2DBL(eta),
+                                       NUM2DBL(x), v->data, &F_exponent);
+
+  return rb_ary_new3(3, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v),
+                     rb_float_new(F_exponent), INT2FIX(status));
 }
 
 static VALUE rb_gsl_sf_coulomb_wave_FG_array(VALUE obj, VALUE Lmin, VALUE kmax,
-					 VALUE eta, VALUE x)
+                                             VALUE eta, VALUE x)
 {
   double F_exponent, G_exponent;
   int status;
@@ -97,18 +97,18 @@ static VALUE rb_gsl_sf_coulomb_wave_FG_array(VALUE obj, VALUE Lmin, VALUE kmax,
   vf = gsl_vector_alloc(size);
   vg = gsl_vector_alloc(size);
 
-  status = gsl_sf_coulomb_wave_FG_array(NUM2DBL(Lmin), size, NUM2DBL(eta), 
-				   NUM2DBL(x), vf->data, vg->data,
-				    &F_exponent, &G_exponent);
+  status = gsl_sf_coulomb_wave_FG_array(NUM2DBL(Lmin), size, NUM2DBL(eta),
+                                        NUM2DBL(x), vf->data, vg->data,
+                                        &F_exponent, &G_exponent);
   fary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vf);
   gary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vf);
   return rb_ary_new3(5, fary, gary,
-		     rb_float_new(F_exponent), rb_float_new(G_exponent),
-		     INT2FIX(status));
+                     rb_float_new(F_exponent), rb_float_new(G_exponent),
+                     INT2FIX(status));
 }
 
 static VALUE rb_gsl_sf_coulomb_wave_FGp_array(VALUE obj, VALUE Lmin, VALUE kmax,
-					 VALUE eta, VALUE x)
+                                              VALUE eta, VALUE x)
 {
   double F_exponent, G_exponent;
   int status;
@@ -123,21 +123,21 @@ static VALUE rb_gsl_sf_coulomb_wave_FGp_array(VALUE obj, VALUE Lmin, VALUE kmax,
   vg = gsl_vector_alloc(size);
   vgp = gsl_vector_alloc(size);
 
-  status = gsl_sf_coulomb_wave_FGp_array(NUM2DBL(Lmin), size, NUM2DBL(eta), 
-				     NUM2DBL(x), vf->data, vfp->data, 
-				     vg->data, vgp->data,
-				     &F_exponent, &G_exponent);
+  status = gsl_sf_coulomb_wave_FGp_array(NUM2DBL(Lmin), size, NUM2DBL(eta),
+                                         NUM2DBL(x), vf->data, vfp->data,
+                                         vg->data, vgp->data,
+                                         &F_exponent, &G_exponent);
   fary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vf);
-  fpary =Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vfp);
+  fpary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vfp);
   gary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vg);
-  gpary =Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vgp);
+  gpary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vgp);
   return rb_ary_new3(7, fary, fpary, gary, gpary,
-		     rb_float_new(F_exponent), rb_float_new(G_exponent),
-		     INT2FIX(status));
+                     rb_float_new(F_exponent), rb_float_new(G_exponent),
+                     INT2FIX(status));
 }
 
 static VALUE rb_gsl_sf_coulomb_wave_sphF_array(VALUE obj, VALUE Lmin, VALUE kmax,
-					 VALUE eta, VALUE x)
+                                               VALUE eta, VALUE x)
 {
   int status;
   size_t size;
@@ -147,11 +147,11 @@ static VALUE rb_gsl_sf_coulomb_wave_sphF_array(VALUE obj, VALUE Lmin, VALUE kmax
   size = FIX2INT(kmax);
   v = gsl_vector_alloc(size);
   v2 = gsl_vector_alloc(size);
-  status =  gsl_sf_coulomb_wave_sphF_array(NUM2DBL(Lmin), size, NUM2DBL(eta), 
-				       NUM2DBL(x), v->data, v2->data);
-  return rb_ary_new3(3, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v), 
-		     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2), 
-		     INT2FIX(status));
+  status =  gsl_sf_coulomb_wave_sphF_array(NUM2DBL(Lmin), size, NUM2DBL(eta),
+                                           NUM2DBL(x), v->data, v2->data);
+  return rb_ary_new3(3, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v),
+                     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2),
+                     INT2FIX(status));
 }
 
 static VALUE rb_gsl_sf_coulomb_CL_e(VALUE obj, VALUE L, VALUE eta)
@@ -160,14 +160,14 @@ static VALUE rb_gsl_sf_coulomb_CL_e(VALUE obj, VALUE L, VALUE eta)
 }
 
 static VALUE rb_gsl_sf_coulomb_CL_array(VALUE obj, VALUE Lmin, VALUE kmax,
-					VALUE eta)
+                                        VALUE eta)
 {
   gsl_vector *v = NULL;
   size_t size;
   // local variable "status" declared and set, but never used
   //int status;
   CHECK_FIXNUM(kmax);
-  Need_Float(Lmin); Need_Float(eta); 
+  Need_Float(Lmin); Need_Float(eta);
   size = FIX2INT(kmax);
   v = gsl_vector_alloc(size);
   /*status =*/ gsl_sf_coulomb_CL_array(NUM2DBL(Lmin), size, NUM2DBL(eta), v->data);
@@ -191,7 +191,7 @@ void Init_gsl_sf_coulomb(VALUE module)
   rb_define_module_function(module, "coulomb_CL_array",  rb_gsl_sf_coulomb_CL_array, 3);
 
   mgsl_sf_coulomb = rb_define_module_under(module, "Coulomb");
-  
+
   rb_define_module_function(mgsl_sf_coulomb, "hydrogenicR_1",  rb_gsl_sf_hydrogenicR_1, 2);
   rb_define_module_function(mgsl_sf_coulomb, "hydrogenicR_1_e",  rb_gsl_sf_hydrogenicR_1_e, 2);
   rb_define_module_function(mgsl_sf_coulomb, "hydrogenicR",  rb_gsl_sf_hydrogenicR, 4);
diff --git a/ext/gsl/sf_coupling.c b/ext/gsl_native/sf_coupling.c
similarity index 72%
rename from ext/gsl/sf_coupling.c
rename to ext/gsl_native/sf_coupling.c
index cc32f3e..504f06a 100644
--- a/ext/gsl/sf_coupling.c
+++ b/ext/gsl_native/sf_coupling.c
@@ -12,16 +12,16 @@
 
 #include "include/rb_gsl_sf.h"
 
-static VALUE rb_gsl_sf_coupling_3j(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_ma, VALUE two_mb, VALUE two_mc) 
+static VALUE rb_gsl_sf_coupling_3j(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_ma, VALUE two_mb, VALUE two_mc)
 {
   CHECK_FIXNUM(two_ja); CHECK_FIXNUM(two_jb); CHECK_FIXNUM(two_jc);
   CHECK_FIXNUM(two_ma); CHECK_FIXNUM(two_mb); CHECK_FIXNUM(two_mc);
   return rb_float_new(gsl_sf_coupling_3j(FIX2INT(two_ja), FIX2INT(two_jb),
-					 FIX2INT(two_jc), FIX2INT(two_ma),
-					 FIX2INT(two_mb), FIX2INT(two_mc)));
+                                         FIX2INT(two_jc), FIX2INT(two_ma),
+                                         FIX2INT(two_mb), FIX2INT(two_mc)));
 }
 
-static VALUE rb_gsl_sf_coupling_3j_e(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_ma, VALUE two_mb, VALUE two_mc) 
+static VALUE rb_gsl_sf_coupling_3j_e(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_ma, VALUE two_mb, VALUE two_mc)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -31,23 +31,23 @@ static VALUE rb_gsl_sf_coupling_3j_e(VALUE obj, VALUE two_ja, VALUE two_jb, VALU
   CHECK_FIXNUM(two_ma); CHECK_FIXNUM(two_mb); CHECK_FIXNUM(two_mc);
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
   /*status =*/ gsl_sf_coupling_3j_e(FIX2INT(two_ja), FIX2INT(two_jb),
-			  FIX2INT(two_jc), FIX2INT(two_ma),
-			  FIX2INT(two_mb), FIX2INT(two_mc),
-			  rslt);
+                                    FIX2INT(two_jc), FIX2INT(two_ma),
+                                    FIX2INT(two_mb), FIX2INT(two_mc),
+                                    rslt);
 
   return v;
 }
 
-static VALUE rb_gsl_sf_coupling_6j(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_jd, VALUE two_je, VALUE two_jf) 
+static VALUE rb_gsl_sf_coupling_6j(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_jd, VALUE two_je, VALUE two_jf)
 {
   CHECK_FIXNUM(two_ja); CHECK_FIXNUM(two_jb); CHECK_FIXNUM(two_jc);
   CHECK_FIXNUM(two_jd); CHECK_FIXNUM(two_je); CHECK_FIXNUM(two_jf);
   return rb_float_new(gsl_sf_coupling_6j(FIX2INT(two_ja), FIX2INT(two_jb),
-					 FIX2INT(two_jc), FIX2INT(two_jd),
-					 FIX2INT(two_je), FIX2INT(two_jf)));
+                                         FIX2INT(two_jc), FIX2INT(two_jd),
+                                         FIX2INT(two_je), FIX2INT(two_jf)));
 }
 
-static VALUE rb_gsl_sf_coupling_6j_e(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_jd, VALUE two_je, VALUE two_jf) 
+static VALUE rb_gsl_sf_coupling_6j_e(VALUE obj, VALUE two_ja, VALUE two_jb, VALUE two_jc, VALUE two_jd, VALUE two_je, VALUE two_jf)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -57,31 +57,31 @@ static VALUE rb_gsl_sf_coupling_6j_e(VALUE obj, VALUE two_ja, VALUE two_jb, VALU
   CHECK_FIXNUM(two_jd); CHECK_FIXNUM(two_je); CHECK_FIXNUM(two_jf);
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
   /*status =*/ gsl_sf_coupling_6j_e(FIX2INT(two_ja), FIX2INT(two_jb),
-			  FIX2INT(two_jc), FIX2INT(two_jd),
-			  FIX2INT(two_je), FIX2INT(two_jf),
-			  rslt);
+                                    FIX2INT(two_jc), FIX2INT(two_jd),
+                                    FIX2INT(two_je), FIX2INT(two_jf),
+                                    rslt);
   return v;
 }
 
 static VALUE rb_gsl_sf_coupling_9j(VALUE obj, VALUE two_ja, VALUE two_jb,
-				   VALUE two_jc, VALUE two_jd, VALUE two_je,
-				   VALUE two_jf, VALUE two_jg, VALUE two_jh,
-				   VALUE two_ji) 
+                                   VALUE two_jc, VALUE two_jd, VALUE two_je,
+                                   VALUE two_jf, VALUE two_jg, VALUE two_jh,
+                                   VALUE two_ji)
 {
   CHECK_FIXNUM(two_ja); CHECK_FIXNUM(two_jb); CHECK_FIXNUM(two_jc);
   CHECK_FIXNUM(two_jd); CHECK_FIXNUM(two_je); CHECK_FIXNUM(two_jf);
   CHECK_FIXNUM(two_jg); CHECK_FIXNUM(two_jh); CHECK_FIXNUM(two_ji);
   return rb_float_new(gsl_sf_coupling_9j(FIX2INT(two_ja), FIX2INT(two_jb),
-					FIX2INT(two_jc), FIX2INT(two_jd),
-					FIX2INT(two_je), FIX2INT(two_jf),
-					FIX2INT(two_jg), FIX2INT(two_jh),
-					FIX2INT(two_ji)));
+                                         FIX2INT(two_jc), FIX2INT(two_jd),
+                                         FIX2INT(two_je), FIX2INT(two_jf),
+                                         FIX2INT(two_jg), FIX2INT(two_jh),
+                                         FIX2INT(two_ji)));
 }
 
 static VALUE rb_gsl_sf_coupling_9j_e(VALUE obj, VALUE two_ja, VALUE two_jb,
-				   VALUE two_jc, VALUE two_jd, VALUE two_je,
-				   VALUE two_jf, VALUE two_jg, VALUE two_jh,
-				   VALUE two_ji) 
+                                     VALUE two_jc, VALUE two_jd, VALUE two_je,
+                                     VALUE two_jf, VALUE two_jg, VALUE two_jh,
+                                     VALUE two_ji)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -92,10 +92,10 @@ static VALUE rb_gsl_sf_coupling_9j_e(VALUE obj, VALUE two_ja, VALUE two_jb,
   CHECK_FIXNUM(two_jg); CHECK_FIXNUM(two_jh); CHECK_FIXNUM(two_ji);
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, rslt);
   /*status =*/ gsl_sf_coupling_9j_e(FIX2INT(two_ja), FIX2INT(two_jb),
-			   FIX2INT(two_jc), FIX2INT(two_jd),
-			   FIX2INT(two_je), FIX2INT(two_jf),
-			   FIX2INT(two_jg), FIX2INT(two_jh),
-			   FIX2INT(two_ji), rslt);
+                                    FIX2INT(two_jc), FIX2INT(two_jd),
+                                    FIX2INT(two_je), FIX2INT(two_jf),
+                                    FIX2INT(two_jg), FIX2INT(two_jh),
+                                    FIX2INT(two_ji), rslt);
   return v;
 }
 
@@ -111,7 +111,7 @@ void Init_gsl_sf_coupling(VALUE module)
   rb_define_module_function(module, "coupling_9j_e",  rb_gsl_sf_coupling_9j_e, 9);
 
   mgsl_sf_coupling = rb_define_module_under(module, "Coupling");
-  
+
   rb_define_module_function(mgsl_sf_coupling, "3j",  rb_gsl_sf_coupling_3j, 6);
   rb_define_module_function(mgsl_sf_coupling, "3j_e",  rb_gsl_sf_coupling_3j_e, 6);
   rb_define_module_function(mgsl_sf_coupling, "6j",  rb_gsl_sf_coupling_6j, 6);
diff --git a/ext/gsl/sf_dawson.c b/ext/gsl_native/sf_dawson.c
similarity index 100%
rename from ext/gsl/sf_dawson.c
rename to ext/gsl_native/sf_dawson.c
diff --git a/ext/gsl/sf_debye.c b/ext/gsl_native/sf_debye.c
similarity index 97%
rename from ext/gsl/sf_debye.c
rename to ext/gsl_native/sf_debye.c
index dd5c843..c059c40 100644
--- a/ext/gsl/sf_debye.c
+++ b/ext/gsl_native/sf_debye.c
@@ -83,21 +83,18 @@ static VALUE rb_gsl_sf_debye_n(int argc, VALUE *argv, VALUE obj)
   case 4:
     return rb_gsl_sf_eval1(gsl_sf_debye_4, x);
     break;
-#ifdef GSL_1_8_LATER
   case 5:
     return rb_gsl_sf_eval1(gsl_sf_debye_5, x);
     break;
   case 6:
     return rb_gsl_sf_eval1(gsl_sf_debye_6, x);
     break;
-#endif
   default:
     rb_raise(rb_eRuntimeError, "n must be 1, 2, 3, or 4");
     break;
   }
 }
 
-#ifdef GSL_1_8_LATER
 static VALUE rb_gsl_sf_debye_5(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval1(gsl_sf_debye_5, x);
@@ -117,8 +114,6 @@ static VALUE rb_gsl_sf_debye_6_e(VALUE obj, VALUE x)
   return rb_gsl_sf_eval_e(gsl_sf_debye_6_e, x);
 }
 
-#endif
-
 void Init_gsl_sf_debye(VALUE module)
 {
   VALUE mgsl_sf_debye;
@@ -130,12 +125,10 @@ void Init_gsl_sf_debye(VALUE module)
   rb_define_module_function(module, "debye_3_e",  rb_gsl_sf_debye_3_e, 1);
   rb_define_module_function(module, "debye_4",  rb_gsl_sf_debye_4, 1);
   rb_define_module_function(module, "debye_4_e",  rb_gsl_sf_debye_4_e, 1);
-#ifdef GSL_1_8_LATER
   rb_define_module_function(module, "debye_5",  rb_gsl_sf_debye_5, 1);
   rb_define_module_function(module, "debye_5_e",  rb_gsl_sf_debye_5_e, 1);
   rb_define_module_function(module, "debye_6",  rb_gsl_sf_debye_6, 1);
   rb_define_module_function(module, "debye_6_e",  rb_gsl_sf_debye_6_e, 1);
-#endif
   rb_define_module_function(module, "debye_n",  rb_gsl_sf_debye_n, -1);
 
   mgsl_sf_debye = rb_define_module_under(module, "Debye");
@@ -147,11 +140,9 @@ void Init_gsl_sf_debye(VALUE module)
   rb_define_module_function(mgsl_sf_debye, "three_e",  rb_gsl_sf_debye_3_e, 1);
   rb_define_module_function(mgsl_sf_debye, "four",  rb_gsl_sf_debye_4, 1);
   rb_define_module_function(mgsl_sf_debye, "four_e",  rb_gsl_sf_debye_4_e, 1);
-#ifdef GSL_1_8_LATER
   rb_define_module_function(mgsl_sf_debye, "five",  rb_gsl_sf_debye_5, 1);
   rb_define_module_function(mgsl_sf_debye, "five_e",  rb_gsl_sf_debye_5_e, 1);
   rb_define_module_function(mgsl_sf_debye, "six",  rb_gsl_sf_debye_6, 1);
   rb_define_module_function(mgsl_sf_debye, "six_e",  rb_gsl_sf_debye_6_e, 1);
-#endif
   rb_define_module_function(mgsl_sf_debye, "n",  rb_gsl_sf_debye_n, -1);
 }
diff --git a/ext/gsl/sf_dilog.c b/ext/gsl_native/sf_dilog.c
similarity index 100%
rename from ext/gsl/sf_dilog.c
rename to ext/gsl_native/sf_dilog.c
diff --git a/ext/gsl/sf_elementary.c b/ext/gsl_native/sf_elementary.c
similarity index 92%
rename from ext/gsl/sf_elementary.c
rename to ext/gsl_native/sf_elementary.c
index 5a6e78c..9670af0 100644
--- a/ext/gsl/sf_elementary.c
+++ b/ext/gsl_native/sf_elementary.c
@@ -25,7 +25,7 @@ static VALUE rb_gsl_sf_multiply_e(VALUE obj, VALUE x, VALUE y)
 }
 
 static VALUE rb_gsl_sf_multiply_err_e(VALUE obj, VALUE x, VALUE dx,
-				      VALUE y, VALUE dy)
+                                      VALUE y, VALUE dy)
 {
   gsl_sf_result *r;
   VALUE v;
@@ -35,7 +35,7 @@ static VALUE rb_gsl_sf_multiply_err_e(VALUE obj, VALUE x, VALUE dx,
   Need_Float(dx); Need_Float(dy);
   v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r);
   /*status =*/ gsl_sf_multiply_err_e(NUM2DBL(x), NUM2DBL(dx),
-				 NUM2DBL(y), NUM2DBL(dy), r);
+                                     NUM2DBL(y), NUM2DBL(dy), r);
   return v;
 }
 
diff --git a/ext/gsl/sf_ellint.c b/ext/gsl_native/sf_ellint.c
similarity index 83%
rename from ext/gsl/sf_ellint.c
rename to ext/gsl_native/sf_ellint.c
index d79d731..fd2e8ba 100644
--- a/ext/gsl/sf_ellint.c
+++ b/ext/gsl_native/sf_ellint.c
@@ -36,10 +36,10 @@ static VALUE rb_gsl_sf_ellint_Ecomp_e(VALUE obj, VALUE k, VALUE m)
 
 static VALUE rb_gsl_sf_ellint_F(int argc, VALUE *argv, VALUE obj)
 {
-  if (argc == 2) 
-    return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_F, argv[0], argv[1], 
-				    INT2FIX(GSL_PREC_DOUBLE));
-  else 
+  if (argc == 2)
+    return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_F, argv[0], argv[1],
+                                    INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_F, argv[0], argv[1], argv[2]);
 }
 
@@ -50,10 +50,10 @@ static VALUE rb_gsl_sf_ellint_F_e(VALUE obj, VALUE phi, VALUE k, VALUE m)
 
 static VALUE rb_gsl_sf_ellint_E(int argc, VALUE *argv, VALUE obj)
 {
-  if (argc == 2) 
-    return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_E, argv[0], argv[1], 
-				    INT2FIX(GSL_PREC_DOUBLE));
-  else 
+  if (argc == 2)
+    return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_E, argv[0], argv[1],
+                                    INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_E, argv[0], argv[1], argv[2]);
 }
 
@@ -65,42 +65,42 @@ static VALUE rb_gsl_sf_ellint_E_e(VALUE obj, VALUE phi, VALUE k, VALUE m)
 static VALUE rb_gsl_sf_ellint_P(int argc, VALUE *argv, VALUE obj)
 
 {
-  if (argc == 3) 
+  if (argc == 3)
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_P, argv[0], argv[1], argv[2],
-				    INT2FIX(GSL_PREC_DOUBLE));
-  else 
+                                    INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_P, argv[0], argv[1], argv[2],
-				    argv[3]);
+                                    argv[3]);
 }
 
-static VALUE rb_gsl_sf_ellint_P_e(VALUE obj, VALUE phi, VALUE k, 
-				  VALUE n, VALUE m)
+static VALUE rb_gsl_sf_ellint_P_e(VALUE obj, VALUE phi, VALUE k,
+                                  VALUE n, VALUE m)
 {
   return rb_gsl_sf_eval_e_double3_m(gsl_sf_ellint_P_e, phi, k, n, m);
 }
 
 static VALUE rb_gsl_sf_ellint_D(int argc, VALUE *argv, VALUE obj)
 {
-  if (argc == 3) 
+  if (argc == 3)
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_D, argv[0], argv[1], argv[2],
-				    INT2FIX(GSL_PREC_DOUBLE));
-  else 
+                                    INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_D, argv[0], argv[1], argv[2],
-				    argv[3]);
+                                    argv[3]);
 }
 
-static VALUE rb_gsl_sf_ellint_D_e(VALUE obj, VALUE phi, VALUE k, 
-				  VALUE n, VALUE m)
+static VALUE rb_gsl_sf_ellint_D_e(VALUE obj, VALUE phi, VALUE k,
+                                  VALUE n, VALUE m)
 {
   return rb_gsl_sf_eval_e_double3_m(gsl_sf_ellint_D_e, phi, k, n, m);
 }
 
 static VALUE rb_gsl_sf_ellint_RC(int argc, VALUE *argv, VALUE obj)
 {
-  if (argc == 2) 
-    return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_RC, argv[0], argv[1], 
-				    INT2FIX(GSL_PREC_DOUBLE));
-  else 
+  if (argc == 2)
+    return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_RC, argv[0], argv[1],
+                                    INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_RC, argv[0], argv[1], argv[2]);
 }
 
@@ -111,48 +111,48 @@ static VALUE rb_gsl_sf_ellint_RC_e(VALUE obj, VALUE x, VALUE y, VALUE m)
 
 static VALUE rb_gsl_sf_ellint_RD(int argc, VALUE *argv, VALUE obj)
 {
-  if (argc == 3) 
+  if (argc == 3)
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_RD, argv[0], argv[1], argv[2],
-				    INT2FIX(GSL_PREC_DOUBLE));
-  else 
+                                    INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_RD, argv[0], argv[1], argv[2],
-				    argv[3]);
+                                    argv[3]);
 }
 
-static VALUE rb_gsl_sf_ellint_RD_e(VALUE obj, VALUE x, VALUE y, 
-				   VALUE z, VALUE m)
+static VALUE rb_gsl_sf_ellint_RD_e(VALUE obj, VALUE x, VALUE y,
+                                   VALUE z, VALUE m)
 {
   return rb_gsl_sf_eval_e_double3_m(gsl_sf_ellint_RD_e, x, y, z, m);
 }
 
 static VALUE rb_gsl_sf_ellint_RF(int argc, VALUE *argv, VALUE obj)
 {
-  if (argc == 3) 
+  if (argc == 3)
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_RF, argv[0], argv[1], argv[2],
-				    INT2FIX(GSL_PREC_DOUBLE));
-  else 
+                                    INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_RF, argv[0], argv[1], argv[2],
-				    argv[3]);
+                                    argv[3]);
 }
 
-static VALUE rb_gsl_sf_ellint_RF_e(VALUE obj, VALUE x, VALUE y, 
-				   VALUE z, VALUE m)
+static VALUE rb_gsl_sf_ellint_RF_e(VALUE obj, VALUE x, VALUE y,
+                                   VALUE z, VALUE m)
 {
   return rb_gsl_sf_eval_e_double3_m(gsl_sf_ellint_RF_e, x, y, z, m);
 }
 
 static VALUE rb_gsl_sf_ellint_RJ(int argc, VALUE *argv, VALUE obj)
 {
-  if (argc == 4) 
+  if (argc == 4)
     return rb_gsl_sf_eval_double4_m(gsl_sf_ellint_RJ, argv[0], argv[1], argv[2],
-				    argv[3], INT2FIX(GSL_PREC_DOUBLE));
-  else 
+                                    argv[3], INT2FIX(GSL_PREC_DOUBLE));
+  else
     return rb_gsl_sf_eval_double4_m(gsl_sf_ellint_RJ, argv[0], argv[1], argv[2],
-				    argv[3], argv[4]);
+                                    argv[3], argv[4]);
 }
 
-static VALUE rb_gsl_sf_ellint_RJ_e(VALUE obj, VALUE x, VALUE y, 
-				   VALUE z, VALUE p, VALUE m)
+static VALUE rb_gsl_sf_ellint_RJ_e(VALUE obj, VALUE x, VALUE y,
+                                   VALUE z, VALUE p, VALUE m)
 {
   return rb_gsl_sf_eval_e_double4_m(gsl_sf_ellint_RJ_e, x, y, z, p, m);
 }
diff --git a/ext/gsl/sf_elljac.c b/ext/gsl_native/sf_elljac.c
similarity index 90%
rename from ext/gsl/sf_elljac.c
rename to ext/gsl_native/sf_elljac.c
index 401fd29..3d1dae7 100644
--- a/ext/gsl/sf_elljac.c
+++ b/ext/gsl_native/sf_elljac.c
@@ -19,8 +19,8 @@ static VALUE rb_gsl_sf_elljac_e(VALUE obj, VALUE n, VALUE m)
   //int status;
   Need_Float(n); Need_Float(m);
   /*status =*/ gsl_sf_elljac_e(NUM2DBL(n), NUM2DBL(m), &sn, &cn, &dn);
-  return rb_ary_new3(3, rb_float_new(sn), 
-		     rb_float_new(cn), rb_float_new(dn));
+  return rb_ary_new3(3, rb_float_new(sn),
+                     rb_float_new(cn), rb_float_new(dn));
 }
 
 void Init_gsl_sf_elljac(VALUE module)
diff --git a/ext/gsl/sf_erfc.c b/ext/gsl_native/sf_erfc.c
similarity index 97%
rename from ext/gsl/sf_erfc.c
rename to ext/gsl_native/sf_erfc.c
index 2735bc6..74e4ccb 100644
--- a/ext/gsl/sf_erfc.c
+++ b/ext/gsl_native/sf_erfc.c
@@ -62,7 +62,6 @@ static VALUE rb_gsl_sf_erf_Q_e(VALUE obj, VALUE x)
   return rb_gsl_sf_eval_e(gsl_sf_erf_Q_e, x);
 }
 
-#ifdef GSL_1_4_LATER
 static VALUE rb_gsl_sf_hazard(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval1(gsl_sf_hazard, x);
@@ -72,7 +71,6 @@ static VALUE rb_gsl_sf_hazard_e(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval_e(gsl_sf_hazard_e, x);
 }
-#endif
 
 void Init_gsl_sf_erfc(VALUE module)
 {
@@ -86,8 +84,6 @@ void Init_gsl_sf_erfc(VALUE module)
   rb_define_module_function(module, "erf_Z_e",  rb_gsl_sf_erf_Z_e, 1);
   rb_define_module_function(module, "erf_Q",  rb_gsl_sf_erf_Q, 1);
   rb_define_module_function(module, "erf_Q_e",  rb_gsl_sf_erf_Q_e, 1);
-#ifdef GSL_1_4_LATER
   rb_define_module_function(module, "hazard",  rb_gsl_sf_hazard, 1);
   rb_define_module_function(module, "hazard_e",  rb_gsl_sf_hazard_e, 1);
-#endif
 }
diff --git a/ext/gsl/sf_exp.c b/ext/gsl_native/sf_exp.c
similarity index 97%
rename from ext/gsl/sf_exp.c
rename to ext/gsl_native/sf_exp.c
index 78f235e..7b08a8c 100644
--- a/ext/gsl/sf_exp.c
+++ b/ext/gsl_native/sf_exp.c
@@ -119,7 +119,7 @@ static VALUE rb_gsl_sf_exp_err_e10_e(VALUE obj, VALUE x, VALUE dx)
 }
 
 static VALUE rb_gsl_sf_exp_mult_err_e(VALUE obj, VALUE x, VALUE dx,
-				      VALUE y, VALUE dy)
+                                      VALUE y, VALUE dy)
 {
   gsl_sf_result *rslt = NULL;
   VALUE v;
@@ -133,7 +133,7 @@ static VALUE rb_gsl_sf_exp_mult_err_e(VALUE obj, VALUE x, VALUE dx,
 }
 
 static VALUE rb_gsl_sf_exp_mult_err_e10_e(VALUE obj, VALUE x, VALUE dx,
-					  VALUE y, VALUE dy)
+                                          VALUE y, VALUE dy)
 {
   gsl_sf_result_e10 *rslt = NULL;
   VALUE v;
diff --git a/ext/gsl/sf_expint.c b/ext/gsl_native/sf_expint.c
similarity index 98%
rename from ext/gsl/sf_expint.c
rename to ext/gsl_native/sf_expint.c
index c56f4fd..dbe36f4 100644
--- a/ext/gsl/sf_expint.c
+++ b/ext/gsl_native/sf_expint.c
@@ -102,7 +102,6 @@ static VALUE rb_gsl_sf_atanint_e(VALUE obj, VALUE x)
   return rb_gsl_sf_eval_e(gsl_sf_atanint_e, x);
 }
 
-#ifdef GSL_1_3_LATER
 static VALUE rb_gsl_sf_expint_E1_scaled(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval1(gsl_sf_expint_E1_scaled, x);
@@ -132,9 +131,7 @@ static VALUE rb_gsl_sf_expint_Ei_scaled_e(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval_e(gsl_sf_expint_Ei_scaled_e, x);
 }
-#endif
 
-#ifdef GSL_1_10_LATER
 static VALUE rb_gsl_sf_expint_En(VALUE obj, VALUE n, VALUE x)
 {
   return rb_gsl_sf_eval_int_double(gsl_sf_expint_En, n, x);
@@ -148,8 +145,6 @@ static VALUE rb_gsl_sf_expint_En_e(VALUE obj, VALUE n, VALUE x)
   return val;
 }
 
-#endif
-
 void Init_gsl_sf_expint(VALUE module)
 {
   VALUE mgsl_sf_expint;
@@ -185,7 +180,6 @@ void Init_gsl_sf_expint(VALUE module)
   rb_define_module_function(mgsl_sf_expint, "three",  rb_gsl_sf_expint_3, 1);
   rb_define_module_function(mgsl_sf_expint, "three_e",  rb_gsl_sf_expint_3_e, 1);
 
-#ifdef GSL_1_3_LATER
   rb_define_module_function(module, "expint_E1_scaled",  rb_gsl_sf_expint_E1_scaled, 1);
   rb_define_module_function(module, "expint_E1_scaled_e",  rb_gsl_sf_expint_E1_scaled_e, 1);
   rb_define_module_function(module, "expint_E2_scaled",  rb_gsl_sf_expint_E2_scaled, 1);
@@ -199,13 +193,9 @@ void Init_gsl_sf_expint(VALUE module)
   rb_define_module_function(mgsl_sf_expint, "E2_scaled_e",  rb_gsl_sf_expint_E2_scaled_e, 1);
   rb_define_module_function(mgsl_sf_expint, "Ei_scaled",  rb_gsl_sf_expint_Ei_scaled, 1);
   rb_define_module_function(mgsl_sf_expint, "Ei_scaled_e",  rb_gsl_sf_expint_Ei_scaled_e, 1);
-#endif
 
-#ifdef GSL_1_10_LATER
   rb_define_module_function(module, "expint_En",  rb_gsl_sf_expint_En, 2);
   rb_define_module_function(mgsl_sf_expint, "En",  rb_gsl_sf_expint_En, 2);
   rb_define_module_function(module, "expint_En_e",  rb_gsl_sf_expint_En_e, 2);
-  rb_define_module_function(mgsl_sf_expint, "En_e",  rb_gsl_sf_expint_En_e, 2);  
-#endif
-
+  rb_define_module_function(mgsl_sf_expint, "En_e",  rb_gsl_sf_expint_En_e, 2);
 }
diff --git a/ext/gsl/sf_fermi_dirac.c b/ext/gsl_native/sf_fermi_dirac.c
similarity index 100%
rename from ext/gsl/sf_fermi_dirac.c
rename to ext/gsl_native/sf_fermi_dirac.c
diff --git a/ext/gsl/sf_gamma.c b/ext/gsl_native/sf_gamma.c
similarity index 99%
rename from ext/gsl/sf_gamma.c
rename to ext/gsl_native/sf_gamma.c
index 287566c..d77cbfc 100644
--- a/ext/gsl/sf_gamma.c
+++ b/ext/gsl_native/sf_gamma.c
@@ -242,12 +242,10 @@ static VALUE rb_gsl_sf_gamma_inc(VALUE obj, VALUE a, VALUE x)
   return rb_gsl_sf_eval_double_double(gsl_sf_gamma_inc_P, a, x);
 }
 
-#ifdef GSL_1_4_LATER
 static VALUE rb_gsl_sf_gamma_inc_e(VALUE obj, VALUE a, VALUE x)
 {
   return rb_gsl_sf_eval_e_double2(gsl_sf_gamma_inc_e, a, x);
 }
-#endif
 
 static VALUE rb_gsl_sf_beta(VALUE obj, VALUE a, VALUE b)
 {
@@ -284,7 +282,7 @@ static VALUE rb_gsl_sf_beta_inc_e(VALUE obj, VALUE a, VALUE b, VALUE x)
 double mygsl_binomial_coef(unsigned int n, unsigned int k);
 double mygsl_binomial_coef(unsigned int n, unsigned int k)
 {
-  return floor(0.5 + exp(gsl_sf_lnfact(n) - gsl_sf_lnfact(k) - gsl_sf_lnfact(n-k))); 
+  return floor(0.5 + exp(gsl_sf_lnfact(n) - gsl_sf_lnfact(k) - gsl_sf_lnfact(n-k)));
 }
 
 static VALUE rb_gsl_sf_bincoef(VALUE obj, VALUE n, VALUE k)
@@ -333,9 +331,7 @@ void Init_gsl_sf_gamma(VALUE module)
   rb_define_module_function(module, "gamma_inc_Q_e",  rb_gsl_sf_gamma_inc_Q_e, 2);
   rb_define_module_function(module, "gamma_inc",  rb_gsl_sf_gamma_inc, 2);
 
-#ifdef GSL_1_4_LATER
   rb_define_module_function(module, "gamma_inc_e",  rb_gsl_sf_gamma_inc_e, 2);
-#endif
   rb_define_module_function(module, "beta",  rb_gsl_sf_beta, 2);
   rb_define_module_function(module, "beta_e",  rb_gsl_sf_beta_e, 2);
   rb_define_module_function(module, "lnbeta",  rb_gsl_sf_lnbeta, 2);
diff --git a/ext/gsl/sf_gegenbauer.c b/ext/gsl_native/sf_gegenbauer.c
similarity index 100%
rename from ext/gsl/sf_gegenbauer.c
rename to ext/gsl_native/sf_gegenbauer.c
diff --git a/ext/gsl/sf_hyperg.c b/ext/gsl_native/sf_hyperg.c
similarity index 100%
rename from ext/gsl/sf_hyperg.c
rename to ext/gsl_native/sf_hyperg.c
diff --git a/ext/gsl/sf_laguerre.c b/ext/gsl_native/sf_laguerre.c
similarity index 95%
rename from ext/gsl/sf_laguerre.c
rename to ext/gsl_native/sf_laguerre.c
index 8cb6f06..85d15b2 100644
--- a/ext/gsl/sf_laguerre.c
+++ b/ext/gsl_native/sf_laguerre.c
@@ -12,7 +12,7 @@
 #include "include/rb_gsl_sf.h"
 
 static VALUE rb_gsl_sf_laguerre_X(int argc, VALUE *argv, VALUE obj,
-				  double (*f)(double, double))
+                                  double (*f)(double, double))
 {
   switch (argc) {
   case 2:
@@ -62,11 +62,11 @@ static VALUE rb_gsl_sf_laguerre_n(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 3:
     return rb_gsl_sf_eval_int_double_double(gsl_sf_laguerre_n, argv[0],
-					    argv[1], argv[2]);
+                                            argv[1], argv[2]);
     break;
   case 2:
     return rb_gsl_sf_eval_int_double_double(gsl_sf_laguerre_n, argv[0],
-					    INT2FIX(0), argv[1]);
+                                            INT2FIX(0), argv[1]);
     break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
diff --git a/ext/gsl/sf_lambert.c b/ext/gsl_native/sf_lambert.c
similarity index 100%
rename from ext/gsl/sf_lambert.c
rename to ext/gsl_native/sf_lambert.c
diff --git a/ext/gsl/sf_legendre.c b/ext/gsl_native/sf_legendre.c
similarity index 100%
rename from ext/gsl/sf_legendre.c
rename to ext/gsl_native/sf_legendre.c
diff --git a/ext/gsl/sf_log.c b/ext/gsl_native/sf_log.c
similarity index 99%
rename from ext/gsl/sf_log.c
rename to ext/gsl_native/sf_log.c
index ff4edfb..533ef42 100644
--- a/ext/gsl/sf_log.c
+++ b/ext/gsl_native/sf_log.c
@@ -13,14 +13,14 @@
 
 static VALUE rb_gsl_sf_log(VALUE obj, VALUE x)
 {
-  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) 
+  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x))
     return rb_gsl_math_complex_eval(gsl_complex_log, x);
   return rb_gsl_sf_eval1(gsl_sf_log, x);
 }
 
 static VALUE rb_gsl_sf_log10(VALUE obj, VALUE x)
 {
-  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) 
+  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x))
     return rb_gsl_math_complex_eval(gsl_complex_log10, x);
   return rb_gsl_sf_eval1(log10, x);
 }
@@ -93,7 +93,7 @@ static VALUE rb_gsl_sf_log_1plusx_mx_e(VALUE obj, VALUE x)
 void Init_gsl_sf_log(VALUE module)
 {
   rb_define_module_function(module, "log",  rb_gsl_sf_log, 1);
-  rb_define_module_function(module, "log10",  rb_gsl_sf_log10, 1);  
+  rb_define_module_function(module, "log10",  rb_gsl_sf_log10, 1);
   rb_define_module_function(module, "log_e",  rb_gsl_sf_log_e, 1);
   rb_define_module_function(module, "log_abs",  rb_gsl_sf_log_abs, 1);
   rb_define_module_function(module, "log_abs_e",  rb_gsl_sf_log_abs_e, 1);
diff --git a/ext/gsl_native/sf_mathieu.c b/ext/gsl_native/sf_mathieu.c
new file mode 100644
index 0000000..8af91b7
--- /dev/null
+++ b/ext/gsl_native/sf_mathieu.c
@@ -0,0 +1,235 @@
+#include "include/rb_gsl.h"
+
+static VALUE cWorkspace;
+
+static VALUE rb_gsl_sf_mathieu_alloc(VALUE klass, VALUE n, VALUE q)
+{
+  gsl_sf_mathieu_workspace *w;
+  w = gsl_sf_mathieu_alloc((size_t) FIX2INT(n), NUM2DBL(q));
+  return Data_Wrap_Struct(klass, 0, gsl_sf_mathieu_free, w);
+}
+
+static VALUE sf_mathieu_eval(VALUE order, VALUE qq,
+                             int (*f)(int, double, gsl_sf_result*))
+{
+  gsl_sf_result r;
+  (*f)(FIX2INT(order), NUM2DBL(qq), &r);
+  return rb_float_new(r.val);
+}
+
+static VALUE sf_mathieu_eval2(VALUE n1, VALUE n2, VALUE q, VALUE x,
+                              int (*f)(int, int, double, double, gsl_sf_result*))
+{
+  gsl_sf_result r;
+  (*f)(FIX2INT(n1),FIX2INT(n2),  NUM2DBL(q), NUM2DBL(x), &r);
+  return rb_float_new(r.val);
+}
+
+static VALUE sf_mathieu_array_eval(int argc, VALUE *argv,
+                                   int (*f)(int, int, double, gsl_sf_mathieu_workspace*, double[]))
+{
+  gsl_sf_mathieu_workspace *w;
+  gsl_vector *v;
+  int n1, n2;
+  double q;
+  switch (argc) {
+  case 4:
+    if (!rb_obj_is_kind_of(argv[3], cWorkspace)) {
+      rb_raise(rb_eTypeError, "Wrong argument type 3 (%s detected, %s expected)",
+               rb_class2name(CLASS_OF(argv[3])), rb_class2name(cWorkspace));
+    }
+    n1 = FIX2INT(argv[0]);
+    n2 = FIX2INT(argv[1]);
+    q = NUM2DBL(argv[2]);
+    Data_Get_Struct(argv[3], gsl_sf_mathieu_workspace, w);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 4)", argc);
+  }
+  v = gsl_vector_alloc(n2 - n1 + 1);
+  (*f)(n1, n2, q, w, v->data);
+  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
+}
+
+static VALUE sf_mathieu_array_eval2(int argc, VALUE *argv,
+                                    int (*f)(int, int,  double, double, gsl_sf_mathieu_workspace*, double[]))
+{
+  gsl_sf_mathieu_workspace *w;
+  gsl_vector *v;
+  int n1, n2;
+  double q, x;
+  switch (argc) {
+  case 5:
+    if (!rb_obj_is_kind_of(argv[4], cWorkspace)) {
+      rb_raise(rb_eTypeError, "Wrong argument type 4 (%s detected, %s expected)",
+               rb_class2name(CLASS_OF(argv[4])), rb_class2name(cWorkspace));
+    }
+    n1 = FIX2INT(argv[0]);
+    n2 = FIX2INT(argv[1]);
+    q = NUM2DBL(argv[2]);
+    x = NUM2DBL(argv[3]);
+    Data_Get_Struct(argv[4], gsl_sf_mathieu_workspace, w);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 5)", argc);
+  }
+  v = gsl_vector_alloc(n2 - n1 + 1);
+  (*f)(n1, n2, q, x, w, v->data);
+  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
+}
+static VALUE sf_mathieu_array_eval3(int argc, VALUE *argv,
+                                    int (*f)(int, int, int, double, double, gsl_sf_mathieu_workspace*, double[]))
+{
+  gsl_sf_mathieu_workspace *w;
+  gsl_vector *v;
+  int n1, n2, n3;
+  double q, x;
+  switch (argc) {
+  case 6:
+    if (!rb_obj_is_kind_of(argv[5], cWorkspace)) {
+      rb_raise(rb_eTypeError, "Wrong argument type 5 (%s detected, %s expected)",
+               rb_class2name(CLASS_OF(argv[5])), rb_class2name(cWorkspace));
+    }
+    n1 = FIX2INT(argv[0]);
+    n2 = FIX2INT(argv[1]);
+    n3 = FIX2INT(argv[2]);
+    q = NUM2DBL(argv[3]);
+    x = NUM2DBL(argv[4]);
+    Data_Get_Struct(argv[5], gsl_sf_mathieu_workspace, w);
+    break;
+  default:
+    rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 6)", argc);
+  }
+  v = gsl_vector_alloc(n3 - n2 + 1);
+  (*f)(n1, n2, n3, q, x, w, v->data);
+  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
+}
+static VALUE sf_mathieu_eval_int_double2(VALUE order, VALUE qq, VALUE zz,
+                                         int (*f)(int, double, double, gsl_sf_result*))
+{
+  gsl_sf_result r;
+  (*f)(FIX2INT(order), NUM2DBL(qq), NUM2DBL(zz), &r);
+  return rb_float_new(r.val);
+}
+static VALUE sf_mathieu_eval_e_int_double2(VALUE order, VALUE qq, VALUE zz,
+                                           int (*f)(int, double, double, gsl_sf_result*))
+{
+  gsl_sf_result *r;
+  VALUE val;
+  val = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r);
+  (*f)(FIX2INT(order), NUM2DBL(qq), NUM2DBL(zz), r);
+  return val;
+}
+
+static VALUE sf_mathieu_eval_e_int2_double2(VALUE n1, VALUE n2, VALUE qq, VALUE zz,
+                                            int (*f)(int, int, double, double, gsl_sf_result*))
+{
+  gsl_sf_result *r;
+  VALUE val;
+  val = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r);
+  (*f)(FIX2INT(n1), FIX2INT(n2), NUM2DBL(qq), NUM2DBL(zz), r);
+  return val;
+}
+/**********/
+static VALUE rb_gsl_sf_mathieu_a_e(VALUE module, VALUE order, VALUE qq)
+{
+  return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_a, order, qq);
+}
+static VALUE rb_gsl_sf_mathieu_a(VALUE module, VALUE order, VALUE qq)
+{
+  return sf_mathieu_eval(order, qq, gsl_sf_mathieu_a);
+}
+static VALUE rb_gsl_sf_mathieu_a_array(VALUE module, int argc, VALUE *argv)
+{
+  return sf_mathieu_array_eval(argc, argv, gsl_sf_mathieu_a_array);
+}
+static VALUE rb_gsl_sf_mathieu_b_e(VALUE module, VALUE order, VALUE qq)
+{
+  return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_b, order, qq);
+}
+static VALUE rb_gsl_sf_mathieu_b(VALUE module, VALUE order, VALUE qq)
+{
+  return sf_mathieu_eval(order, qq, gsl_sf_mathieu_b);
+}
+static VALUE rb_gsl_sf_mathieu_b_array(VALUE module, int argc, VALUE *argv)
+{
+  return sf_mathieu_array_eval(argc, argv, gsl_sf_mathieu_b_array);
+}
+static VALUE rb_gsl_sf_mathieu_ce_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
+{
+  return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
+}
+static VALUE rb_gsl_sf_mathieu_ce(VALUE module, VALUE order, VALUE qq, VALUE zz)
+{
+  return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
+}
+static VALUE rb_gsl_sf_mathieu_ce_array(VALUE module, int argc, VALUE *argv)
+{
+  return sf_mathieu_array_eval2(argc, argv, gsl_sf_mathieu_ce_array);
+}
+static VALUE rb_gsl_sf_mathieu_se_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
+{
+  return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_se);
+}
+static VALUE rb_gsl_sf_mathieu_se(VALUE module, VALUE order, VALUE qq, VALUE zz)
+{
+  return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_se);
+}
+static VALUE rb_gsl_sf_mathieu_se_array(VALUE module, int argc, VALUE *argv)
+{
+  return sf_mathieu_array_eval2(argc, argv, gsl_sf_mathieu_se_array);
+}
+
+/*****/
+static VALUE rb_gsl_sf_mathieu_Mc_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
+{
+  return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Mc);
+}
+static VALUE rb_gsl_sf_mathieu_Mc(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
+{
+  return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Mc);
+}
+static VALUE rb_gsl_sf_mathieu_Mc_array(VALUE module, int argc, VALUE *argv)
+{
+  return sf_mathieu_array_eval3(argc, argv, gsl_sf_mathieu_Mc_array);
+}
+static VALUE rb_gsl_sf_mathieu_Ms_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
+{
+  return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Ms);
+}
+static VALUE rb_gsl_sf_mathieu_Ms(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
+{
+  return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Ms);
+}
+static VALUE rb_gsl_sf_mathieu_Ms_array(VALUE module, int argc, VALUE *argv)
+{
+  return sf_mathieu_array_eval3(argc, argv, gsl_sf_mathieu_Ms_array);
+}
+/*****/
+void Init_sf_mathieu(VALUE module)
+{
+  VALUE mMathieu;
+
+  mMathieu = rb_define_module_under(module, "Mathieu");
+  cWorkspace = rb_define_class_under(mMathieu, "Workspace", cGSL_Object);
+  rb_define_singleton_method(cWorkspace, "alloc", rb_gsl_sf_mathieu_alloc, 2);
+
+  rb_define_module_function(module, "mathieu_a", rb_gsl_sf_mathieu_a, 2);
+  rb_define_module_function(module, "mathieu_a_e", rb_gsl_sf_mathieu_a_e, 2);
+  rb_define_module_function(module, "mathieu_a_array", rb_gsl_sf_mathieu_a_array, -1);
+  rb_define_module_function(module, "mathieu_b", rb_gsl_sf_mathieu_b, 2);
+  rb_define_module_function(module, "mathieu_b_e", rb_gsl_sf_mathieu_b_e, 2);
+  rb_define_module_function(module, "mathieu_b_array", rb_gsl_sf_mathieu_b_array, -1);
+  rb_define_module_function(module, "mathieu_ce", rb_gsl_sf_mathieu_ce, 3);
+  rb_define_module_function(module, "mathieu_ce_e", rb_gsl_sf_mathieu_ce_e, 3);
+  rb_define_module_function(module, "mathieu_ce_array", rb_gsl_sf_mathieu_ce_array, -1);
+  rb_define_module_function(module, "mathieu_se", rb_gsl_sf_mathieu_se, 3);
+  rb_define_module_function(module, "mathieu_se_e", rb_gsl_sf_mathieu_se_e, 3);
+  rb_define_module_function(module, "mathieu_se_array", rb_gsl_sf_mathieu_se_array, -1);
+  rb_define_module_function(module, "mathieu_Mc", rb_gsl_sf_mathieu_Mc, 4);
+  rb_define_module_function(module, "mathieu_Mc_e", rb_gsl_sf_mathieu_Mc_e, 4);
+  rb_define_module_function(module, "mathieu_Mc_array", rb_gsl_sf_mathieu_Mc_array, -1);
+  rb_define_module_function(module, "mathieu_Ms", rb_gsl_sf_mathieu_Ms, 4);
+  rb_define_module_function(module, "mathieu_Ms_e", rb_gsl_sf_mathieu_Ms_e, 4);
+  rb_define_module_function(module, "mathieu_Ms_array", rb_gsl_sf_mathieu_Ms_array, -1);
+}
diff --git a/ext/gsl/sf_power.c b/ext/gsl_native/sf_power.c
similarity index 100%
rename from ext/gsl/sf_power.c
rename to ext/gsl_native/sf_power.c
diff --git a/ext/gsl/sf_psi.c b/ext/gsl_native/sf_psi.c
similarity index 90%
rename from ext/gsl/sf_psi.c
rename to ext/gsl_native/sf_psi.c
index 63ef95e..f9391ad 100644
--- a/ext/gsl/sf_psi.c
+++ b/ext/gsl_native/sf_psi.c
@@ -31,19 +31,15 @@ static VALUE rb_gsl_sf_psi_e(VALUE obj, VALUE x)
   return rb_gsl_sf_eval_e(gsl_sf_psi_e, x);
 }
 
-#ifdef GSL_1_6_LATER
 static VALUE rb_gsl_sf_psi_1(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval1(gsl_sf_psi_1, x);
 }
-#endif
 
-#ifdef GSL_1_4_9_LATER
 static VALUE rb_gsl_sf_psi_1_e(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval_e(gsl_sf_psi_1_e, x);
 }
-#endif
 
 static VALUE rb_gsl_sf_psi_1piy(VALUE obj, VALUE x)
 {
@@ -88,11 +84,6 @@ void Init_gsl_sf_psi(VALUE module)
 
   rb_define_module_function(module, "psi",  rb_gsl_sf_psi, 1);
   rb_define_module_function(module, "psi_e",  rb_gsl_sf_psi_e, 1);
-
-#ifdef GSL_1_6_LATER
-    rb_define_module_function(module, "psi_1",  rb_gsl_sf_psi_1, 1);
-#endif
-#ifdef GSL_1_4_9_LATER
-    rb_define_module_function(module, "psi_1_e",  rb_gsl_sf_psi_1_e, 1);
-#endif
+  rb_define_module_function(module, "psi_1",  rb_gsl_sf_psi_1, 1);
+  rb_define_module_function(module, "psi_1_e",  rb_gsl_sf_psi_1_e, 1);
 }
diff --git a/ext/gsl/sf_synchrotron.c b/ext/gsl_native/sf_synchrotron.c
similarity index 100%
rename from ext/gsl/sf_synchrotron.c
rename to ext/gsl_native/sf_synchrotron.c
diff --git a/ext/gsl/sf_transport.c b/ext/gsl_native/sf_transport.c
similarity index 100%
rename from ext/gsl/sf_transport.c
rename to ext/gsl_native/sf_transport.c
diff --git a/ext/gsl/sf_trigonometric.c b/ext/gsl_native/sf_trigonometric.c
similarity index 98%
rename from ext/gsl/sf_trigonometric.c
rename to ext/gsl_native/sf_trigonometric.c
index dbce7b3..7cc16e1 100644
--- a/ext/gsl/sf_trigonometric.c
+++ b/ext/gsl_native/sf_trigonometric.c
@@ -13,7 +13,7 @@
 
 static VALUE rb_gsl_sf_sin(VALUE obj, VALUE x)
 {
-  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) 
+  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x))
     return rb_gsl_math_complex_eval(gsl_complex_sin, x);
   return rb_gsl_sf_eval1(gsl_sf_sin, x);
 }
@@ -25,7 +25,7 @@ static VALUE rb_gsl_sf_sin_e(VALUE obj, VALUE x)
 
 static VALUE rb_gsl_sf_cos(VALUE obj, VALUE x)
 {
-  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) 
+  if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x))
     return rb_gsl_math_complex_eval(gsl_complex_cos, x);
   return rb_gsl_sf_eval1(gsl_sf_cos, x);
 }
@@ -57,7 +57,7 @@ static VALUE rb_gsl_sf_sinc_e(VALUE obj, VALUE x)
 }
 
 static VALUE rb_gsl_sf_complex_XXX_e(int argc, VALUE *argv, VALUE obj,
-				     int (*f)(double, double, gsl_sf_result*, gsl_sf_result*))
+                                     int (*f)(double, double, gsl_sf_result*, gsl_sf_result*))
 {
   gsl_sf_result *r1, *r2;
   gsl_complex *z;
diff --git a/ext/gsl/sf_zeta.c b/ext/gsl_native/sf_zeta.c
similarity index 98%
rename from ext/gsl/sf_zeta.c
rename to ext/gsl_native/sf_zeta.c
index 4f6ce24..6d8f22d 100644
--- a/ext/gsl/sf_zeta.c
+++ b/ext/gsl_native/sf_zeta.c
@@ -68,7 +68,6 @@ static VALUE rb_gsl_sf_eta_e(VALUE obj, VALUE x)
   return rb_gsl_sf_eval_e(gsl_sf_eta_e, x);
 }
 
-#ifdef GSL_1_4_9_LATER
 static VALUE rb_gsl_sf_zetam1_int(VALUE obj, VALUE n)
 {
   VALUE nn;
@@ -94,7 +93,6 @@ static VALUE rb_gsl_sf_zetam1_e(VALUE obj, VALUE x)
 {
   return rb_gsl_sf_eval_e(gsl_sf_zetam1_e, x);
 }
-#endif
 
 void Init_gsl_sf_zeta(VALUE module)
 {
@@ -110,10 +108,8 @@ void Init_gsl_sf_zeta(VALUE module)
   rb_define_module_function(module, "eta",  rb_gsl_sf_eta, 1);
   rb_define_module_function(module, "eta_e",  rb_gsl_sf_eta_e, 1);
 
-#ifdef GSL_1_4_9_LATER
   rb_define_module_function(module, "zetam1_int",  rb_gsl_sf_zetam1_int, 1);
   rb_define_module_function(module, "zetam1_int_e",  rb_gsl_sf_zetam1_int_e, 1);
   rb_define_module_function(module, "zetam1",  rb_gsl_sf_zetam1, 1);
   rb_define_module_function(module, "zetam1_e",  rb_gsl_sf_zetam1_e, 1);
-#endif
 }
diff --git a/ext/gsl/signal.c b/ext/gsl_native/signal.c
similarity index 77%
rename from ext/gsl/signal.c
rename to ext/gsl_native/signal.c
index 6888d81..2e27f89 100644
--- a/ext/gsl/signal.c
+++ b/ext/gsl_native/signal.c
@@ -16,43 +16,43 @@ enum FFT_CONV_CORR {
   RB_GSL_FFT_CORRELATE = 1,
   RB_GSL_FFT_REAL = 2,
   RB_GSL_FFT_HALFCOMPLEX = 3,
-  RB_GSL_FFT_DECONVOLVE = 4,  
+  RB_GSL_FFT_DECONVOLVE = 4,
 };
 
 #ifndef WAVETABLE_P
-#define WAVETABLE_P(x) (rb_obj_is_kind_of(x,cgsl_fft_halfcomplex_wavetable)?1:0)
+#define WAVETABLE_P(x) (rb_obj_is_kind_of(x,cgsl_fft_halfcomplex_wavetable) ? 1 : 0)
 #endif
 
 #ifndef CHECK_WAVETABLE
-#define CHECK_WAVETABLE(x) if(!rb_obj_is_kind_of(x,cgsl_fft_halfcomplex_wavetable))\
+#define CHECK_WAVETABLE(x) if(!rb_obj_is_kind_of(x,cgsl_fft_halfcomplex_wavetable)) \
     rb_raise(rb_eTypeError, "wrong argument type (FFT::HalfComplex::Wavetable expected)");
 #endif
 
 #ifndef WORKSPACE_P
-#define WORKSPACE_P(x) (rb_obj_is_kind_of(x,cgsl_fft_real_workspace)?1:0)
+#define WORKSPACE_P(x) (rb_obj_is_kind_of(x,cgsl_fft_real_workspace) ? 1 : 0)
 #endif
 
 #ifndef CHECK_WORKSPACE
-#define CHECK_WORKSPACE(x) if(!rb_obj_is_kind_of(x,cgsl_fft_real_workspace))\
+#define CHECK_WORKSPACE(x) if(!rb_obj_is_kind_of(x,cgsl_fft_real_workspace)) \
     rb_raise(rb_eTypeError, "wrong argument type (FFT::Real::Workspace expected)");
 #endif
 
 static void complex_mul(double re1, double im1, double re2, double im2,
-      double *re, double *im)
+                        double *re, double *im)
 {
   *re = re1*re2 - im1*im2;
   *im = re1*im2 + im1*re2;
 }
 
 static void complex_conj_mul(double re1, double im1, double re2, double im2,
-      double *re, double *im)
+                             double *re, double *im)
 {
   *re = re1*re2 + im1*im2;
   *im = -re1*im2 + im1*re2;
 }
 
 static void complex_div(double re1, double im1, double re2, double im2,
-      double *re, double *im)
+                        double *re, double *im)
 {
   double factor = re2*re2 + im2*im2;
   complex_conj_mul(re1, im1, re2, im2, re, im);
@@ -61,55 +61,50 @@ static void complex_div(double re1, double im1, double re2, double im2,
 }
 
 /* data1, data2: FFTed data */
-static void rbgsl_calc_conv_corr_c(const double *data1, const double *data2, 
-     double *data3, size_t size,
-     gsl_fft_halfcomplex_wavetable *table,
-     gsl_fft_real_workspace *space, enum FFT_CONV_CORR calcflag)
+static void rbgsl_calc_conv_corr_c(const double *data1, const double *data2,
+                                   double *data3, size_t size,
+                                   gsl_fft_halfcomplex_wavetable *table,
+                                   gsl_fft_real_workspace *space, enum FFT_CONV_CORR calcflag)
 {
   size_t i;
   double re1, re2, im1, im2;
   void (*complex_cal)(double, double, double, double, double*, double*);
-  
+
   switch (calcflag) {
   case RB_GSL_FFT_CONVOLVE:
     complex_cal = complex_mul;
     data3[0] = data1[0]*data2[0];
-    data3[size-1] = data1[size-1]*data2[size-1];    
+    data3[size-1] = data1[size-1]*data2[size-1];
     break;
-  case RB_GSL_FFT_CORRELATE:  
-    data3[0] = data1[0]*data2[0];  
-    data3[size-1] = data1[size-1]*data2[size-1];        
+  case RB_GSL_FFT_CORRELATE:
+    data3[0] = data1[0]*data2[0];
+    data3[size-1] = data1[size-1]*data2[size-1];
     complex_cal = complex_conj_mul;
     break;
   case RB_GSL_FFT_DECONVOLVE:
     complex_cal = complex_div;
     data3[0] = data1[0]/data2[0];
-    data3[size-1] = data1[size-1]/data2[size-1];       
+    data3[size-1] = data1[size-1]/data2[size-1];
     break;
   default:
     rb_raise(rb_eArgError, "Wrong flag.");
     break;
   }
-  
-  for (i = 1; i < size-1; i+=2) {
+
+  for (i = 1; i < size-1; i += 2) {
     re1 = data1[i];    im1 = data1[i+1];
     re2 = data2[i];    im2 = data2[i+1];
     (*complex_cal)(re1, im1, re2, im2, &data3[i], &data3[i+1]);
   }
-
 }
 
 static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
-        enum FFT_CONV_CORR flag1,
-        enum FFT_CONV_CORR flag2)
+                                  enum FFT_CONV_CORR flag1,
+                                  enum FFT_CONV_CORR flag2)
 {
   double *data1, *data2, *data3 = NULL;
   size_t stride1, stride2, size1, size2;
-#ifdef HAVE_NARRAY_H
-  int naflag1, naflag2, shape;
-#else
   int naflag1, naflag2;
-#endif
   gsl_vector *v = NULL;
   gsl_fft_halfcomplex_wavetable *table = NULL;
   gsl_fft_real_wavetable *rtable = NULL;
@@ -139,10 +134,10 @@ static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
       table = gsl_fft_halfcomplex_wavetable_alloc(size1);
       flagt = 1;
     } else {
-      rb_raise(rb_eTypeError, 
-         "wrong argument type %s "
-         "(FFT::HalfComplex::Wavetable or FFT::Real::Workspace expected)", 
-         rb_class2name(CLASS_OF(argv[2])));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s "
+               "(FFT::HalfComplex::Wavetable or FFT::Real::Workspace expected)",
+               rb_class2name(CLASS_OF(argv[2])));
     }
     break;
   case 1:
@@ -164,7 +159,7 @@ static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
     case RB_GSL_FFT_REAL:
       ary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
-    default:      
+    default:
       ary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
       break;
     }
@@ -172,9 +167,11 @@ static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
     break;
   case 1:
 #ifdef HAVE_NARRAY_H
-    shape = (int) size1;
-    ary = na_make_object(NA_DFLOAT, 1, &shape, cNArray);
-    data3 = NA_PTR_TYPE(ary, double*);
+    {
+      int shape = (int) size1;
+      ary = na_make_object(NA_DFLOAT, 1, &shape, cNArray);
+      data3 = NA_PTR_TYPE(ary, double*);
+    }
 #endif
     break;
   default:
@@ -190,10 +187,10 @@ static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
     data2 = vtmp2->data;
     rtable = gsl_fft_real_wavetable_alloc(size1);
     if (size1 == space->n) {
-      gsl_fft_real_transform(data1, stride1, size1, rtable, space); 
+      gsl_fft_real_transform(data1, stride1, size1, rtable, space);
     } else {
       space2 = gsl_fft_real_workspace_alloc(size1);
-      gsl_fft_real_transform(data1, stride1, size1, rtable, space2); 
+      gsl_fft_real_transform(data1, stride1, size1, rtable, space2);
       /* no freeing space2 here */
     }
     if (size1 != size2) {
@@ -201,14 +198,14 @@ static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
       rtable = gsl_fft_real_wavetable_alloc(size2);
     }
     if (size2 == space->n) {
-      gsl_fft_real_transform(data2, stride2, size2, rtable, space); 
+      gsl_fft_real_transform(data2, stride2, size2, rtable, space);
     } else if (size2 == size1) {
-      gsl_fft_real_transform(data2, stride2, size2, rtable, space2); 
+      gsl_fft_real_transform(data2, stride2, size2, rtable, space2);
       gsl_fft_real_workspace_free(space2);
     } else {
       if (space2) gsl_fft_real_workspace_free(space2);
       space2 = gsl_fft_real_workspace_alloc(size2);
-      gsl_fft_real_transform(data2, stride2, size2, rtable, space2); 
+      gsl_fft_real_transform(data2, stride2, size2, rtable, space2);
       gsl_fft_real_workspace_free(space2);
     }
     gsl_fft_real_wavetable_free(rtable);
@@ -222,14 +219,13 @@ static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
     /* not occur */
     break;
   }
-  
+
   rbgsl_calc_conv_corr_c(data1, data2, data3, size1, table, space, flag2);
 
   if (flag1 == RB_GSL_FFT_REAL) {
     gsl_fft_halfcomplex_inverse(data3, 1, size1, table, space);
 //    for (i = 0; i < size1; i++) data3[i] /= size1;
   }
-  
   if (flagt == 1) gsl_fft_halfcomplex_wavetable_free(table);
   if (flagw == 1) gsl_fft_real_workspace_free(space);
   if (vtmp1) gsl_vector_free(vtmp1);
@@ -240,61 +236,61 @@ static VALUE rb_gsl_fft_conv_corr(int argc, VALUE *argv, VALUE obj,
 /* GSL::Vector#convolve */
 static VALUE rb_gsl_fft_real_convolve(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_fft_conv_corr(argc, argv, obj, 
-          RB_GSL_FFT_REAL,
-          RB_GSL_FFT_CONVOLVE);
+  return rb_gsl_fft_conv_corr(argc, argv, obj,
+                              RB_GSL_FFT_REAL,
+                              RB_GSL_FFT_CONVOLVE);
 }
 /* GSL::Vector#deconvolve */
 static VALUE rb_gsl_fft_real_deconvolve(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_fft_conv_corr(argc, argv, obj, 
-            RB_GSL_FFT_REAL,
-            RB_GSL_FFT_DECONVOLVE);
+  return rb_gsl_fft_conv_corr(argc, argv, obj,
+                              RB_GSL_FFT_REAL,
+                              RB_GSL_FFT_DECONVOLVE);
 }
 
 /* GSL::Vector#correlate */
 static VALUE rb_gsl_fft_real_correlate(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_fft_conv_corr(argc, argv, obj, 
-            RB_GSL_FFT_REAL,
-            RB_GSL_FFT_CORRELATE);
+  return rb_gsl_fft_conv_corr(argc, argv, obj,
+                              RB_GSL_FFT_REAL,
+                              RB_GSL_FFT_CORRELATE);
 }
 
 /* GSL::Vector#halfcomplex_convolve */
 static VALUE rb_gsl_fft_halfcomplex_convolve(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_fft_conv_corr(argc, argv, obj, 
-          RB_GSL_FFT_HALFCOMPLEX,
-          RB_GSL_FFT_CONVOLVE);
+  return rb_gsl_fft_conv_corr(argc, argv, obj,
+                              RB_GSL_FFT_HALFCOMPLEX,
+                              RB_GSL_FFT_CONVOLVE);
 }
 /* GSL::Vector#halfcomplex_deconvolve */
 static VALUE rb_gsl_fft_halfcomplex_deconvolve(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_fft_conv_corr(argc, argv, obj, 
-            RB_GSL_FFT_HALFCOMPLEX,
-            RB_GSL_FFT_DECONVOLVE);
+  return rb_gsl_fft_conv_corr(argc, argv, obj,
+                              RB_GSL_FFT_HALFCOMPLEX,
+                              RB_GSL_FFT_DECONVOLVE);
 }
 /* GSL::Vector#halfcomplex_correlate */
 static VALUE rb_gsl_fft_halfcomplex_correlate(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_fft_conv_corr(argc, argv, obj, 
-            RB_GSL_FFT_HALFCOMPLEX,
-            RB_GSL_FFT_CORRELATE);
+  return rb_gsl_fft_conv_corr(argc, argv, obj,
+                              RB_GSL_FFT_HALFCOMPLEX,
+                              RB_GSL_FFT_CORRELATE);
 }
 
 void Init_gsl_signal(VALUE module)
 {
   rb_define_method(cgsl_vector, "real_convolve", rb_gsl_fft_real_convolve, -1);
-  rb_define_method(cgsl_vector, "real_deconvolve", rb_gsl_fft_real_deconvolve, -1);			     
-  rb_define_method(cgsl_vector, "real_correlate", rb_gsl_fft_real_correlate, -1);	
+  rb_define_method(cgsl_vector, "real_deconvolve", rb_gsl_fft_real_deconvolve, -1);
+  rb_define_method(cgsl_vector, "real_correlate", rb_gsl_fft_real_correlate, -1);
 
   rb_define_alias(cgsl_vector, "convolve", "real_convolve");
   rb_define_alias(cgsl_vector, "deconvolve", "real_deconvolve");
   rb_define_alias(cgsl_vector, "correlate", "real_correlate");
 
   rb_define_method(cgsl_vector, "halfcomplex_convolve", rb_gsl_fft_halfcomplex_convolve, -1);
-  rb_define_method(cgsl_vector, "halfcomplex_deconvolve", rb_gsl_fft_halfcomplex_deconvolve, -1);			     
-  rb_define_method(cgsl_vector, "halfcomplex_correlate", rb_gsl_fft_halfcomplex_correlate, -1);			     
+  rb_define_method(cgsl_vector, "halfcomplex_deconvolve", rb_gsl_fft_halfcomplex_deconvolve, -1);
+  rb_define_method(cgsl_vector, "halfcomplex_correlate", rb_gsl_fft_halfcomplex_correlate, -1);
 
   rb_define_alias(cgsl_vector, "hc_convolve", "halfcomplex_convolve");
   rb_define_alias(cgsl_vector, "hc_deconvolve", "halfcomplex_deconvolve");
diff --git a/ext/gsl/siman.c b/ext/gsl_native/siman.c
similarity index 93%
rename from ext/gsl/siman.c
rename to ext/gsl_native/siman.c
index 59135ad..5fcbc0b 100644
--- a/ext/gsl/siman.c
+++ b/ext/gsl_native/siman.c
@@ -331,7 +331,7 @@ static siman_metric* siman_metric_alloc()
   se = ALLOC(siman_metric);
   if (se == NULL) rb_raise(rb_eRuntimeError, "ALLOC failed");
   se->siman_metric_t = &rb_gsl_siman_metric_t;
-   return se;
+  return se;
 }
 
 static void siman_metric_mark(siman_metric *se)
@@ -419,22 +419,22 @@ static VALUE rb_gsl_siman_params_set(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 7:
     params->t_min = NUM2DBL(argv[6]);
-    /* no break */
+  /* no break */
   case 6:
     params->mu_t = NUM2DBL(argv[5]);
-    /* no break */
+  /* no break */
   case 5:
     params->t_initial = NUM2DBL(argv[4]);
-    /* no break */
+  /* no break */
   case 4:
     params->k = NUM2DBL(argv[3]);
-    /* no break */
+  /* no break */
   case 3:
     params->step_size = NUM2DBL(argv[2]);
-    /* no break */
+  /* no break */
   case 2:
     params->iters_fixed_T = NUM2INT(argv[1]);
-    /* no break */
+  /* no break */
   case 1:
     params->n_tries = NUM2INT(argv[0]);
   }
@@ -551,16 +551,16 @@ static VALUE rb_gsl_siman_params_params(VALUE obj)
   gsl_siman_params_t *params = NULL;
   Data_Get_Struct(obj, gsl_siman_params_t, params);
   return rb_ary_new3(7, INT2FIX(params->n_tries), INT2FIX(params->iters_fixed_T),
-		     rb_float_new(params->step_size), rb_float_new(params->k),
-		     rb_float_new(params->t_initial), rb_float_new(params->mu_t),
-		     rb_float_new(params->t_min));
+                     rb_float_new(params->step_size), rb_float_new(params->k),
+                     rb_float_new(params->t_initial), rb_float_new(params->mu_t),
+                     rb_float_new(params->t_min));
 }
 
 /***** solver *****/
 static VALUE rb_gsl_siman_solver_solve(VALUE obj, VALUE rng,
-				       VALUE vx0p, VALUE vefunc,
-				       VALUE vstep, VALUE vmetric, VALUE vprint,
-				       VALUE vparams)
+                                       VALUE vx0p, VALUE vefunc,
+                                       VALUE vstep, VALUE vmetric, VALUE vprint,
+                                       VALUE vparams)
 {
   gsl_rng *r = NULL;
   siman_solver *ss = NULL;
@@ -587,17 +587,16 @@ static VALUE rb_gsl_siman_solver_solve(VALUE obj, VALUE rng,
   }
   if (!rb_obj_is_kind_of(rng, cgsl_rng))
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Rng expected)",
-	     rb_class2name(CLASS_OF(rng)));
+             rb_class2name(CLASS_OF(rng)));
   if (!rb_obj_is_kind_of(vefunc, cgsl_siman_Efunc))
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Siman::Efunc expected)",
-	     rb_class2name(CLASS_OF(vefunc)));
+             rb_class2name(CLASS_OF(vefunc)));
   if (!rb_obj_is_kind_of(vstep, cgsl_siman_step))
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Siman::Step expected)",
-	     rb_class2name(CLASS_OF(vstep)));
+             rb_class2name(CLASS_OF(vstep)));
   if (!rb_obj_is_kind_of(vmetric, cgsl_siman_metric))
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Siman::Metric expected)",
-	     rb_class2name(CLASS_OF(vmetric)));
-
+             rb_class2name(CLASS_OF(vmetric)));
   Data_Get_Struct(rng, gsl_rng, r);
   Data_Get_Struct(vefunc, siman_Efunc, efunc);
   Data_Get_Struct(vstep, siman_step, step);
@@ -607,14 +606,13 @@ static VALUE rb_gsl_siman_solver_solve(VALUE obj, VALUE rng,
   } else {
     if (!rb_obj_is_kind_of(vprint, cgsl_siman_print))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Siman::Print expected)",
-	       rb_class2name(CLASS_OF(vprint)));
+               rb_class2name(CLASS_OF(vprint)));
     Data_Get_Struct(vprint, siman_print, print);
     ss->proc_print   = print->proc;
   }
   if (!rb_obj_is_kind_of(vparams, cgsl_siman_params))
     rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Siman::Params expected)",
-	     rb_class2name(CLASS_OF(vparams)));
-
+             rb_class2name(CLASS_OF(vparams)));
   Data_Get_Struct(vparams, gsl_siman_params_t, params);
 
   ss->proc_efunc   = efunc->proc;
@@ -624,30 +622,28 @@ static VALUE rb_gsl_siman_solver_solve(VALUE obj, VALUE rng,
   gsl_vector_memcpy(ss->vx, vtmp);
 
   if (NIL_P(vprint)) {
-    gsl_siman_solve(r, ss, rb_gsl_siman_Efunc_t, 
-		    rb_gsl_siman_step_t, 
-		    rb_gsl_siman_metric_t, 
-		    NULL,
-		    rb_gsl_siman_copy_t, 
-		    rb_gsl_siman_copy_construct_t,
-		    rb_gsl_siman_destroy_t, 0,
-		    *params);
+    gsl_siman_solve(r, ss, rb_gsl_siman_Efunc_t,
+                    rb_gsl_siman_step_t,
+                    rb_gsl_siman_metric_t,
+                    NULL,
+                    rb_gsl_siman_copy_t,
+                    rb_gsl_siman_copy_construct_t,
+                    rb_gsl_siman_destroy_t, 0,
+                    *params);
 
   } else {
-    gsl_siman_solve(r, ss, rb_gsl_siman_Efunc_t, 
-		    rb_gsl_siman_step_t, 
-		    rb_gsl_siman_metric_t, 
-		    rb_gsl_siman_print_t, 
-		    rb_gsl_siman_copy_t, 
-		    rb_gsl_siman_copy_construct_t,
-		    rb_gsl_siman_destroy_t, 0,
-		    *params);
+    gsl_siman_solve(r, ss, rb_gsl_siman_Efunc_t,
+                    rb_gsl_siman_step_t,
+                    rb_gsl_siman_metric_t,
+                    rb_gsl_siman_print_t,
+                    rb_gsl_siman_copy_t,
+                    rb_gsl_siman_copy_construct_t,
+                    rb_gsl_siman_destroy_t, 0,
+                    *params);
   }
-
   gsl_vector_memcpy(vtmp, ss->vx);
 
   if (flag == 1) gsl_siman_solver_free(ss);
-
   return obj;
 }
 
@@ -681,7 +677,7 @@ void Init_gsl_siman(VALUE module)
   rb_define_singleton_method(cgsl_siman_metric, "alloc", rb_gsl_siman_metric_new, -1);
   rb_define_method(cgsl_siman_metric, "set", rb_gsl_siman_metric_set, -1);
   rb_define_alias(cgsl_siman_metric, "set_proc", "set");
-  
+
   /***** params *****/
   rb_define_singleton_method(cgsl_siman_params, "alloc", rb_gsl_siman_params_new, -1);
   rb_define_method(cgsl_siman_params, "set", rb_gsl_siman_params_set, -1);
diff --git a/ext/gsl/sort.c b/ext/gsl_native/sort.c
similarity index 97%
rename from ext/gsl/sort.c
rename to ext/gsl_native/sort.c
index 13ef470..a1acd78 100644
--- a/ext/gsl/sort.c
+++ b/ext/gsl_native/sort.c
@@ -31,9 +31,9 @@ int rb_gsl_comparison_complex(const void *aa, const void *bb)
   gsl_complex *a = NULL, *b = NULL;
   a = (gsl_complex *) aa;
   b = (gsl_complex *) bb;
-  return FIX2INT(rb_funcall(rb_block_proc(), RBGSL_ID_call, 2, 
-			    Data_Wrap_Struct(cgsl_complex, 0, NULL, a),
-			    Data_Wrap_Struct(cgsl_complex, 0, NULL, b)));
+  return FIX2INT(rb_funcall(rb_block_proc(), RBGSL_ID_call, 2,
+                            Data_Wrap_Struct(cgsl_complex, 0, NULL, a),
+                            Data_Wrap_Struct(cgsl_complex, 0, NULL, b)));
 }
 
 static VALUE rb_gsl_heapsort_vector(VALUE obj)
@@ -141,7 +141,6 @@ static VALUE rb_gsl_heapsort_index(VALUE obj, VALUE vv)
 /*****/
 
 #ifdef HAVE_NARRAY_H
-#include "narray.h"
 static VALUE rb_gsl_sort_narray(VALUE obj)
 {
   struct NARRAY *na;
diff --git a/ext/gsl/spline.c b/ext/gsl_native/spline.c
similarity index 90%
rename from ext/gsl/spline.c
rename to ext/gsl_native/spline.c
index de54e75..76222de 100644
--- a/ext/gsl/spline.c
+++ b/ext/gsl_native/spline.c
@@ -33,10 +33,10 @@ static VALUE rb_gsl_spline_new(int argc, VALUE *argv, VALUE klass)
       break;
     default:
       if (ptrx == NULL) {
-	ptrx = get_vector_ptr(argv[i], &stride, &sizex);
+        ptrx = get_vector_ptr(argv[i], &stride, &sizex);
       } else {
-	ptry = get_vector_ptr(argv[i], &stride, &sizey);
-	size = GSL_MIN_INT(sizex, sizey);
+        ptry = get_vector_ptr(argv[i], &stride, &sizey);
+        size = GSL_MIN_INT(sizex, sizey);
       }
       break;
     }
@@ -65,9 +65,6 @@ static VALUE rb_gsl_spline_init(VALUE obj, VALUE xxa, VALUE yya)
   size_t i, size;
   int flagx = 0, flagy = 0;
   double *ptr1 = NULL, *ptr2 = NULL;
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *nax = NULL, *nay = NULL;
-#endif
   Data_Get_Struct(obj, rb_gsl_spline, sp);
   p = sp->s;
   if (TYPE(xxa) == T_ARRAY) {
@@ -83,9 +80,10 @@ static VALUE rb_gsl_spline_init(VALUE obj, VALUE xxa, VALUE yya)
     ptr1 = xa->data;
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(xxa)) {
-      GetNArray(xxa, nax);
-      size = nax->total;
-      ptr1 = (double *) nax->ptr;
+    struct NARRAY *nax = NULL;
+    GetNArray(xxa, nax);
+    size = nax->total;
+    ptr1 = (double *) nax->ptr;
 #endif
   } else {
     rb_raise(rb_eTypeError, "not a vector");
@@ -97,8 +95,9 @@ static VALUE rb_gsl_spline_init(VALUE obj, VALUE xxa, VALUE yya)
     flagy = 1;
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(yya)) {
-      GetNArray(yya, nay);
-      ptr2 = (double *) nay->ptr;
+    struct NARRAY *nay = NULL;
+    GetNArray(yya, nay);
+    ptr2 = (double *) nay->ptr;
 #endif
   } else if (VECTOR_P(yya)) {
     Data_Get_Struct(yya, gsl_vector, ya);
@@ -120,8 +119,8 @@ static VALUE rb_gsl_spline_accel(VALUE obj)
 }
 
 static VALUE rb_gsl_spline_evaluate(VALUE obj, VALUE xx,
-				    double (*eval)(const gsl_spline *, double, 
-						   gsl_interp_accel *))
+                                    double (*eval)(const gsl_spline *, double,
+                                                   gsl_interp_accel *))
 {
   rb_gsl_spline *rgs = NULL;
   gsl_vector *v = NULL, *vnew = NULL;
@@ -129,10 +128,6 @@ static VALUE rb_gsl_spline_evaluate(VALUE obj, VALUE xx,
   VALUE ary, x;
   double val;
   size_t n, i, j;
-#ifdef HAVE_NARRAY_H
-  double *ptr1 = NULL, *ptr2 = NULL;
-  struct NARRAY *na = NULL;
-#endif
   Data_Get_Struct(obj, rb_gsl_spline, rgs);
   if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
   switch (TYPE(xx)) {
@@ -155,13 +150,15 @@ static VALUE rb_gsl_spline_evaluate(VALUE obj, VALUE xx,
   default:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(xx)) {
+      double *ptr1 = NULL, *ptr2 = NULL;
+      struct NARRAY *na = NULL;
       GetNArray(xx, na);
       ptr1 = (double *) na->ptr;
       n = na->total;
       ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
       ptr2 = NA_PTR_TYPE(ary, double*);
-      for (i = 0; i < n; i++) 
-	ptr2[i] = (*eval)(rgs->s, ptr1[i], rgs->a);
+      for (i = 0; i < n; i++)
+        ptr2[i] = (*eval)(rgs->s, ptr1[i], rgs->a);
       return ary;
     }
 #endif
@@ -169,18 +166,18 @@ static VALUE rb_gsl_spline_evaluate(VALUE obj, VALUE xx,
       Data_Get_Struct(xx, gsl_vector, v);
       vnew = gsl_vector_alloc(v->size);
       for (i = 0; i < v->size; i++) {
-	val = (*eval)(rgs->s, gsl_vector_get(v, i), rgs->a);
-	gsl_vector_set(vnew, i, val);
+        val = (*eval)(rgs->s, gsl_vector_get(v, i), rgs->a);
+        gsl_vector_set(vnew, i, val);
       }
       return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
     } else if (MATRIX_P(xx)) {
       Data_Get_Struct(xx, gsl_matrix, m);
       mnew = gsl_matrix_alloc(m->size1, m->size2);
       for (i = 0; i < m->size1; i++) {
-	for (j = 0; j < m->size2; j++) {
-	  val = (*eval)(rgs->s, gsl_matrix_get(m, i, j), rgs->a);
-	  gsl_matrix_set(mnew, i, j, val);
-	}
+        for (j = 0; j < m->size2; j++) {
+          val = (*eval)(rgs->s, gsl_matrix_get(m, i, j), rgs->a);
+          gsl_matrix_set(mnew, i, j, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
     } else {
@@ -270,7 +267,7 @@ static VALUE rb_gsl_spline_eval_deriv_e(VALUE obj, VALUE xx)
   default:
     return rb_float_new(val);
     break;
-  } 
+  }
   return Qnil;
 }
 
@@ -289,7 +286,7 @@ static VALUE rb_gsl_spline_eval_deriv2_e(VALUE obj, VALUE xx)
   default:
     return rb_float_new(val);
     break;
-  } 
+  }
   return Qnil;
 }
 
@@ -308,7 +305,7 @@ static VALUE rb_gsl_spline_eval_integ_e(VALUE obj, VALUE a, VALUE b)
   default:
     return rb_float_new(val);
     break;
-  } 
+  }
   return Qnil;
 }
 
@@ -326,7 +323,6 @@ static VALUE rb_gsl_spline_info(VALUE obj)
   return rb_str_new2(buf);
 }
 
-#ifdef GSL_1_8_LATER
 static VALUE rb_gsl_spline_name(VALUE obj)
 {
   rb_gsl_spline *p = NULL;
@@ -340,17 +336,6 @@ static VALUE rb_gsl_spline_min_size(VALUE obj)
   return UINT2NUM(gsl_spline_min_size(sp->s));
 }
 
-#else
-
-static VALUE rb_gsl_spline_name(VALUE obj)
-{
-  rb_gsl_spline *sp = NULL;
-  Data_Get_Struct(obj, rb_gsl_spline, sp);
-  return rb_str_new2(gsl_interp_name(sp->s->interp));
-}
-
-#endif
-
 void Init_gsl_spline(VALUE module)
 {
   VALUE cgsl_spline;
@@ -388,8 +373,5 @@ void Init_gsl_spline(VALUE module)
 
   rb_define_method(cgsl_spline, "info", rb_gsl_spline_info, 0);
 
-#ifdef GSL_1_8_LATER
   rb_define_method(cgsl_spline, "min_size", rb_gsl_spline_min_size, 0);
-#endif
-
 }
diff --git a/ext/gsl/stats.c b/ext/gsl_native/stats.c
similarity index 83%
rename from ext/gsl/stats.c
rename to ext/gsl_native/stats.c
index abf9adc..35d5a58 100644
--- a/ext/gsl/stats.c
+++ b/ext/gsl_native/stats.c
@@ -11,12 +11,9 @@
 
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_statistics.h"
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
-static double* get_vector_stats2(int argc, VALUE *argv, VALUE obj, 
-				 size_t *stride, size_t *size)
+static double* get_vector_stats2(int argc, VALUE *argv, VALUE obj,
+                                 size_t *stride, size_t *size)
 {
   double *v = NULL;
   switch (TYPE(obj)) {
@@ -32,7 +29,7 @@ static double* get_vector_stats2(int argc, VALUE *argv, VALUE obj,
 }
 
 static VALUE rb_gsl_stats_XXX(int argc, VALUE *argv, VALUE obj,
-			      double (*f)(const double*, size_t, size_t))
+                              double (*f)(const double*, size_t, size_t))
 {
   size_t stride, size;
   double *data = NULL;
@@ -40,8 +37,8 @@ static VALUE rb_gsl_stats_XXX(int argc, VALUE *argv, VALUE obj,
   return rb_float_new((*f)(data, stride, size));
 }
 
-static VALUE rb_gsl_stats_XXX1(int argc, VALUE *argv, VALUE obj, 
-			      double (*f)(const double*, size_t, size_t, double))
+static VALUE rb_gsl_stats_XXX1(int argc, VALUE *argv, VALUE obj,
+                               double (*f)(const double*, size_t, size_t, double))
 {
   size_t stride, size;
   double *data = NULL;
@@ -50,9 +47,9 @@ static VALUE rb_gsl_stats_XXX1(int argc, VALUE *argv, VALUE obj,
   return rb_float_new((*f)(data, stride, size, NUM2DBL(argv[argc-1])));
 }
 
-static VALUE rb_gsl_stats_XXX2(int argc, VALUE *argv, VALUE obj, 
-			       double (*f)(const double*, size_t, size_t),
-			       double (*fm)(const double*, size_t, size_t, double, double))
+static VALUE rb_gsl_stats_XXX2(int argc, VALUE *argv, VALUE obj,
+                               double (*f)(const double*, size_t, size_t),
+                               double (*fm)(const double*, size_t, size_t, double, double))
 {
   double x, a, b, *data = NULL;
   size_t stride, size;
@@ -69,8 +66,8 @@ static VALUE rb_gsl_stats_XXX2(int argc, VALUE *argv, VALUE obj,
       x = (*f)(data, stride, size);
       break;
     default:
-      rb_raise(rb_eArgError, 
-	       "wrong number of arguments (%d for 1 or 2)", argc);
+      rb_raise(rb_eArgError,
+               "wrong number of arguments (%d for 1 or 2)", argc);
       break;
     }
     break;
@@ -86,8 +83,8 @@ static VALUE rb_gsl_stats_XXX2(int argc, VALUE *argv, VALUE obj,
       x = (*fm)(data, stride, size, a, b);
       break;
     default:
-      rb_raise(rb_eArgError, 
-	       "wrong number of arguments (%d for 0 or 1)", argc);
+      rb_raise(rb_eArgError,
+               "wrong number of arguments (%d for 0 or 1)", argc);
       break;
     }
     break;
@@ -101,8 +98,8 @@ static VALUE rb_gsl_stats_mean(int argc, VALUE *argv, VALUE obj)
 }
 
 static VALUE rb_gsl_stats_XXX_m(int argc, VALUE *argv, VALUE obj,
-				double (*f)(const double*, size_t, size_t),
-				double (*fm)(const double*, size_t, size_t, double))
+                                double (*f)(const double*, size_t, size_t),
+                                double (*fm)(const double*, size_t, size_t, double))
 {
   double x, mean, *data = NULL;
   size_t stride, size;
@@ -119,8 +116,8 @@ static VALUE rb_gsl_stats_XXX_m(int argc, VALUE *argv, VALUE obj,
       x = (*f)(data, stride, size);
       break;
     default:
-      rb_raise(rb_eArgError, 
-	       "wrong number of arguments (%d for 1 or 2)", argc);
+      rb_raise(rb_eArgError,
+               "wrong number of arguments (%d for 1 or 2)", argc);
       break;
     }
     break;
@@ -136,8 +133,8 @@ static VALUE rb_gsl_stats_XXX_m(int argc, VALUE *argv, VALUE obj,
       x = (*fm)(data, stride, size, mean);
       break;
     default:
-      rb_raise(rb_eArgError, 
-	       "wrong number of arguments (%d for 0 or 1)", argc);
+      rb_raise(rb_eArgError,
+               "wrong number of arguments (%d for 0 or 1)", argc);
       break;
     }
     break;
@@ -148,70 +145,68 @@ static VALUE rb_gsl_stats_XXX_m(int argc, VALUE *argv, VALUE obj,
 static VALUE rb_gsl_stats_variance_m(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_stats_XXX_m(argc, argv, obj,
-			    gsl_stats_variance, gsl_stats_variance_m);
+                            gsl_stats_variance, gsl_stats_variance_m);
 }
 
 static VALUE rb_gsl_stats_sd_m(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_stats_XXX_m(argc, argv, obj,
-			    gsl_stats_sd, gsl_stats_sd_m);
+                            gsl_stats_sd, gsl_stats_sd_m);
 }
 
-#ifdef GSL_1_11_LATER
 static VALUE rb_gsl_stats_tss_m(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_stats_XXX_m(argc, argv, obj,
-			    gsl_stats_tss, gsl_stats_tss_m);
+                            gsl_stats_tss, gsl_stats_tss_m);
 }
-#endif
 
-static VALUE rb_gsl_stats_variance_with_fixed_mean(int argc, VALUE *argv, 
-						   VALUE obj)
+static VALUE rb_gsl_stats_variance_with_fixed_mean(int argc, VALUE *argv,
+                                                   VALUE obj)
 {
   return rb_gsl_stats_XXX1(argc, argv, obj,
-			   gsl_stats_variance_with_fixed_mean);
+                           gsl_stats_variance_with_fixed_mean);
 }
 
-static VALUE rb_gsl_stats_sd_with_fixed_mean(int argc, VALUE *argv, 
-						   VALUE obj)
+static VALUE rb_gsl_stats_sd_with_fixed_mean(int argc, VALUE *argv,
+                                             VALUE obj)
 {
   return rb_gsl_stats_XXX1(argc, argv, obj,
-			   gsl_stats_sd_with_fixed_mean);
+                           gsl_stats_sd_with_fixed_mean);
 }
 
 static VALUE rb_gsl_stats_absdev_m(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_stats_XXX_m(argc, argv, obj,
-			    gsl_stats_absdev, gsl_stats_absdev_m);
+                            gsl_stats_absdev, gsl_stats_absdev_m);
 }
 
-static VALUE rb_gsl_stats_skew(int argc, VALUE *argv, 
-			       VALUE obj)
+static VALUE rb_gsl_stats_skew(int argc, VALUE *argv,
+                               VALUE obj)
 {
   return rb_gsl_stats_XXX2(argc, argv, obj,
-			   gsl_stats_skew,
-			   gsl_stats_skew_m_sd);
+                           gsl_stats_skew,
+                           gsl_stats_skew_m_sd);
 }
 
-static VALUE rb_gsl_stats_kurtosis(int argc, VALUE *argv, 
-						   VALUE obj)
+static VALUE rb_gsl_stats_kurtosis(int argc, VALUE *argv,
+                                   VALUE obj)
 {
   return rb_gsl_stats_XXX2(argc, argv, obj,
-			   gsl_stats_kurtosis,
-			   gsl_stats_kurtosis_m_sd);
+                           gsl_stats_kurtosis,
+                           gsl_stats_kurtosis_m_sd);
 }
 
 static VALUE rb_gsl_stats_lag1_autocorrelation(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_stats_XXX_m(argc, argv, obj,
-			    gsl_stats_lag1_autocorrelation, gsl_stats_lag1_autocorrelation_m);
+                            gsl_stats_lag1_autocorrelation, gsl_stats_lag1_autocorrelation_m);
 }
 
 /****************************/
 
-static void get_vector_stats3(int argc, VALUE *argv, VALUE obj, 
-			      double **w, size_t *stridew, size_t *sizew,
-			      double **x, size_t *stridex, size_t *sizex)
+static void get_vector_stats3(int argc, VALUE *argv, VALUE obj,
+                              double **w, size_t *stridew, size_t *sizew,
+                              double **x, size_t *stridex, size_t *sizex)
 {
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
@@ -228,8 +223,8 @@ static void get_vector_stats3(int argc, VALUE *argv, VALUE obj,
 }
 
 static VALUE rb_gsl_stats_wXXX(int argc, VALUE *argv, VALUE obj,
-			       double (*f)(const double*, size_t, const double*, 
-					   size_t, size_t))
+                               double (*f)(const double*, size_t, const double*,
+                                           size_t, size_t))
 {
   double *w, *x;
   double mean;
@@ -240,8 +235,8 @@ static VALUE rb_gsl_stats_wXXX(int argc, VALUE *argv, VALUE obj,
 }
 
 static VALUE rb_gsl_stats_wXXX_m(int argc, VALUE *argv, VALUE obj,
-			       double (*f)(const double*, size_t, const double*, 
-					   size_t, size_t, double))
+                                 double (*f)(const double*, size_t, const double*,
+                                             size_t, size_t, double))
 {
   double *w, *x;
   double mean;
@@ -314,7 +309,7 @@ static VALUE rb_gsl_stats_wskew_m_sd(VALUE obj, VALUE ww, VALUE wm, VALUE wsd)
   x = get_vector_ptr(obj, &stridex, &sizex);
   w = get_vector_ptr(ww, &stridew, &sizew);
   skew_m = gsl_stats_wskew_m_sd(w, stridew, x, stridex, sizex, NUM2DBL(wm),
-				NUM2DBL(wsd));
+                                NUM2DBL(wsd));
   return rb_float_new(skew_m);
 }
 
@@ -326,7 +321,7 @@ static VALUE rb_gsl_stats_wkurtosis_m_sd(VALUE obj, VALUE ww, VALUE wm, VALUE ws
   x = get_vector_ptr(obj, &stridex, &sizex);
   w = get_vector_ptr(ww, &stridew, &sizew);
   kurtosis_m = gsl_stats_wkurtosis_m_sd(w, stridew, x, stridex, sizex, NUM2DBL(wm),
-					NUM2DBL(wsd));
+                                        NUM2DBL(wsd));
   return rb_float_new(kurtosis_m);
 }
 
@@ -409,7 +404,7 @@ static VALUE rb_gsl_stats_median(int argc, VALUE *argv, VALUE obj)
 static VALUE rb_gsl_stats_quantile_from_sorted_data(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_stats_XXX1(argc, argv, obj,
-			   gsl_stats_quantile_from_sorted_data);
+                           gsl_stats_quantile_from_sorted_data);
   /*  size_t stride, size;
   double quantile, *data = NULL;
   data = get_vector_ptr(obj, &stride, &size);
@@ -437,21 +432,20 @@ static VALUE rb_gsl_stats_covariance2(VALUE obj, VALUE vv1, VALUE vv2)
   data1 = get_vector_ptr(vv1, &stride1, &size);
   data2 = get_vector_ptr(vv2, &stride2, &size);
   return rb_float_new(gsl_stats_covariance(data1, stride1, data2,
-					   stride2, size));
+                                           stride2, size));
 }
 
 static VALUE rb_gsl_stats_covariance_m2(VALUE obj, VALUE vv1, VALUE vv2,
-					VALUE m1, VALUE m2)
+                                        VALUE m1, VALUE m2)
 {
   double *data1, *data2;
   size_t stride1, stride2, size;
   data1 = get_vector_ptr(vv1, &stride1, &size);
   data2 = get_vector_ptr(vv2, &stride2, &size);
   return rb_float_new(gsl_stats_covariance_m(data1, stride1, data2,
-					   stride2, size, NUM2DBL(m1), NUM2DBL(m2)));
+                                             stride2, size, NUM2DBL(m1), NUM2DBL(m2)));
 }
 
-#ifdef GSL_1_10_LATER
 static VALUE rb_gsl_stats_correlation(VALUE obj, VALUE vv1, VALUE vv2)
 {
   double *data1, *data2;
@@ -459,7 +453,7 @@ static VALUE rb_gsl_stats_correlation(VALUE obj, VALUE vv1, VALUE vv2)
   data1 = get_vector_ptr(vv1, &stride1, &size);
   data2 = get_vector_ptr(vv2, &stride2, &size);
   return rb_float_new(gsl_stats_correlation(data1, stride1, data2,
-					   stride2, size));
+                                            stride2, size));
 }
 static VALUE rb_gsl_stats_pvariance(VALUE obj, VALUE vv1, VALUE vv2)
 {
@@ -468,7 +462,7 @@ static VALUE rb_gsl_stats_pvariance(VALUE obj, VALUE vv1, VALUE vv2)
   data1 = get_vector_ptr(vv1, &stride1, &size1);
   data2 = get_vector_ptr(vv2, &stride2, &size2);
   return rb_float_new(gsl_stats_pvariance(data1, stride1, size1, data2,
-					   stride2, size2));
+                                          stride2, size2));
 }
 static VALUE rb_gsl_stats_ttest(VALUE obj, VALUE vv1, VALUE vv2)
 {
@@ -477,9 +471,8 @@ static VALUE rb_gsl_stats_ttest(VALUE obj, VALUE vv1, VALUE vv2)
   data1 = get_vector_ptr(vv1, &stride1, &size1);
   data2 = get_vector_ptr(vv2, &stride2, &size2);
   return rb_float_new(gsl_stats_ttest(data1, stride1, size1, data2,
-					   stride2, size2));
+                                      stride2, size2));
 }
-#endif
 
 static VALUE rb_gsl_stats_wmean2(VALUE obj, VALUE ww, VALUE dd)
 {
@@ -535,8 +528,8 @@ static VALUE rb_gsl_stats_wsd_m2(VALUE obj, VALUE ww, VALUE dd, VALUE mm)
   return rb_float_new(wsd);
 }
 
-static VALUE rb_gsl_stats_wvariance_with_fixed_mean2(VALUE obj, VALUE ww, VALUE dd, 
-						     VALUE mm)
+static VALUE rb_gsl_stats_wvariance_with_fixed_mean2(VALUE obj, VALUE ww, VALUE dd,
+                                                     VALUE mm)
 {
   double wvariance, m;
   double *dataw = NULL, *data = NULL;
@@ -544,14 +537,14 @@ static VALUE rb_gsl_stats_wvariance_with_fixed_mean2(VALUE obj, VALUE ww, VALUE
   dataw = get_vector_ptr(ww, &stridew, &size);
   data = get_vector_ptr(dd, &strided, &size);
   m = NUM2DBL(mm);
-  wvariance = gsl_stats_wvariance_with_fixed_mean(dataw, stridew, 
-						  data, strided, size, m);
+  wvariance = gsl_stats_wvariance_with_fixed_mean(dataw, stridew,
+                                                  data, strided, size, m);
 
   return rb_float_new(wvariance);
 }
 
-static VALUE rb_gsl_stats_wsd_with_fixed_mean2(VALUE obj, VALUE ww, VALUE dd, 
-						     VALUE mm)
+static VALUE rb_gsl_stats_wsd_with_fixed_mean2(VALUE obj, VALUE ww, VALUE dd,
+                                               VALUE mm)
 {
   double wsd, m;
   double *dataw = NULL, *data = NULL;
@@ -651,10 +644,8 @@ void Init_gsl_stats(VALUE module)
 
   rb_define_singleton_method(mgsl_stats, "sd", rb_gsl_stats_sd_m, -1);
   rb_define_singleton_method(mgsl_stats, "sd_m", rb_gsl_stats_sd_m, -1);
-#ifdef GSL_1_11_LATER
   rb_define_singleton_method(mgsl_stats, "tss", rb_gsl_stats_tss_m, -1);
   rb_define_singleton_method(mgsl_stats, "tss_m", rb_gsl_stats_tss_m, -1);
-#endif
   rb_define_singleton_method(mgsl_stats, "sdev", rb_gsl_stats_sd_m, -1);
   rb_define_singleton_method(mgsl_stats, "sigma", rb_gsl_stats_sd_m, -1);
   rb_define_method(cgsl_vector, "stats_sd_m", rb_gsl_stats_sd_m, -1);
@@ -663,26 +654,24 @@ void Init_gsl_stats(VALUE module)
   rb_define_alias(cgsl_vector, "sd", "stats_sd_m");
   rb_define_alias(cgsl_vector, "sigma", "stats_sd_m");
   rb_define_alias(cgsl_vector, "sdev", "stats_sd_m");
-#ifdef GSL_1_11_LATER
   rb_define_method(cgsl_vector, "stats_tss_m", rb_gsl_stats_tss_m, -1);
   rb_define_alias(cgsl_vector, "stats_tss", "stats_tss_m");
   rb_define_alias(cgsl_vector, "tss_m", "stats_tss_m");
   rb_define_alias(cgsl_vector, "tss", "stats_tss_m");
-#endif
-
-  rb_define_singleton_method(mgsl_stats, "variance_with_fixed_mean", 
-			     rb_gsl_stats_variance_with_fixed_mean, -1);
-  rb_define_method(cgsl_vector, "stats_variance_with_fixed_mean", 
-		   rb_gsl_stats_variance_with_fixed_mean, -1);
-  rb_define_alias(cgsl_vector, "variance_with_fixed_mean", 
-		  "stats_variance_with_fixed_mean");
-
-  rb_define_singleton_method(mgsl_stats, "sd_with_fixed_mean", 
-			     rb_gsl_stats_sd_with_fixed_mean, -1);
-  rb_define_method(cgsl_vector, "stats_sd_with_fixed_mean", 
-		   rb_gsl_stats_sd_with_fixed_mean, -1);
-  rb_define_alias(cgsl_vector, "sd_with_fixed_mean", 
-		  "stats_sd_with_fixed_mean");
+
+  rb_define_singleton_method(mgsl_stats, "variance_with_fixed_mean",
+                             rb_gsl_stats_variance_with_fixed_mean, -1);
+  rb_define_method(cgsl_vector, "stats_variance_with_fixed_mean",
+                   rb_gsl_stats_variance_with_fixed_mean, -1);
+  rb_define_alias(cgsl_vector, "variance_with_fixed_mean",
+                  "stats_variance_with_fixed_mean");
+
+  rb_define_singleton_method(mgsl_stats, "sd_with_fixed_mean",
+                             rb_gsl_stats_sd_with_fixed_mean, -1);
+  rb_define_method(cgsl_vector, "stats_sd_with_fixed_mean",
+                   rb_gsl_stats_sd_with_fixed_mean, -1);
+  rb_define_alias(cgsl_vector, "sd_with_fixed_mean",
+                  "stats_sd_with_fixed_mean");
 
   rb_define_singleton_method(mgsl_stats, "absdev", rb_gsl_stats_absdev_m, -1);
   rb_define_singleton_method(mgsl_stats, "absdev_m", rb_gsl_stats_absdev_m, -1);
@@ -710,24 +699,22 @@ void Init_gsl_stats(VALUE module)
 
   rb_define_singleton_method(mgsl_stats, "covariance", rb_gsl_stats_covariance2, 2);
   rb_define_singleton_method(mgsl_stats, "covariance_m", rb_gsl_stats_covariance_m2, 4);
-  
-#ifdef GSL_1_10_LATER
-  rb_define_singleton_method(mgsl_stats, "correlation", rb_gsl_stats_correlation, 2);  
-  rb_define_singleton_method(mgsl_stats, "pvariance", rb_gsl_stats_pvariance, 2);    
-  rb_define_singleton_method(mgsl_stats, "ttest", rb_gsl_stats_ttest, 2);      
-#endif
+
+  rb_define_singleton_method(mgsl_stats, "correlation", rb_gsl_stats_correlation, 2);
+  rb_define_singleton_method(mgsl_stats, "pvariance", rb_gsl_stats_pvariance, 2);
+  rb_define_singleton_method(mgsl_stats, "ttest", rb_gsl_stats_ttest, 2);
 
   /*****/
-  
+
   rb_define_singleton_method(mgsl_stats, "wmean", rb_gsl_stats_wmean2, -1);
   rb_define_singleton_method(mgsl_stats, "wvariance", rb_gsl_stats_wvariance2, -1);
   rb_define_singleton_method(mgsl_stats, "wvariance_m", rb_gsl_stats_wvariance_m2, -1);
   rb_define_singleton_method(mgsl_stats, "wsd", rb_gsl_stats_wsd2, -1);
   rb_define_singleton_method(mgsl_stats, "wsd_m", rb_gsl_stats_wsd_m2, -1);
-  rb_define_singleton_method(mgsl_stats, "wvariance_with_fixed_mean", 
-			     rb_gsl_stats_wvariance_with_fixed_mean2, -1);
-  rb_define_singleton_method(mgsl_stats, "wsd_with_fixed_mean", 
-			     rb_gsl_stats_wsd_with_fixed_mean2, -1);
+  rb_define_singleton_method(mgsl_stats, "wvariance_with_fixed_mean",
+                             rb_gsl_stats_wvariance_with_fixed_mean2, -1);
+  rb_define_singleton_method(mgsl_stats, "wsd_with_fixed_mean",
+                             rb_gsl_stats_wsd_with_fixed_mean2, -1);
   rb_define_singleton_method(mgsl_stats, "wabsdev", rb_gsl_stats_wabsdev2, -1);
   rb_define_singleton_method(mgsl_stats, "wabsdev_m", rb_gsl_stats_wabsdev_m2, -1);
   rb_define_singleton_method(mgsl_stats, "wskew", rb_gsl_stats_wskew2, -1);
@@ -747,12 +734,12 @@ void Init_gsl_stats(VALUE module)
   rb_define_alias(cgsl_vector, "wsd", "stats_wsd");
   rb_define_method(cgsl_vector, "stats_wsd_m", rb_gsl_stats_wsd_m, -1);
   rb_define_alias(cgsl_vector, "wsd_m", "stats_wsd_m");
-  rb_define_method(cgsl_vector, "stats_wvariance_with_fixed_mean", 
-		   rb_gsl_stats_wvariance_with_fixed_mean, -1);
-  rb_define_alias(cgsl_vector, "wvariance_with_fixed_mean", 
-		  "stats_wvariance_with_fixed_mean");
-  rb_define_method(cgsl_vector, "stats_wsd_with_fixed_mean", 
-		   rb_gsl_stats_wsd_with_fixed_mean, -1);
+  rb_define_method(cgsl_vector, "stats_wvariance_with_fixed_mean",
+                   rb_gsl_stats_wvariance_with_fixed_mean, -1);
+  rb_define_alias(cgsl_vector, "wvariance_with_fixed_mean",
+                  "stats_wvariance_with_fixed_mean");
+  rb_define_method(cgsl_vector, "stats_wsd_with_fixed_mean",
+                   rb_gsl_stats_wsd_with_fixed_mean, -1);
   rb_define_alias(cgsl_vector, "wsd_with_fixed_mean", "stats_wsd_with_fixed_mean");
   rb_define_method(cgsl_vector, "stats_wabsdev", rb_gsl_stats_wabsdev, -1);
   rb_define_alias(cgsl_vector, "wabsdev", "stats_wabsdev");
@@ -764,8 +751,8 @@ void Init_gsl_stats(VALUE module)
   rb_define_alias(cgsl_vector, "wskew_m_sd", "stats_wskew_m_sd");
   rb_define_method(cgsl_vector, "stats_wkurtosis", rb_gsl_stats_wkurtosis, -1);
   rb_define_alias(cgsl_vector, "wkurtosis", "stats_wkurtosis");
-  rb_define_method(cgsl_vector, "stats_wkurtosis_m_sd", 
-		   rb_gsl_stats_wkurtosis_m_sd, 2);
+  rb_define_method(cgsl_vector, "stats_wkurtosis_m_sd",
+                   rb_gsl_stats_wkurtosis_m_sd, 2);
   rb_define_alias(cgsl_vector, "wkurtosis_m_sd", "stats_wkurtosis_m_sd");
 
   /*****/
@@ -774,8 +761,8 @@ void Init_gsl_stats(VALUE module)
   rb_define_singleton_method(mgsl_stats, "minmax", rb_gsl_stats_minmax, -1);
   rb_define_singleton_method(mgsl_stats, "max_index", rb_gsl_stats_max_index, -1);
   rb_define_singleton_method(mgsl_stats, "min_index", rb_gsl_stats_min_index, -1);
-  rb_define_singleton_method(mgsl_stats, "minmax_index", 
-			     rb_gsl_stats_minmax_index, -1);
+  rb_define_singleton_method(mgsl_stats, "minmax_index",
+                             rb_gsl_stats_minmax_index, -1);
 
   rb_define_method(cgsl_vector, "stats_max", rb_gsl_stats_max, -1);
   rb_define_method(cgsl_vector, "stats_min", rb_gsl_stats_min, -1);
@@ -784,17 +771,17 @@ void Init_gsl_stats(VALUE module)
   rb_define_method(cgsl_vector, "stats_min_index", rb_gsl_stats_min_index, -1);
   rb_define_method(cgsl_vector, "stats_minmax_index", rb_gsl_stats_minmax_index, -1);
 
-  rb_define_singleton_method(mgsl_stats, "median_from_sorted_data", 
-			     rb_gsl_stats_median_from_sorted_data, -1);
-  rb_define_method(cgsl_vector, "stats_median_from_sorted_data", 
-		   rb_gsl_stats_median_from_sorted_data, -1);
-  rb_define_alias(cgsl_vector, "median_from_sorted_data", 
-		  "stats_median_from_sorted_data");
+  rb_define_singleton_method(mgsl_stats, "median_from_sorted_data",
+                             rb_gsl_stats_median_from_sorted_data, -1);
+  rb_define_method(cgsl_vector, "stats_median_from_sorted_data",
+                   rb_gsl_stats_median_from_sorted_data, -1);
+  rb_define_alias(cgsl_vector, "median_from_sorted_data",
+                  "stats_median_from_sorted_data");
   rb_define_method(cgsl_vector, "median", rb_gsl_stats_median, -1);
 
-  rb_define_method(cgsl_vector, "stats_quantile_from_sorted_data", 
-		   rb_gsl_stats_quantile_from_sorted_data, -1);
-  rb_define_alias(cgsl_vector, "quantile_from_sorted_data", 
-		  "stats_quantile_from_sorted_data");
+  rb_define_method(cgsl_vector, "stats_quantile_from_sorted_data",
+                   rb_gsl_stats_quantile_from_sorted_data, -1);
+  rb_define_alias(cgsl_vector, "quantile_from_sorted_data",
+                  "stats_quantile_from_sorted_data");
 
 }
diff --git a/ext/gsl/sum.c b/ext/gsl_native/sum.c
similarity index 70%
rename from ext/gsl/sum.c
rename to ext/gsl_native/sum.c
index 0c35afb..d63d4e7 100644
--- a/ext/gsl/sum.c
+++ b/ext/gsl_native/sum.c
@@ -16,17 +16,17 @@ static VALUE rb_gsl_sum_accel(VALUE obj)
 {
   gsl_sum_levin_u_workspace *w = NULL;
   double sum, err, sum_plain, *ptr;
-  size_t terms_used, n, stride;  
+  size_t terms_used, n, stride;
   ptr = get_vector_ptr(obj, &stride, &n);
   w = gsl_sum_levin_u_alloc(n);
   gsl_sum_levin_u_accel(ptr, n, w, &sum, &err);
   sum_plain = w->sum_plain;
   terms_used = w->terms_used;
   gsl_sum_levin_u_free(w);
- return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err), 
-		    rb_float_new(sum_plain), INT2FIX(terms_used));
+  return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err),
+                     rb_float_new(sum_plain), INT2FIX(terms_used));
 }
- 
+
 static VALUE rb_gsl_utrunc_accel(VALUE obj)
 {
   gsl_sum_levin_utrunc_workspace *w = NULL;
@@ -38,8 +38,8 @@ static VALUE rb_gsl_utrunc_accel(VALUE obj)
   sum_plain = w->sum_plain;
   terms_used = w->terms_used;
   gsl_sum_levin_utrunc_free(w);
-  return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err), 
-		     rb_float_new(sum_plain), INT2FIX(terms_used));
+  return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err),
+                     rb_float_new(sum_plain), INT2FIX(terms_used));
 }
 
 static VALUE rb_gsl_sum_levin_u_new(VALUE klass, VALUE nn)
@@ -71,8 +71,8 @@ static VALUE rb_gsl_sum_levin_u_accel2(VALUE obj, VALUE vv)
   sum_plain = w->sum_plain;
   terms_used = w->terms_used;
   gsl_sum_levin_u_free(w);
-  return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err), 
-		     rb_float_new(sum_plain), INT2FIX(terms_used));
+  return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err),
+                     rb_float_new(sum_plain), INT2FIX(terms_used));
 }
 
 static VALUE rb_gsl_sum_levin_utrunc_accel2(VALUE obj, VALUE vv)
@@ -87,8 +87,8 @@ static VALUE rb_gsl_sum_levin_utrunc_accel2(VALUE obj, VALUE vv)
   sum_plain = w->sum_plain;
   terms_used = w->terms_used;
   gsl_sum_levin_utrunc_free(w);
-  return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err), 
-		     rb_float_new(sum_plain), INT2FIX(terms_used));
+  return rb_ary_new3(4, rb_float_new(sum), rb_float_new(err),
+                     rb_float_new(sum_plain), INT2FIX(terms_used));
 }
 
 static VALUE rb_gsl_sum_levin_u_sum_plain(VALUE obj)
@@ -119,39 +119,39 @@ static VALUE rb_gsl_sum_levin_utrunc_terms_used(VALUE obj)
   return INT2FIX(w->terms_used);
 }
 
-void Init_gsl_sum(VALUE module) 
+void Init_gsl_sum(VALUE module)
 {
   VALUE mgsl_sum;
   VALUE cgsl_sum_levin_u, cgsl_sum_levin_utrunc;
 
   mgsl_sum = rb_define_module_under(module, "Sum");
-  cgsl_sum_levin_u = rb_define_class_under(mgsl_sum, 
-					   "Levin_u", cGSL_Object);
-  cgsl_sum_levin_utrunc = rb_define_class_under(mgsl_sum, 
-						"Levin_utrunc", cGSL_Object);
+  cgsl_sum_levin_u = rb_define_class_under(mgsl_sum,
+                                           "Levin_u", cGSL_Object);
+  cgsl_sum_levin_utrunc = rb_define_class_under(mgsl_sum,
+                                                "Levin_utrunc", cGSL_Object);
 
   rb_define_singleton_method(cgsl_sum_levin_u, "new", rb_gsl_sum_levin_u_new, 1);
   rb_define_singleton_method(cgsl_sum_levin_u, "alloc", rb_gsl_sum_levin_u_new, 1);
-  rb_define_singleton_method(cgsl_sum_levin_utrunc, "new", 
-			     rb_gsl_sum_levin_utrunc_new, 1);
-  rb_define_singleton_method(cgsl_sum_levin_utrunc, "alloc", 
-			     rb_gsl_sum_levin_utrunc_new, 1);
-  rb_define_singleton_method(cgsl_sum_levin_u, "accel", 
-			     rb_gsl_sum_levin_u_accel2, 1);
-
-  rb_define_singleton_method(cgsl_sum_levin_utrunc, "accel", 
-			     rb_gsl_sum_levin_utrunc_accel2, 1);
+  rb_define_singleton_method(cgsl_sum_levin_utrunc, "new",
+                             rb_gsl_sum_levin_utrunc_new, 1);
+  rb_define_singleton_method(cgsl_sum_levin_utrunc, "alloc",
+                             rb_gsl_sum_levin_utrunc_new, 1);
+  rb_define_singleton_method(cgsl_sum_levin_u, "accel",
+                             rb_gsl_sum_levin_u_accel2, 1);
+
+  rb_define_singleton_method(cgsl_sum_levin_utrunc, "accel",
+                             rb_gsl_sum_levin_utrunc_accel2, 1);
   rb_define_method(cgsl_sum_levin_u, "accel", rb_gsl_sum_levin_u_accel2, 1);
-  rb_define_method(cgsl_sum_levin_utrunc, "accel", 
-		   rb_gsl_sum_levin_utrunc_accel2, 1);
+  rb_define_method(cgsl_sum_levin_utrunc, "accel",
+                   rb_gsl_sum_levin_utrunc_accel2, 1);
 
   rb_define_method(cgsl_sum_levin_u, "sum_plain", rb_gsl_sum_levin_u_sum_plain, 0);
-  rb_define_method(cgsl_sum_levin_u, "terms_used", 
-		   rb_gsl_sum_levin_u_terms_used, 0);
-  rb_define_method(cgsl_sum_levin_utrunc, "sum_plain", 
-		   rb_gsl_sum_levin_utrunc_sum_plain, 0);
-  rb_define_method(cgsl_sum_levin_utrunc, "terms_used", 
-		   rb_gsl_sum_levin_utrunc_terms_used, 0);
+  rb_define_method(cgsl_sum_levin_u, "terms_used",
+                   rb_gsl_sum_levin_u_terms_used, 0);
+  rb_define_method(cgsl_sum_levin_utrunc, "sum_plain",
+                   rb_gsl_sum_levin_utrunc_sum_plain, 0);
+  rb_define_method(cgsl_sum_levin_utrunc, "terms_used",
+                   rb_gsl_sum_levin_utrunc_terms_used, 0);
   /***/
 
   rb_define_method(cgsl_vector, "accel_sum", rb_gsl_sum_accel, 0);
diff --git a/ext/gsl/tamu_anova.c b/ext/gsl_native/tamu_anova.c
similarity index 100%
rename from ext/gsl/tamu_anova.c
rename to ext/gsl_native/tamu_anova.c
diff --git a/ext/gsl/tensor.c b/ext/gsl_native/tensor.c
similarity index 90%
rename from ext/gsl/tensor.c
rename to ext/gsl_native/tensor.c
index a758d2d..46f9c75 100644
--- a/ext/gsl/tensor.c
+++ b/ext/gsl_native/tensor.c
@@ -18,19 +18,17 @@
 
 #include "include/rb_gsl_tensor.h"
 
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
 #define BASE_DOUBLE
 #include "include/templates_on.h"
-#include "tensor_source.c"
+#include "tensor_source.h"
 #include "include/templates_off.h"
 #undef  BASE_DOUBLE
 
 #define BASE_INT
 #include "include/templates_on.h"
-#include "tensor_source.c"
+#include "tensor_source.h"
 #include "include/templates_off.h"
 #undef  BASE_INT
 
diff --git a/ext/gsl/tensor_source.c b/ext/gsl_native/tensor_source.h
similarity index 81%
rename from ext/gsl/tensor_source.c
rename to ext/gsl_native/tensor_source.h
index 1b3863c..37ea90d 100644
--- a/ext/gsl/tensor_source.c
+++ b/ext/gsl_native/tensor_source.h
@@ -38,26 +38,26 @@ VALUE cgsl_tensor_view, cgsl_tensor_int_view;
 #define MAT_P(x) MATRIX_INT_P(x)
 #endif
 
-GSL_TYPE(rbgsl_tensor)* FUNCTION(rbgsl_tensor,alloc)(const unsigned int rank, 
-						     const size_t dimension)
+GSL_TYPE(rbgsl_tensor)* FUNCTION(rbgsl_tensor,alloc)(const unsigned int rank,
+                                                     const size_t dimension)
 {
   GSL_TYPE(rbgsl_tensor) *t;
   t = ALLOC(GSL_TYPE(rbgsl_tensor));
   t->tensor = FUNCTION(tensor,alloc)(rank, dimension);
-  if (rank == 0) 
+  if (rank == 0)
     t->indices = gsl_permutation_alloc(1);
   else
     t->indices = gsl_permutation_alloc(rank);
   return t;
 }
 
-GSL_TYPE(rbgsl_tensor)* FUNCTION(rbgsl_tensor,calloc)(const unsigned int rank, 
-						      const size_t dimension)
+GSL_TYPE(rbgsl_tensor)* FUNCTION(rbgsl_tensor,calloc)(const unsigned int rank,
+                                                      const size_t dimension)
 {
   GSL_TYPE(rbgsl_tensor) *t;
   t = ALLOC(GSL_TYPE(rbgsl_tensor));
   t->tensor = FUNCTION(tensor,calloc)(rank, dimension);
-  if (rank == 0) 
+  if (rank == 0)
     t->indices = gsl_permutation_alloc(1);
   else
     t->indices = gsl_permutation_alloc(rank);
@@ -68,7 +68,7 @@ GSL_TYPE(rbgsl_tensor)* FUNCTION(rbgsl_tensor,copy)(const GSL_TYPE(rbgsl_tensor)
 {
   GSL_TYPE(rbgsl_tensor) *tnew;
   tnew = ALLOC(GSL_TYPE(rbgsl_tensor));
-  if (t->tensor->rank == 0) 
+  if (t->tensor->rank == 0)
     tnew->indices = gsl_permutation_alloc(1);
   else
     tnew->indices = gsl_permutation_alloc(t->tensor->rank);
@@ -80,14 +80,14 @@ void FUNCTION(rbgsl_tensor,free)(GSL_TYPE(rbgsl_tensor) *t)
 {
   gsl_permutation_free(t->indices);
   FUNCTION(tensor,free)(t->tensor);
-  free((GSL_TYPE(rbgsl_tensor) *) t);
+  free((GSL_TYPE(rbgsl_tensor) *)t);
 }
 
 void FUNCTION(rbgsl_tensor,free2)(GSL_TYPE(rbgsl_tensor) *t)
 {
   gsl_permutation_free(t->indices);
-  free((GSL_TYPE(tensor)*) t->tensor);
-  free((GSL_TYPE(rbgsl_tensor) *) t);
+  free((GSL_TYPE(tensor)*)t->tensor);
+  free((GSL_TYPE(rbgsl_tensor) *)t);
 }
 
 /* singleton methods */
@@ -104,7 +104,7 @@ static VALUE FUNCTION(rb_tensor,new)(int argc, VALUE *argv, VALUE klass)
     break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, rank and dimension)",
-	     argc);
+             argc);
     break;
   }
   return Data_Wrap_Struct(GSL_TYPE(cgsl_tensor), 0, FUNCTION(rbgsl_tensor,free), t);
@@ -175,8 +175,8 @@ static VALUE FUNCTION(rb_tensor,set_all)(VALUE obj, VALUE xx)
 }
 
 static void rb_tensor_get_indices_array(tensor_indices *v, VALUE ary);
-static void rbgsl_tensor_get_indices(int argc, VALUE *argv, tensor_indices *indices, 
-				     size_t *n);
+static void rbgsl_tensor_get_indices(int argc, VALUE *argv, tensor_indices *indices,
+                                     size_t *n);
 #ifdef BASE_DOUBLE
 static void rb_tensor_get_indices_array(tensor_indices *v, VALUE ary)
 {
@@ -187,8 +187,8 @@ static void rb_tensor_get_indices_array(tensor_indices *v, VALUE ary)
     v->data[i] = FIX2UINT(rb_ary_entry(ary, i));
 }
 
-static void rbgsl_tensor_get_indices(int argc, VALUE *argv, 
-				     tensor_indices *indices, size_t *n)
+static void rbgsl_tensor_get_indices(int argc, VALUE *argv,
+                                     tensor_indices *indices, size_t *n)
 {
   size_t i;
   for (i = 0; i < indices->size; i++) indices->data[i] = 0;
@@ -206,7 +206,7 @@ static void rbgsl_tensor_get_indices(int argc, VALUE *argv,
       break;
     default:
       rb_raise(rb_eTypeError, "wrong argument type %s (Array expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
       break;
     }
     break;
@@ -222,13 +222,13 @@ static void rbgsl_tensor_get_indices(int argc, VALUE *argv,
 #endif
 
 size_t FUNCTION(tensor,position)(const size_t * indices,
-				     const GSL_TYPE(tensor) * t);
+                                 const GSL_TYPE(tensor) * t);
 static VALUE FUNCTION(rb_tensor,position)(int argc, VALUE *argv, VALUE obj)
 {
   GSL_TYPE(rbgsl_tensor) *t = NULL;
   size_t n, position;
-  Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);  
-  rbgsl_tensor_get_indices(argc, argv, t->indices, &n);  
+  Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);
+  rbgsl_tensor_get_indices(argc, argv, t->indices, &n);
   position = (size_t) FUNCTION(tensor,position)(t->indices->data,t->tensor);
   return INT2FIX(position);
 }
@@ -238,8 +238,8 @@ static VALUE FUNCTION(rb_tensor,get)(int argc, VALUE *argv, VALUE obj)
   GSL_TYPE(rbgsl_tensor) *t = NULL;
   BASE x;
   size_t n;
-  Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);  
-  rbgsl_tensor_get_indices(argc, argv, t->indices, &n);  
+  Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);
+  rbgsl_tensor_get_indices(argc, argv, t->indices, &n);
   if (n < t->tensor->rank) {
     return FUNCTION(rb_tensor,subtensor)(argc, argv, obj);
   } else {
@@ -254,9 +254,9 @@ static VALUE FUNCTION(rb_tensor,set)(int argc, VALUE *argv, VALUE obj)
   GSL_TYPE(rbgsl_tensor) *t = NULL;
   size_t n;
   BASE x;
-  if (argc < 2) 
+  if (argc < 2)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 2)", argc);
-  Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);  
+  Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);
   rbgsl_tensor_get_indices(argc-1, argv, t->indices, &n);
   x = NUMCONV(argv[argc-1]);
   FUNCTION(tensor,set)(t->tensor, t->indices->data, x);
@@ -292,7 +292,7 @@ static VALUE FUNCTION(rb_tensor,fprintf)(int argc, VALUE *argv, VALUE obj)
   GSL_TYPE(rbgsl_tensor) *h = NULL;
   FILE *fp = NULL;
   int status, flag = 0;
-  if (argc != 1 && argc != 2) 
+  if (argc != 1 && argc != 2)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
   Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), h);
   fp = rb_gsl_open_writefile(argv[0], &flag);
@@ -317,7 +317,7 @@ static VALUE FUNCTION(rb_tensor,printf)(int argc, VALUE *argv, VALUE obj)
   int status;
   Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), h);
   if (argc == 1) {
-    if (TYPE(argv[0]) != T_STRING) 
+    if (TYPE(argv[0]) != T_STRING)
       rb_raise(rb_eTypeError, "String expected");
     else
       status = FUNCTION(tensor,fprintf)(stdout, h->tensor, STR2CSTR(argv[0]));
@@ -344,7 +344,7 @@ static VALUE FUNCTION(rb_tensor,swap_indices)(VALUE obj, VALUE ii, VALUE jj)
   GSL_TYPE(rbgsl_tensor) *t, *tnew;
   Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);
   tnew = ALLOC(GSL_TYPE(rbgsl_tensor));
-  if (t->tensor->rank == 0) 
+  if (t->tensor->rank == 0)
     tnew->indices = gsl_permutation_alloc(1);
   else
     tnew->indices = gsl_permutation_alloc(t->tensor->rank);
@@ -405,8 +405,8 @@ static VALUE FUNCTION(rb_tensor,minmax_index)(VALUE obj)
   }
   FUNCTION(tensor,minmax_index)(t->tensor, min->data, max->data);
   return rb_ary_new3(2,
-		     Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, min), 
-		     Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, max));
+                     Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, min),
+                     Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, max));
 }
 
 static VALUE FUNCTION(rb_tensor,isnull)(VALUE obj)
@@ -427,7 +427,7 @@ static VALUE FUNCTION(rb_tensor,isnull2)(VALUE obj)
 }
 
 static VALUE FUNCTION(rb_tensor,oper)(VALUE obj, VALUE bb,
-					   int flag)
+                                      int flag)
 {
   GSL_TYPE(rbgsl_tensor) *a, *b, *anew;
   BASE x;
@@ -443,28 +443,28 @@ static VALUE FUNCTION(rb_tensor,oper)(VALUE obj, VALUE bb,
     case TENSOR_MUL_ELEMENTS: f = FUNCTION(&tensor,mul_elements); break;
     case TENSOR_DIV_ELEMENTS: f = FUNCTION(&tensor,div_elements); break;
     default: rb_raise(rb_eRuntimeError, "unknown operation"); break;
-    } 
+    }
     (*f)(anew->tensor, b->tensor);
   } else {
     switch (flag) {
     case TENSOR_ADD:
-    case TENSOR_ADD_CONSTANT: 
+    case TENSOR_ADD_CONSTANT:
       x = NUMCONV(bb);
-      f2 = FUNCTION(&tensor,add_constant); 
+      f2 = FUNCTION(&tensor,add_constant);
       break;
     case TENSOR_SUB:
       x = -NUMCONV(bb);
-      f2 = FUNCTION(&tensor,add_constant); 
+      f2 = FUNCTION(&tensor,add_constant);
       break;
     case TENSOR_ADD_DIAGONAL: f2 = FUNCTION(&tensor,add_diagonal); break;
     case TENSOR_MUL_ELEMENTS:
     case TENSOR_SCALE:
-      x = NUMCONV(bb); 
-      f2 = FUNCTION(&tensor,scale); 
+      x = NUMCONV(bb);
+      f2 = FUNCTION(&tensor,scale);
       break;
-    case TENSOR_DIV_ELEMENTS: 
-      x = 1.0/NUMCONV(bb); 
-      f2 = FUNCTION(&tensor,scale); 
+    case TENSOR_DIV_ELEMENTS:
+      x = 1.0/NUMCONV(bb);
+      f2 = FUNCTION(&tensor,scale);
       break;
     default: rb_raise(rb_eRuntimeError, "unknown operation"); break;
     }
@@ -489,28 +489,28 @@ static VALUE FUNCTION(rb_tensor,oper_bang)(VALUE obj, VALUE bb, int flag)
     case TENSOR_MUL_ELEMENTS: f = FUNCTION(&tensor,mul_elements); break;
     case TENSOR_DIV_ELEMENTS: f = FUNCTION(&tensor,div_elements); break;
     default: rb_raise(rb_eRuntimeError, "unknown operation"); break;
-    } 
+    }
     (*f)(a->tensor, b->tensor);
   } else {
     switch (flag) {
     case TENSOR_ADD:
-    case TENSOR_ADD_CONSTANT: 
+    case TENSOR_ADD_CONSTANT:
       x = NUMCONV(bb);
-      f2 = FUNCTION(&tensor,add_constant); 
+      f2 = FUNCTION(&tensor,add_constant);
       break;
     case TENSOR_SUB:
       x = -NUMCONV(bb);
-      f2 = FUNCTION(&tensor,add_constant); 
+      f2 = FUNCTION(&tensor,add_constant);
       break;
     case TENSOR_ADD_DIAGONAL: f2 = FUNCTION(&tensor,add_diagonal); break;
     case TENSOR_MUL_ELEMENTS:
     case TENSOR_SCALE:
-      x = NUMCONV(bb); 
-      f2 = FUNCTION(&tensor,scale); 
+      x = NUMCONV(bb);
+      f2 = FUNCTION(&tensor,scale);
       break;
-    case TENSOR_DIV_ELEMENTS: 
-      x = 1.0/NUMCONV(bb); 
-      f2 = FUNCTION(&tensor,scale); 
+    case TENSOR_DIV_ELEMENTS:
+      x = 1.0/NUMCONV(bb);
+      f2 = FUNCTION(&tensor,scale);
       break;
     default: rb_raise(rb_eRuntimeError, "unknown operation"); break;
     }
@@ -688,7 +688,7 @@ static VALUE FUNCTION(rb_tensor,2matrix)(VALUE obj)
   GSL_TYPE(rbgsl_tensor) *t;
   GSL_TYPE(gsl_matrix) *m = NULL;
   Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);
-  m = (GSL_TYPE(gsl_matrix)*) FUNCTION(tensor,2matrix)(t->tensor);
+  m = (GSL_TYPE(gsl_matrix)*)FUNCTION(tensor,2matrix)(t->tensor);
   return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_matrix,view), 0, FUNCTION(gsl_matrix,free), m);
 }
 
@@ -697,7 +697,7 @@ static VALUE FUNCTION(rb_tensor,2vector)(VALUE obj)
   GSL_TYPE(rbgsl_tensor) *t;
   GSL_TYPE(gsl_vector) *v = NULL;
   Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);
-  v = (GSL_TYPE(gsl_vector) *) FUNCTION(tensor,2vector)(t->tensor);
+  v = (GSL_TYPE(gsl_vector) *)FUNCTION(tensor,2vector)(t->tensor);
   return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,view), 0, FUNCTION(gsl_vector,free), v);
 }
 
@@ -718,8 +718,8 @@ static VALUE FUNCTION(rb_tensor,to_v)(VALUE obj)
   rank: rank of the tensor created
 */
 GSL_TYPE(tensor) FUNCTION(tensor,subtensor)(const GSL_TYPE(tensor) *t,
-						     const unsigned int rank,
-						     size_t *indices)
+                                            const unsigned int rank,
+                                            size_t *indices)
 {
   GSL_TYPE(tensor) tnew;
   size_t position;
@@ -740,16 +740,16 @@ static VALUE FUNCTION(rb_tensor,subtensor)(int argc, VALUE *argv, VALUE obj)
   size_t n;
   Data_Get_Struct(obj, GSL_TYPE(rbgsl_tensor), t);
   /* n: number of indices given */
-  rbgsl_tensor_get_indices(argc, argv, t->indices, &n);  
-  rank = t->tensor->rank - n; 
+  rbgsl_tensor_get_indices(argc, argv, t->indices, &n);
+  rank = t->tensor->rank - n;
   tnew = ALLOC(GSL_TYPE(rbgsl_tensor));
-  tnew->tensor = (GSL_TYPE(tensor)*) malloc(sizeof(GSL_TYPE(tensor)));
+  tnew->tensor = (GSL_TYPE(tensor)*)malloc(sizeof(GSL_TYPE(tensor)));
   *(tnew->tensor) = FUNCTION(tensor,subtensor)(t->tensor, rank, t->indices->data);
-  if (rank == 0) 
+  if (rank == 0)
     tnew->indices = gsl_permutation_alloc(1);
   else
     tnew->indices = gsl_permutation_alloc(rank);
-  return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_tensor,view), 0, FUNCTION(rbgsl_tensor,free2), tnew);	       
+  return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_tensor,view), 0, FUNCTION(rbgsl_tensor,free2), tnew);
 }
 
 #ifdef BASE_DOUBLE
@@ -782,29 +782,29 @@ static VALUE FUNCTION(rb_tensor,to_s)(VALUE obj)
     m = &(matrix.matrix);
     for (i = 0; i < m->size1; i++) {
       if (i != 0) {
-	strcpy(buf, "  ");
-	rb_str_cat(str, buf, strlen(buf));
+        strcpy(buf, "  ");
+        rb_str_cat(str, buf, strlen(buf));
       }
       for (j = 0; j < m->size2; j++) {
-	sprintf(buf, PRINTF_FORMAT, FUNCTION(gsl_matrix,get)(m, i, j));
-	rb_str_cat(str, buf, strlen(buf));
-	if (j == SHOW_ELM) {
-	  strcpy(buf, "... ");
-	  rb_str_cat(str, buf, strlen(buf));
-	  break;
-	}
+        sprintf(buf, PRINTF_FORMAT, FUNCTION(gsl_matrix,get)(m, i, j));
+        rb_str_cat(str, buf, strlen(buf));
+        if (j == SHOW_ELM) {
+          strcpy(buf, "... ");
+          rb_str_cat(str, buf, strlen(buf));
+          break;
+        }
       }
       if (i == 6) {
-	strcpy(buf, "\n  ... ]");
-	rb_str_cat(str, buf, strlen(buf));
-	break;
+        strcpy(buf, "\n  ... ]");
+        rb_str_cat(str, buf, strlen(buf));
+        break;
       }
       if (i == m->size1 - 1) {
-	strcpy(buf, "]");
-	rb_str_cat(str, buf, strlen(buf));
+        strcpy(buf, "]");
+        rb_str_cat(str, buf, strlen(buf));
       } else {
-	strcpy(buf, "\n");
-	rb_str_cat(str, buf, strlen(buf));
+        strcpy(buf, "\n");
+        rb_str_cat(str, buf, strlen(buf));
       }
     }
     return str;
@@ -871,8 +871,8 @@ VALUE FUNCTION(rb_tensor,equal)(int argc, VALUE *argv, VALUE obj)
     if (a->tensor->dimension != b->tensor->dimension) return Qfalse;
     if (a->tensor->size != b->tensor->size) return Qfalse;
     for (i = 0; i < a->tensor->size; i++)
-      if (fabs(a->tensor->data[i]-b->tensor->data[i]) > eps) 
-	return Qfalse;
+      if (fabs(a->tensor->data[i]-b->tensor->data[i]) > eps)
+        return Qfalse;
     return Qtrue;
   } else if (MAT_P(other)) {
     if (a->tensor->rank != 2) return Qfalse;
@@ -880,19 +880,19 @@ VALUE FUNCTION(rb_tensor,equal)(int argc, VALUE *argv, VALUE obj)
     if (a->tensor->dimension != m->size1 || a->tensor->dimension != m->size2)
       return Qfalse;
     for (i = 0; i < a->tensor->size; i++)
-      if (fabs(a->tensor->data[i]-m->data[i]) > eps) 
-	return Qfalse;
+      if (fabs(a->tensor->data[i]-m->data[i]) > eps)
+        return Qfalse;
     return Qtrue;
   } else if (VEC_P(other)) {
     Data_Get_Struct(other, GSL_TYPE(gsl_vector), v);
     if (a->tensor->size != v->size) return Qfalse;
     for (i = 0; i < a->tensor->size; i++)
-      if (fabs(a->tensor->data[i]-v->data[i]) > eps) 
-	return Qfalse;
+      if (fabs(a->tensor->data[i]-v->data[i]) > eps)
+        return Qfalse;
     return Qtrue;
   } else {
-    rb_raise(rb_eTypeError, "wrong argument type %s (Tensor, Matrix or Vector expected)", 
-	     rb_class2name(CLASS_OF(other)));
+    rb_raise(rb_eTypeError, "wrong argument type %s (Tensor, Matrix or Vector expected)",
+             rb_class2name(CLASS_OF(other)));
   }
 }
 
@@ -927,8 +927,8 @@ static VALUE FUNCTION(rb_tensor,coerce)(VALUE obj, VALUE other)
     return rb_ary_new3(2, tt, obj);
     break;
   default:
-    rb_raise(rb_eRuntimeError, "undefined operation with %s", 
-	     rb_class2name(CLASS_OF(other)));
+    rb_raise(rb_eRuntimeError, "undefined operation with %s",
+             rb_class2name(CLASS_OF(other)));
     break;
   }
 }
@@ -953,99 +953,99 @@ void FUNCTION(Init_tensor,init)(VALUE module)
   cgsl_tensor_int = rb_define_class_under(cgsl_tensor, "Int", cGSL_Object);
   cgsl_tensor_view = rb_define_class_under(cgsl_tensor, "View", cgsl_tensor);
   cgsl_tensor_int_view = rb_define_class_under(cgsl_tensor_int, "View",
-					       cgsl_tensor_int);
+                                               cgsl_tensor_int);
   /*
-  cgsl_index = rb_define_class_under(cgsl_tensor, "Index", 
+  cgsl_index = rb_define_class_under(cgsl_tensor, "Index",
   cgsl_permutation);*/
 #endif
 
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "new",
-			     FUNCTION(rb_tensor,new), -1);
+                             FUNCTION(rb_tensor,new), -1);
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "[]",
-			     FUNCTION(rb_tensor,new), -1);
+                             FUNCTION(rb_tensor,new), -1);
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "alloc",
-			     FUNCTION(rb_tensor,new), -1);
+                             FUNCTION(rb_tensor,new), -1);
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "calloc",
-			     FUNCTION(rb_tensor,calloc), 2);
+                             FUNCTION(rb_tensor,calloc), 2);
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "copy",
-			     FUNCTION(rb_tensor,copy_singleton), 1);
+                             FUNCTION(rb_tensor,copy_singleton), 1);
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "memcpy",
-			     FUNCTION(rb_tensor,memcpy_singleton), 2);
+                             FUNCTION(rb_tensor,memcpy_singleton), 2);
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "swap",
-			     FUNCTION(rb_tensor,swap_singleton), 2);
+                             FUNCTION(rb_tensor,swap_singleton), 2);
 
   /*****/
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "copy",
-			     FUNCTION(rb_tensor,copy), 0);
+                   FUNCTION(rb_tensor,copy), 0);
   rb_define_alias(GSL_TYPE(cgsl_tensor), "clone", "copy");
   rb_define_alias(GSL_TYPE(cgsl_tensor), "duplicate", "copy");
   rb_define_method(GSL_TYPE(cgsl_tensor), "set_zero",
-			     FUNCTION(rb_tensor,set_zero), 0);
+                   FUNCTION(rb_tensor,set_zero), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "set_all",
-			     FUNCTION(rb_tensor,set_all), 1);
+                   FUNCTION(rb_tensor,set_all), 1);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "position",
-		   FUNCTION(rb_tensor,position), -1);
+                   FUNCTION(rb_tensor,position), -1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "get",
-			     FUNCTION(rb_tensor,get), -1);
+                   FUNCTION(rb_tensor,get), -1);
   rb_define_alias(GSL_TYPE(cgsl_tensor), "[]", "get");
   rb_define_method(GSL_TYPE(cgsl_tensor), "set",
-			     FUNCTION(rb_tensor,set), -1);
+                   FUNCTION(rb_tensor,set), -1);
   rb_define_alias(GSL_TYPE(cgsl_tensor), "[]=", "set");
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "fread",
-			     FUNCTION(rb_tensor,fread), 1);
+                   FUNCTION(rb_tensor,fread), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "fwrite",
-			     FUNCTION(rb_tensor,fwrite), 1);
+                   FUNCTION(rb_tensor,fwrite), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "fprintf",
-			     FUNCTION(rb_tensor,fprintf), -1);
+                   FUNCTION(rb_tensor,fprintf), -1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "printf",
-			     FUNCTION(rb_tensor,printf), -1);
+                   FUNCTION(rb_tensor,printf), -1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "fscanf",
-			     FUNCTION(rb_tensor,fscanf), 1);
+                   FUNCTION(rb_tensor,fscanf), 1);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "swap_indices",
-			     FUNCTION(rb_tensor,swap_indices), 2);
+                   FUNCTION(rb_tensor,swap_indices), 2);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "max",
-			     FUNCTION(rb_tensor,max), 0);
+                   FUNCTION(rb_tensor,max), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "min",
-			     FUNCTION(rb_tensor,min), 0);
+                   FUNCTION(rb_tensor,min), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "minmax",
-			     FUNCTION(rb_tensor,minmax), 0);
+                   FUNCTION(rb_tensor,minmax), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "max_index",
-			     FUNCTION(rb_tensor,max_index), 0);
+                   FUNCTION(rb_tensor,max_index), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "min_index",
-			     FUNCTION(rb_tensor,min_index), 0);
+                   FUNCTION(rb_tensor,min_index), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "minmax_index",
-			     FUNCTION(rb_tensor,minmax_index), 0);
+                   FUNCTION(rb_tensor,minmax_index), 0);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "isnull",
-			     FUNCTION(rb_tensor,isnull), 0);
+                   FUNCTION(rb_tensor,isnull), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "isnull?",
-			     FUNCTION(rb_tensor,isnull2), 0);
+                   FUNCTION(rb_tensor,isnull2), 0);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "add",
-			     FUNCTION(rb_tensor,add), 1);
+                   FUNCTION(rb_tensor,add), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "sub",
-			     FUNCTION(rb_tensor,sub), 1);
+                   FUNCTION(rb_tensor,sub), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "mul_elements",
-			     FUNCTION(rb_tensor,mul_elements), 1);
+                   FUNCTION(rb_tensor,mul_elements), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "div_elements",
-			     FUNCTION(rb_tensor,div_elements), 1);
+                   FUNCTION(rb_tensor,div_elements), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "add_constant",
-			     FUNCTION(rb_tensor,add_constant), 1);
+                   FUNCTION(rb_tensor,add_constant), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "add_diagonal",
-			     FUNCTION(rb_tensor,add_diagonal), 1);
+                   FUNCTION(rb_tensor,add_diagonal), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "scale",
-			     FUNCTION(rb_tensor,scale), 1);
+                   FUNCTION(rb_tensor,scale), 1);
   rb_define_singleton_method(GSL_TYPE(cgsl_tensor), "product",
-			     FUNCTION(rb_tensor,product_singleton), 2);
+                             FUNCTION(rb_tensor,product_singleton), 2);
   rb_define_method(GSL_TYPE(cgsl_tensor), "product",
-			     FUNCTION(rb_tensor,product), 1);
+                   FUNCTION(rb_tensor,product), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "contract",
-			     FUNCTION(rb_tensor,contract), 2);
+                   FUNCTION(rb_tensor,contract), 2);
 
   rb_define_alias(GSL_TYPE(cgsl_tensor), "+", "add");
   rb_define_alias(GSL_TYPE(cgsl_tensor), "-", "sub");
@@ -1054,62 +1054,62 @@ void FUNCTION(Init_tensor,init)(VALUE module)
   rb_define_alias(GSL_TYPE(cgsl_tensor), "*", "product");
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "add!",
-			     FUNCTION(rb_tensor,add_bang), 1);
+                   FUNCTION(rb_tensor,add_bang), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "sub!",
-			     FUNCTION(rb_tensor,sub_bang), 1);
+                   FUNCTION(rb_tensor,sub_bang), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "mul_elements!",
-			     FUNCTION(rb_tensor,mul_elements_bang), 1);
+                   FUNCTION(rb_tensor,mul_elements_bang), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "div_elements!",
-			     FUNCTION(rb_tensor,div_elements_bang), 1);
+                   FUNCTION(rb_tensor,div_elements_bang), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "add_constant!",
-			     FUNCTION(rb_tensor,add_constant_bang), 1);
+                   FUNCTION(rb_tensor,add_constant_bang), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "add_diagonal!",
-			     FUNCTION(rb_tensor,add_diagonal_bang), 1);
+                   FUNCTION(rb_tensor,add_diagonal_bang), 1);
   rb_define_method(GSL_TYPE(cgsl_tensor), "scale!",
-			     FUNCTION(rb_tensor,scale_bang), 1);
+                   FUNCTION(rb_tensor,scale_bang), 1);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "+@",
-			     FUNCTION(rb_tensor,uplus), 0);
+                   FUNCTION(rb_tensor,uplus), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "-@",
-			     FUNCTION(rb_tensor,uminus), 0);
+                   FUNCTION(rb_tensor,uminus), 0);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "size",
-			     FUNCTION(rb_tensor,size), 0);
+                   FUNCTION(rb_tensor,size), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "rank",
-			     FUNCTION(rb_tensor,rank), 0);
+                   FUNCTION(rb_tensor,rank), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "dimension",
-			     FUNCTION(rb_tensor,dimension), 0);
+                   FUNCTION(rb_tensor,dimension), 0);
   rb_define_alias(GSL_TYPE(cgsl_tensor), "dim", "dimension");
   rb_define_method(GSL_TYPE(cgsl_tensor), "data",
-			     FUNCTION(rb_tensor,data), 0);
+                   FUNCTION(rb_tensor,data), 0);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "to_v",
-			     FUNCTION(rb_tensor,to_v), 0);
+                   FUNCTION(rb_tensor,to_v), 0);
   rb_define_alias(GSL_TYPE(cgsl_tensor), "to_gv", "to_v");
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "to_vector",
-			     FUNCTION(rb_tensor,2vector), 0);
+                   FUNCTION(rb_tensor,2vector), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "to_matrix",
-			     FUNCTION(rb_tensor,2matrix), 0);
+                   FUNCTION(rb_tensor,2matrix), 0);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "subtensor",
-			     FUNCTION(rb_tensor,subtensor), -1);
+                   FUNCTION(rb_tensor,subtensor), -1);
   rb_define_alias(GSL_TYPE(cgsl_tensor), "view", "subtensor");
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "to_s",
-			     FUNCTION(rb_tensor,to_s), 0);
+                   FUNCTION(rb_tensor,to_s), 0);
   rb_define_method(GSL_TYPE(cgsl_tensor), "inspect",
-			     FUNCTION(rb_tensor,inspect), 0);
+                   FUNCTION(rb_tensor,inspect), 0);
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "equal?",
-			     FUNCTION(rb_tensor,equal), -1);
+                   FUNCTION(rb_tensor,equal), -1);
   rb_define_alias(GSL_TYPE(cgsl_tensor), "==", "equal?");
 
   rb_define_method(GSL_TYPE(cgsl_tensor), "coerce",
-			     FUNCTION(rb_tensor,coerce), 1);
+                   FUNCTION(rb_tensor,coerce), 1);
 
-  rb_define_method(GSL_TYPE(cgsl_tensor), "info", 
-		   FUNCTION(rb_tensor,info), 0);
+  rb_define_method(GSL_TYPE(cgsl_tensor), "info",
+                   FUNCTION(rb_tensor,info), 0);
 }
 
 #undef NUMCONV
diff --git a/ext/gsl/vector.c b/ext/gsl_native/vector.c
similarity index 91%
rename from ext/gsl/vector.c
rename to ext/gsl_native/vector.c
index f21c5e7..cfbbad6 100644
--- a/ext/gsl/vector.c
+++ b/ext/gsl_native/vector.c
@@ -18,19 +18,17 @@
 #include "include/rb_gsl_histogram.h"
 #include "include/rb_gsl_complex.h"
 #include "include/rb_gsl_poly.h"
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
 #define BASE_DOUBLE
 #include "include/templates_on.h"
-#include "vector_source.c"
+#include "vector_source.h"
 #include "include/templates_off.h"
 #undef  BASE_DOUBLE
 
 #define BASE_INT
 #include "include/templates_on.h"
-#include "vector_source.c"
+#include "vector_source.h"
 #include "include/templates_off.h"
 #undef  BASE_INT
 
diff --git a/ext/gsl/vector_complex.c b/ext/gsl_native/vector_complex.c
similarity index 91%
rename from ext/gsl/vector_complex.c
rename to ext/gsl_native/vector_complex.c
index 0b95764..b598746 100644
--- a/ext/gsl/vector_complex.c
+++ b/ext/gsl_native/vector_complex.c
@@ -21,7 +21,7 @@ void get_range_beg_en_n(VALUE range, double *beg, double *en, size_t *n, int *st
 //
 // From vector_source.c
 void parse_subvector_args(int argc, VALUE *argv, size_t size,
-    size_t *offset, size_t *stride, size_t *n);
+                          size_t *offset, size_t *stride, size_t *n);
 
 // From complex.c
 gsl_complex rb_gsl_obj_to_gsl_complex(VALUE obj, gsl_complex *z);
@@ -41,30 +41,30 @@ static VALUE rb_gsl_vector_complex_new(int argc, VALUE *argv, VALUE klass)
       v = gsl_vector_complex_calloc(n);
       if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
       break;
-    case T_ARRAY: 
+    case T_ARRAY:
       n = RARRAY_LEN(argv[0]);
       v = gsl_vector_complex_alloc(n);
       if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
       for (i = 0; i < n; i++) {
-	z2 = &z;
-	tmp = rb_ary_entry(argv[0], i);
-	if (TYPE(tmp) == T_ARRAY) {
-	  GSL_SET_REAL(z2, NUM2DBL(rb_ary_entry(tmp, 0)));
-	  GSL_SET_IMAG(z2, NUM2DBL(rb_ary_entry(tmp, 1)));
-	} else if (COMPLEX_P(tmp)) {
-	  Data_Get_Struct(tmp, gsl_complex, z2);
-	} else {
-	  rb_raise(rb_eTypeError, 
-		   "wrong argument type %s (Array or Complex expected)", 
-		   rb_class2name(CLASS_OF(tmp)));
-	  
-	}
-	gsl_vector_complex_set(v, i, *z2);
+        z2 = &z;
+        tmp = rb_ary_entry(argv[0], i);
+        if (TYPE(tmp) == T_ARRAY) {
+          GSL_SET_REAL(z2, NUM2DBL(rb_ary_entry(tmp, 0)));
+          GSL_SET_IMAG(z2, NUM2DBL(rb_ary_entry(tmp, 1)));
+        } else if (COMPLEX_P(tmp)) {
+          Data_Get_Struct(tmp, gsl_complex, z2);
+        } else {
+          rb_raise(rb_eTypeError,
+                   "wrong argument type %s (Array or Complex expected)",
+                   rb_class2name(CLASS_OF(tmp)));
+
+        }
+        gsl_vector_complex_set(v, i, *z2);
       }
       break;
     default:
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
       break;
     }
     break;
@@ -75,9 +75,9 @@ static VALUE rb_gsl_vector_complex_new(int argc, VALUE *argv, VALUE klass)
       n = GSL_MIN_INT(x->size, y->size);
       v = gsl_vector_complex_alloc(n);
       for (i = 0; i < n; i++) {
-	z.dat[0] = gsl_vector_get(x, i);
-	z.dat[1] = gsl_vector_get(y, i);
-	gsl_vector_complex_set(v, i, z);
+        z.dat[0] = gsl_vector_get(x, i);
+        z.dat[1] = gsl_vector_get(y, i);
+        gsl_vector_complex_set(v, i, z);
       }
       break;
     }
@@ -86,15 +86,15 @@ static VALUE rb_gsl_vector_complex_new(int argc, VALUE *argv, VALUE klass)
     if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
     for (i = 0; i < n; i++) {
       if (TYPE(argv[i]) == T_ARRAY) {
-	GSL_SET_REAL(&z, NUM2DBL(rb_ary_entry(argv[i], 0)));
-	GSL_SET_IMAG(&z, NUM2DBL(rb_ary_entry(argv[i], 1)));
-	z2 = &z;
+        GSL_SET_REAL(&z, NUM2DBL(rb_ary_entry(argv[i], 0)));
+        GSL_SET_IMAG(&z, NUM2DBL(rb_ary_entry(argv[i], 1)));
+        z2 = &z;
       } else if (COMPLEX_P(argv[i])) {
-	Data_Get_Struct(argv[i], gsl_complex, z2);
+        Data_Get_Struct(argv[i], gsl_complex, z2);
       } else {
-	rb_raise(rb_eTypeError, 
-		 "wrong argument type %s (Array or Complex expected)", 
-		 rb_class2name(CLASS_OF(argv[i])));
+        rb_raise(rb_eTypeError,
+                 "wrong argument type %s (Array or Complex expected)",
+                 rb_class2name(CLASS_OF(argv[i])));
       }
       gsl_vector_complex_set(v, i, *z2);
     }
@@ -175,9 +175,9 @@ static VALUE rb_gsl_vector_complex_get(int argc, VALUE *argv, VALUE obj)
     case T_ARRAY:
       vnew = gsl_vector_complex_alloc(RARRAY_LEN(argv[0]));
       for (j = 0; j < vnew->size; j++) {
-	i = FIX2INT(rb_ary_entry(argv[0], j));
-	if (i < 0) i = v->size + i;
-	gsl_vector_complex_set(vnew, j, gsl_vector_complex_get(v, i));
+        i = FIX2INT(rb_ary_entry(argv[0], j));
+        if (i < 0) i = v->size + i;
+        gsl_vector_complex_set(vnew, j, gsl_vector_complex_get(v, i));
       }
       retval = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
       break;
@@ -207,7 +207,6 @@ static VALUE rb_gsl_vector_complex_set_all(int argc, VALUE *argv, VALUE obj)
   gsl_complex tmp;
 
   if (argc < 1) rb_raise(rb_eArgError, "wrong number of arguments");
-
   Data_Get_Struct(obj, gsl_vector_complex, v);
 
   switch (argc) {
@@ -284,7 +283,6 @@ static VALUE rb_gsl_vector_complex_set(int argc, VALUE *argv, VALUE obj)
   if(argc < 1 || argc > 4) {
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-4)", argc);
   }
-
   Data_Get_Struct(obj, gsl_vector_complex, v);
   other = argv[argc-1];
 
@@ -309,7 +307,6 @@ static VALUE rb_gsl_vector_complex_set(int argc, VALUE *argv, VALUE obj)
     // assignment to v.subvector(...)
     rb_gsl_vector_complex_set_subvector(argc-1, argv, v, other);
   }
-
   return obj;
 }
 
@@ -428,15 +425,15 @@ static VALUE rb_gsl_vector_complex_to_s(VALUE obj)
   if (VECTOR_COMPLEX_COL_P(obj)) {
     for (i = 0; i < v->size; i++) {
       if (i != 0) {
-	rb_str_cat(str, "  ", 2);
+        rb_str_cat(str, "  ", 2);
       }
       z = GSL_COMPLEX_AT(v, i);
       sprintf(buf, "[%4.3e %4.3e]", GSL_REAL(*z), GSL_IMAG(*z));
       if (i != v->size-1) strcat(buf, "\n");
       rb_str_cat(str, buf, strlen(buf));
       if (i >= 10 && i != v->size-1) {
-	rb_str_cat(str, "  ...", 5);
-	break;
+        rb_str_cat(str, "  ...", 5);
+        break;
       }
     }
   } else {
@@ -448,8 +445,8 @@ static VALUE rb_gsl_vector_complex_to_s(VALUE obj)
       sprintf(buf, " [%4.3e %4.3e]", GSL_REAL(*z), GSL_IMAG(*z));
       rb_str_cat(str, buf, strlen(buf));
       if (i >= 10 && i != v->size-1) {
-	rb_str_cat(str, " ...", 4);
-	break;
+        rb_str_cat(str, " ...", 4);
+        break;
       }
     }
   }
@@ -629,10 +626,10 @@ static VALUE rb_gsl_vector_complex_conj(VALUE obj)
   gsl_vector_complex *vout = NULL;
   Data_Get_Struct(obj, gsl_vector_complex, vin);
   vout = gsl_vector_complex_alloc(vin->size);
-  for(i=0; i<vin->size; i++) {
+  for(i = 0; i<vin->size; i++) {
     gsl_vector_complex_set(vout, i,
-        gsl_complex_conjugate(
-          gsl_vector_complex_get(vin, i)));
+                           gsl_complex_conjugate(
+                             gsl_vector_complex_get(vin, i)));
   }
   return Data_Wrap_Struct(VECTOR_COMPLEX_ROW_COL(obj), 0, gsl_vector_complex_free, vout);
 }
@@ -642,10 +639,10 @@ static VALUE rb_gsl_vector_complex_conj_bang(VALUE obj)
   size_t i;
   gsl_vector_complex *v = NULL;
   Data_Get_Struct(obj, gsl_vector_complex, v);
-  for(i=0; i<v->size; i++) {
+  for(i = 0; i<v->size; i++) {
     gsl_vector_complex_set(v, i,
-        gsl_complex_conjugate(
-          gsl_vector_complex_get(v, i)));
+                           gsl_complex_conjugate(
+                             gsl_vector_complex_get(v, i)));
   }
   return obj;
 }
@@ -658,7 +655,7 @@ static VALUE rb_gsl_vector_complex_to_a(VALUE obj)
   VALUE ary;
   Data_Get_Struct(obj, gsl_vector_complex, c);
   ary = rb_ary_new2(c->size*2);
-  for (i = 0, j = 0; i < c->size; i++, j+=2) {
+  for (i = 0, j = 0; i < c->size; i++, j += 2) {
     z = GSL_COMPLEX_AT(c, i);
     rb_ary_store(ary, j, rb_float_new(GSL_REAL(*z)));
     rb_ary_store(ary, j+1, rb_float_new(GSL_IMAG(*z)));
@@ -770,7 +767,7 @@ static VALUE rb_gsl_vector_complex_reverse2(VALUE obj)
   vnew = gsl_vector_complex_alloc(v->size);
   gsl_vector_complex_memcpy(vnew, v);
   gsl_vector_complex_reverse(vnew);
-  if (VECTOR_COMPLEX_ROW_P(obj)) 
+  if (VECTOR_COMPLEX_ROW_P(obj))
     return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
   else
     return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, vnew);
@@ -807,7 +804,6 @@ static VALUE rb_gsl_vector_complex_fftshift_bang(VALUE obj)
       gsl_vector_complex_swap_elements(v, i, i+n/2);
     }
   }
-
   return obj;
 }
 
@@ -829,7 +825,7 @@ static VALUE rb_gsl_vector_complex_fftshift(VALUE obj)
   vvnew = gsl_vector_complex_subvector(vnew, 0, n/2);
   gsl_vector_complex_memcpy(&vvnew.vector, &vv.vector);
 
-  return Data_Wrap_Struct(VECTOR_COMPLEX_ROW_COL(obj), 0, gsl_vector_complex_free, vnew);  
+  return Data_Wrap_Struct(VECTOR_COMPLEX_ROW_COL(obj), 0, gsl_vector_complex_free, vnew);
 }
 
 static VALUE rb_gsl_vector_complex_ifftshift_bang(VALUE obj)
@@ -854,7 +850,6 @@ static VALUE rb_gsl_vector_complex_ifftshift_bang(VALUE obj)
       gsl_vector_complex_swap_elements(v, i, i+n/2);
     }
   }
-
   return obj;
 }
 
@@ -900,8 +895,8 @@ static VALUE rb_gsl_vector_complex_matrix_view(int argc, VALUE *argv, VALUE obj)
     break;
   case 3:
     mv = gsl_matrix_complex_view_alloc();
-    *mv = gsl_matrix_complex_view_vector_with_tda(v, FIX2INT(argv[0]), FIX2INT(argv[1]), 
-				 FIX2INT(argv[2]));
+    *mv = gsl_matrix_complex_view_vector_with_tda(v, FIX2INT(argv[0]), FIX2INT(argv[1]),
+                                                  FIX2INT(argv[2]));
     break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
@@ -911,7 +906,7 @@ static VALUE rb_gsl_vector_complex_matrix_view(int argc, VALUE *argv, VALUE obj)
 }
 
 static VALUE rb_gsl_vector_complex_matrix_view_with_tda(VALUE obj, VALUE nn1, VALUE nn2,
-						VALUE tda)
+                                                        VALUE tda)
 {
   gsl_vector_complex *v = NULL;
   gsl_matrix_complex_view *mv = NULL;
@@ -928,9 +923,9 @@ static VALUE rb_gsl_vector_complex_trans(VALUE obj)
   gsl_vector_complex *v = NULL, *vnew = NULL;
   Data_Get_Struct(obj, gsl_vector_complex, v);
   vnew = make_vector_complex_clone(v);
-  if (VECTOR_COMPLEX_ROW_P(obj)) 
+  if (VECTOR_COMPLEX_ROW_P(obj))
     return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, vnew);
-  else if (VECTOR_COMPLEX_COL_P(obj)) 
+  else if (VECTOR_COMPLEX_COL_P(obj))
     return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
   else {
     rb_raise(rb_eTypeError, "wrong type");
@@ -939,13 +934,13 @@ static VALUE rb_gsl_vector_complex_trans(VALUE obj)
 
 static VALUE rb_gsl_vector_complex_trans2(VALUE obj)
 {
-  if (CLASS_OF(obj) == cgsl_vector_complex) 
+  if (CLASS_OF(obj) == cgsl_vector_complex)
     RBGSL_SET_CLASS(obj, cgsl_vector_complex_col);
-  else if (CLASS_OF(obj) == cgsl_vector_complex_col) 
+  else if (CLASS_OF(obj) == cgsl_vector_complex_col)
     RBGSL_SET_CLASS(obj, cgsl_vector_complex);
   else {
     rb_raise(rb_eRuntimeError, "method trans! for %s is forbidden",
-	     rb_class2name(CLASS_OF(obj)));
+             rb_class2name(CLASS_OF(obj)));
   }
   return obj;
 }
@@ -982,7 +977,7 @@ enum {
 
 static VALUE rb_gsl_vector_complex_arithmetics(int flag, VALUE obj, VALUE bb);
 
-static VALUE rb_gsl_vector_complex_arithmetics(int flag, VALUE obj, VALUE bb) 
+static VALUE rb_gsl_vector_complex_arithmetics(int flag, VALUE obj, VALUE bb)
 {
   gsl_vector *b = NULL;
   gsl_vector_complex *cv = NULL, *cvnew = NULL, *cb = NULL;
@@ -1037,20 +1032,20 @@ static VALUE rb_gsl_vector_complex_arithmetics(int flag, VALUE obj, VALUE bb)
       switch (flag) {
       case GSL_VECTOR_COMPLEX_ADD:
       case GSL_VECTOR_COMPLEX_ADD_BANG:
-	gsl_vector_complex_add(cvnew, cb);
-	break;
+        gsl_vector_complex_add(cvnew, cb);
+        break;
       case GSL_VECTOR_COMPLEX_SUB:
       case GSL_VECTOR_COMPLEX_SUB_BANG:
-	gsl_vector_complex_sub(cvnew, cb);
-	break;
+        gsl_vector_complex_sub(cvnew, cb);
+        break;
       case GSL_VECTOR_COMPLEX_MUL:
       case GSL_VECTOR_COMPLEX_MUL_BANG:
-	gsl_vector_complex_mul(cvnew, cb);
-	break;
+        gsl_vector_complex_mul(cvnew, cb);
+        break;
       case GSL_VECTOR_COMPLEX_DIV:
       case GSL_VECTOR_COMPLEX_DIV_BANG:
-	gsl_vector_complex_div(cvnew, cb);
-	break;
+        gsl_vector_complex_div(cvnew, cb);
+        break;
       }
       gsl_vector_complex_free(cb);
     } else if (VECTOR_COMPLEX_P(bb)) {
@@ -1058,40 +1053,40 @@ static VALUE rb_gsl_vector_complex_arithmetics(int flag, VALUE obj, VALUE bb)
       switch (flag) {
       case GSL_VECTOR_COMPLEX_ADD:
       case GSL_VECTOR_COMPLEX_ADD_BANG:
-	gsl_vector_complex_add(cvnew, cb);
-	break;
+        gsl_vector_complex_add(cvnew, cb);
+        break;
       case GSL_VECTOR_COMPLEX_SUB:
       case GSL_VECTOR_COMPLEX_SUB_BANG:
-	gsl_vector_complex_sub(cvnew, cb);
-	break;
+        gsl_vector_complex_sub(cvnew, cb);
+        break;
       case GSL_VECTOR_COMPLEX_MUL:
       case GSL_VECTOR_COMPLEX_MUL_BANG:
-	gsl_vector_complex_mul(cvnew, cb);
-	break;
+        gsl_vector_complex_mul(cvnew, cb);
+        break;
       case GSL_VECTOR_COMPLEX_DIV:
       case GSL_VECTOR_COMPLEX_DIV_BANG:
-	gsl_vector_complex_div(cvnew, cb);
-	break;
+        gsl_vector_complex_div(cvnew, cb);
+        break;
       }
     } else if (COMPLEX_P(bb)) {
       Data_Get_Struct(bb, gsl_complex, c);
       switch (flag) {
       case GSL_VECTOR_COMPLEX_ADD:
       case GSL_VECTOR_COMPLEX_ADD_BANG:
-	gsl_vector_complex_add_constant(cvnew, *c);
-	break;
+        gsl_vector_complex_add_constant(cvnew, *c);
+        break;
       case GSL_VECTOR_COMPLEX_SUB:
       case GSL_VECTOR_COMPLEX_SUB_BANG:
-	gsl_vector_complex_add_constant(cvnew, gsl_complex_negative(*c));
-	break;
+        gsl_vector_complex_add_constant(cvnew, gsl_complex_negative(*c));
+        break;
       case GSL_VECTOR_COMPLEX_MUL:
       case GSL_VECTOR_COMPLEX_MUL_BANG:
-	gsl_vector_complex_scale(cvnew, *c);
-	break;
+        gsl_vector_complex_scale(cvnew, *c);
+        break;
       case GSL_VECTOR_COMPLEX_DIV:
       case GSL_VECTOR_COMPLEX_DIV_BANG:
-	gsl_vector_complex_scale(cvnew, gsl_complex_inverse(*c));
-	break;
+        gsl_vector_complex_scale(cvnew, gsl_complex_inverse(*c));
+        break;
       }
     } else {
       rb_raise(rb_eTypeError, "wrong type argument %s", rb_class2name(CLASS_OF(bb)));
@@ -1186,22 +1181,22 @@ static VALUE rb_gsl_vector_complex_inner_product(int argc, VALUE *argv, VALUE ob
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     if (!VECTOR_COMPLEX_ROW_P(argv[0]))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector::Complex expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     if (!VECTOR_COMPLEX_COL_P(argv[1]))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector::Complex::Col expected)",
-	       rb_class2name(CLASS_OF(argv[1])));
+               rb_class2name(CLASS_OF(argv[1])));
     Data_Get_Struct(argv[0], gsl_vector_complex, v);
     Data_Get_Struct(argv[1], gsl_vector_complex, v2);
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     if (!VECTOR_COMPLEX_COL_P(argv[0]))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector::Complex::Col expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     Data_Get_Struct(obj, gsl_vector_complex, v);
     Data_Get_Struct(argv[0], gsl_vector_complex, v2);
     break;
@@ -1229,25 +1224,25 @@ static VALUE rb_gsl_vector_complex_product_to_m(int argc, VALUE *argv, VALUE obj
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     if (!VECTOR_COMPLEX_COL_P(argv[0]))
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s (GSL::Vector::Complex::Col expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s (GSL::Vector::Complex::Col expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     if (!VECTOR_COMPLEX_ROW_P(argv[1]))
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s (GSL::Vector::Complex expected)",
-	       rb_class2name(CLASS_OF(argv[1])));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s (GSL::Vector::Complex expected)",
+               rb_class2name(CLASS_OF(argv[1])));
     Data_Get_Struct(argv[0], gsl_vector_complex, v);
     Data_Get_Struct(argv[1], gsl_vector_complex, v2);
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     if (!VECTOR_COMPLEX_ROW_P(argv[0]))
-      rb_raise(rb_eTypeError, 
-	       "wrong argument type %s (GSL::Vector::Complex expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError,
+               "wrong argument type %s (GSL::Vector::Complex expected)",
+               rb_class2name(CLASS_OF(argv[0])));
     Data_Get_Struct(obj, gsl_vector_complex, v);
     Data_Get_Struct(argv[0], gsl_vector_complex, v2);
     break;
@@ -1324,8 +1319,8 @@ static VALUE rb_gsl_vector_complex_XXXz_bang(VALUE obj, gsl_complex (*f)(gsl_com
   return obj;
 }
 
-static VALUE rb_gsl_vector_complex_XXXz2(VALUE obj, VALUE a, 
-					 gsl_complex (*f)(gsl_complex, gsl_complex))
+static VALUE rb_gsl_vector_complex_XXXz2(VALUE obj, VALUE a,
+                                         gsl_complex (*f)(gsl_complex, gsl_complex))
 {
   gsl_vector_complex *m, *v;
   gsl_complex c, *z;
@@ -1341,8 +1336,8 @@ static VALUE rb_gsl_vector_complex_XXXz2(VALUE obj, VALUE a,
   return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, v);
 }
 
-static VALUE rb_gsl_vector_complex_XXXz2_bang(VALUE obj, VALUE a, 
-					 gsl_complex (*f)(gsl_complex, gsl_complex))
+static VALUE rb_gsl_vector_complex_XXXz2_bang(VALUE obj, VALUE a,
+                                              gsl_complex (*f)(gsl_complex, gsl_complex))
 {
   gsl_vector_complex *v;
   gsl_complex c, *z;
@@ -1443,7 +1438,7 @@ static gsl_complex rb_gsl_vector_complex_sum_gsl(gsl_vector_complex * v)
   size_t i;
   gsl_complex z = gsl_complex_rect(0.0,0.0);
 
-  for(i=0; i<v->size; i++) {
+  for(i = 0; i<v->size; i++) {
     z = gsl_complex_add(z, gsl_vector_complex_get(v,i));
   }
   return z;
@@ -1462,7 +1457,7 @@ static double rb_gsl_vector_complex_tss_m_gsl(gsl_vector_complex * v, gsl_comple
   size_t i;
   double tss = 0.0;
 
-  for(i=0; i<v->size; i++) {
+  for(i = 0; i<v->size; i++) {
     tss += gsl_complex_abs2(gsl_complex_sub(gsl_vector_complex_get(v,i), mean));
   }
   return tss;
@@ -1522,7 +1517,7 @@ static double rb_gsl_vector_complex_sd_gsl(gsl_vector_complex * v)
  * (e.g. sum and mean)
  */
 static VALUE rb_gsl_vector_complex_z_stats_v(VALUE obj,
-    gsl_complex (*func)(gsl_vector_complex*))
+                                             gsl_complex (*func)(gsl_vector_complex*))
 {
   gsl_vector_complex * v;
   gsl_complex * zp;
@@ -1531,7 +1526,7 @@ static VALUE rb_gsl_vector_complex_z_stats_v(VALUE obj,
   CHECK_VECTOR_COMPLEX(obj);
   Data_Get_Struct(obj, gsl_vector_complex, v);
 
-  zv = Data_Make_Struct(cgsl_complex, gsl_complex, 0, free, zp); 
+  zv = Data_Make_Struct(cgsl_complex, gsl_complex, 0, free, zp);
   *zp = func(v);
 
   return zv;
@@ -1542,7 +1537,7 @@ static VALUE rb_gsl_vector_complex_z_stats_v(VALUE obj,
  * (e.g. tss, variance, sd)
  */
 static VALUE rb_gsl_vector_complex_d_stats_v(VALUE obj,
-    double (*func)(gsl_vector_complex*))
+                                             double (*func)(gsl_vector_complex*))
 {
   gsl_vector_complex * v;
   double d;
@@ -1560,7 +1555,7 @@ static VALUE rb_gsl_vector_complex_d_stats_v(VALUE obj,
  * (e.g. tss_m, variance_m, sd_m, variance_fm, sd_fm)
  */
 static VALUE rb_gsl_vector_complex_d_stats_v_z(VALUE obj, VALUE arg,
-    double (*func)(gsl_vector_complex*, gsl_complex))
+                                               double (*func)(gsl_vector_complex*, gsl_complex))
 {
   gsl_vector_complex * v;
   gsl_complex z;
@@ -1773,58 +1768,58 @@ static VALUE rb_gsl_vector_complex_concat(VALUE obj, VALUE other)
   Data_Get_Struct(obj, gsl_vector_complex, v);
 
   switch(TYPE(other)) {
-    case T_FIXNUM:
-    case T_BIGNUM:
-    case T_FLOAT:
+  case T_FIXNUM:
+  case T_BIGNUM:
+  case T_FLOAT:
+    vnew = gsl_vector_complex_alloc(v->size + 1);
+    vv = gsl_vector_complex_subvector(vnew, 0, v->size);
+    gsl_vector_complex_memcpy(&vv.vector, v);
+    gsl_vector_complex_set(vnew, v->size, rb_gsl_obj_to_gsl_complex(other, NULL));
+    break;
+
+  case T_ARRAY:
+    size2 = RARRAY_LEN(other);
+    vnew = gsl_vector_complex_alloc(v->size + size2);
+    vv = gsl_vector_complex_subvector(vnew, 0, v->size);
+    gsl_vector_complex_memcpy(&vv.vector, v);
+    for (i = 0; i < size2; i++) {
+      x = rb_ary_entry(other, i);
+      gsl_vector_complex_set(vnew, v->size + i, rb_gsl_obj_to_gsl_complex(x, NULL));
+    }
+    break;
+
+  default:
+    if(rb_obj_is_kind_of(other, cgsl_complex)) {
       vnew = gsl_vector_complex_alloc(v->size + 1);
       vv = gsl_vector_complex_subvector(vnew, 0, v->size);
       gsl_vector_complex_memcpy(&vv.vector, v);
       gsl_vector_complex_set(vnew, v->size, rb_gsl_obj_to_gsl_complex(other, NULL));
-      break;
-
-    case T_ARRAY:
-      size2 = RARRAY_LEN(other);
+    } else if(rb_obj_is_kind_of(other, rb_cRange)) {
+      get_range_beg_en_n(other, &beg, &end, &size2, &step);
       vnew = gsl_vector_complex_alloc(v->size + size2);
       vv = gsl_vector_complex_subvector(vnew, 0, v->size);
       gsl_vector_complex_memcpy(&vv.vector, v);
+      GSL_SET_COMPLEX(&tmp, beg, 0.0);
       for (i = 0; i < size2; i++) {
-        x = rb_ary_entry(other, i);
-        gsl_vector_complex_set(vnew, v->size + i, rb_gsl_obj_to_gsl_complex(x, NULL));
+        gsl_vector_complex_set(vnew, v->size + i, tmp);
+        GSL_SET_REAL(&tmp, GSL_REAL(tmp) + step);
       }
-      break;
-
-    default:
-      if(rb_obj_is_kind_of(other, cgsl_complex)) {
-        vnew = gsl_vector_complex_alloc(v->size + 1);
-        vv = gsl_vector_complex_subvector(vnew, 0, v->size);
-        gsl_vector_complex_memcpy(&vv.vector, v);
-        gsl_vector_complex_set(vnew, v->size, rb_gsl_obj_to_gsl_complex(other, NULL));
-      } else if(rb_obj_is_kind_of(other, rb_cRange)) {
-        get_range_beg_en_n(other, &beg, &end, &size2, &step);
-        vnew = gsl_vector_complex_alloc(v->size + size2);
-        vv = gsl_vector_complex_subvector(vnew, 0, v->size);
-        gsl_vector_complex_memcpy(&vv.vector, v);
-        GSL_SET_COMPLEX(&tmp, beg, 0.0);
-        for (i = 0; i < size2; i++) {
-          gsl_vector_complex_set(vnew, v->size + i, tmp);
-          GSL_SET_REAL(&tmp, GSL_REAL(tmp) + step);
-        }
-      } else if (rb_obj_is_kind_of(other, cgsl_vector_complex)) {
-        Data_Get_Struct(other, gsl_vector_complex, v2);
-        size2 = v2->size;
-        vnew = gsl_vector_complex_alloc(v->size + size2);
-        vv = gsl_vector_complex_subvector(vnew, 0, v->size);
-        gsl_vector_complex_memcpy(&vv.vector, v);
-        vv = gsl_vector_complex_subvector(vnew, v->size, size2);
-        gsl_vector_complex_memcpy(&vv.vector, v2);
-      } else {
-        rb_raise(rb_eTypeError, "wrong argument type %s (Array, Numeric, Range, GSL::Complex, or %s expected)",
-            rb_class2name(CLASS_OF(other)), rb_class2name(cgsl_vector_complex));
-      }
-      break;
+    } else if (rb_obj_is_kind_of(other, cgsl_vector_complex)) {
+      Data_Get_Struct(other, gsl_vector_complex, v2);
+      size2 = v2->size;
+      vnew = gsl_vector_complex_alloc(v->size + size2);
+      vv = gsl_vector_complex_subvector(vnew, 0, v->size);
+      gsl_vector_complex_memcpy(&vv.vector, v);
+      vv = gsl_vector_complex_subvector(vnew, v->size, size2);
+      gsl_vector_complex_memcpy(&vv.vector, v2);
+    } else {
+      rb_raise(rb_eTypeError, "wrong argument type %s (Array, Numeric, Range, GSL::Complex, or %s expected)",
+               rb_class2name(CLASS_OF(other)), rb_class2name(cgsl_vector_complex));
+    }
+    break;
   }
 
-  return Data_Wrap_Struct(VECTOR_COMPLEX_ROW_COL(obj), 0, gsl_vector_complex_free, vnew);  
+  return Data_Wrap_Struct(VECTOR_COMPLEX_ROW_COL(obj), 0, gsl_vector_complex_free, vnew);
 }
 
 static VALUE rb_gsl_vector_complex_block(VALUE obj)
@@ -1958,7 +1953,7 @@ static VALUE rb_gsl_vector_complex_zip(int argc, VALUE *argv, VALUE obj)
     argv2 = argv;
   } else {
     if (argc < 1) rb_raise(rb_eArgError, "Too few arguments.");
-    Data_Get_Struct(argv[0], gsl_vector_complex, v0);    
+    Data_Get_Struct(argv[0], gsl_vector_complex, v0);
     argc2 = argc - 1;
     argv2 = argv + 1;
   }
@@ -1975,14 +1970,13 @@ static VALUE rb_gsl_vector_complex_zip(int argc, VALUE *argv, VALUE obj)
     gsl_vector_complex_set(vnew, 0, gsl_vector_complex_get(v0, i));
     for (j = 0; (int) j < argc2; j++) {
       if (i < vp[j]->size) {
-	gsl_vector_complex_set(vnew, j+1, gsl_vector_complex_get(vp[j], i));
+        gsl_vector_complex_set(vnew, j+1, gsl_vector_complex_get(vp[j], i));
       } else {
-	gsl_vector_complex_set(vnew, j+1, zzero);
+        gsl_vector_complex_set(vnew, j+1, zzero);
       }
     }
     rb_ary_store(ary, i, Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew));
   }
-  
   free((gsl_vector_complex**) vp);
   return ary;
 }
@@ -1991,7 +1985,7 @@ static VALUE rb_gsl_vector_complex_zip(int argc, VALUE *argv, VALUE obj)
 // function, but it only determines absolute equality (i.e. is has no epsilon
 // argument).
 static int gsl_vector_complex_equal_eps(const gsl_vector_complex *v1,
-  const gsl_vector_complex *v2, double eps)
+                                        const gsl_vector_complex *v2, double eps)
 {
   gsl_complex z1, z2;
   size_t i;
@@ -2002,7 +1996,7 @@ static int gsl_vector_complex_equal_eps(const gsl_vector_complex *v1,
     if (!rbgsl_complex_equal(&z1, &z2, eps)) return 0;
   }
   return 1;
-  
+
 }
 
 static VALUE rb_gsl_vector_complex_equal(int argc, VALUE *argv, VALUE obj)
@@ -2043,8 +2037,8 @@ void Init_gsl_vector_complex(VALUE module)
   rb_define_singleton_method(cgsl_vector_complex, "alloc", rb_gsl_vector_complex_new, -1);
   rb_define_singleton_method(cgsl_vector_complex, "calloc", rb_gsl_vector_complex_calloc, 1);
 
-  rb_define_singleton_method(cgsl_vector_complex_col, "new", 
-			     rb_gsl_vector_complex_row_new, -1);
+  rb_define_singleton_method(cgsl_vector_complex_col, "new",
+                             rb_gsl_vector_complex_row_new, -1);
 
   rb_define_method(cgsl_vector_complex, "size", rb_gsl_vector_complex_size, 0);
   rb_define_alias(cgsl_vector_complex, "len", "size");
@@ -2103,7 +2097,7 @@ void Init_gsl_vector_complex(VALUE module)
   rb_define_method(cgsl_vector_complex, "subvector", rb_gsl_vector_complex_subvector, -1);
   rb_define_alias(cgsl_vector_complex, "view", "subvector");
   rb_define_method(cgsl_vector_complex, "subvector_with_stride", rb_gsl_vector_complex_subvector_with_stride, 3);
-  
+
   rb_define_singleton_method(cgsl_vector_complex, "memcpy", rb_gsl_vector_complex_memcpy, 2);
   rb_define_method(cgsl_vector_complex, "clone", rb_gsl_vector_complex_clone, 0);
   rb_define_alias(cgsl_vector_complex, "duplicate", "clone");
@@ -2132,17 +2126,17 @@ void Init_gsl_vector_complex(VALUE module)
   rb_define_alias(cgsl_vector_complex_col, "row", "trans");
   rb_define_alias(cgsl_vector_complex_col, "row!", "trans!");
 
-   /*****/
+  /*****/
   rb_define_method(cgsl_vector_complex, "to_real", rb_gsl_vector_complex_to_real, 0);
 
-  rb_define_method(cgsl_vector_complex, "add", rb_gsl_vector_complex_add, 1);  
-  rb_define_method(cgsl_vector_complex, "sub", rb_gsl_vector_complex_sub, 1);  
-  rb_define_method(cgsl_vector_complex, "mul", rb_gsl_vector_complex_mul, 1);  
-  rb_define_method(cgsl_vector_complex, "div", rb_gsl_vector_complex_div, 1);  
-  rb_define_method(cgsl_vector_complex, "add!", rb_gsl_vector_complex_add_bang, 1);  
-  rb_define_method(cgsl_vector_complex, "sub!", rb_gsl_vector_complex_sub_bang, 1);  
-  rb_define_method(cgsl_vector_complex, "mul!", rb_gsl_vector_complex_mul_bang, 1);  
-  rb_define_method(cgsl_vector_complex, "div!", rb_gsl_vector_complex_div_bang, 1);  
+  rb_define_method(cgsl_vector_complex, "add", rb_gsl_vector_complex_add, 1);
+  rb_define_method(cgsl_vector_complex, "sub", rb_gsl_vector_complex_sub, 1);
+  rb_define_method(cgsl_vector_complex, "mul", rb_gsl_vector_complex_mul, 1);
+  rb_define_method(cgsl_vector_complex, "div", rb_gsl_vector_complex_div, 1);
+  rb_define_method(cgsl_vector_complex, "add!", rb_gsl_vector_complex_add_bang, 1);
+  rb_define_method(cgsl_vector_complex, "sub!", rb_gsl_vector_complex_sub_bang, 1);
+  rb_define_method(cgsl_vector_complex, "mul!", rb_gsl_vector_complex_mul_bang, 1);
+  rb_define_method(cgsl_vector_complex, "div!", rb_gsl_vector_complex_div_bang, 1);
 
   rb_define_alias(cgsl_vector_complex, "+", "add");
   rb_define_alias(cgsl_vector_complex, "add_constant", "add");
@@ -2153,7 +2147,7 @@ void Init_gsl_vector_complex(VALUE module)
   rb_define_alias(cgsl_vector_complex, "scale!", "mul!");
   rb_define_alias(cgsl_vector_complex, "/", "div");
 
-  rb_define_method(cgsl_vector_complex, "coerce", rb_gsl_vector_complex_coerce, 1);  
+  rb_define_method(cgsl_vector_complex, "coerce", rb_gsl_vector_complex_coerce, 1);
 
   /* 2.Aug.2004 */
   rb_define_singleton_method(cgsl_vector_complex, "inner_product", rb_gsl_vector_complex_inner_product, -1);
@@ -2238,10 +2232,10 @@ void Init_gsl_vector_complex(VALUE module)
 
   rb_define_method(cgsl_vector_complex, "zip", rb_gsl_vector_complex_zip, -1);
   rb_define_singleton_method(cgsl_vector_complex, "zip", rb_gsl_vector_complex_zip, -1);
-  
+
   rb_define_method(cgsl_vector_complex, "equal?", rb_gsl_vector_complex_equal, -1);
   rb_define_alias(cgsl_vector_complex, "==", "equal?");
   rb_define_method(cgsl_vector_complex, "not_equal?", rb_gsl_vector_complex_not_equal, -1);
-  rb_define_alias(cgsl_vector_complex, "!=", "not_equal?");  
+  rb_define_alias(cgsl_vector_complex, "!=", "not_equal?");
 }
 
diff --git a/ext/gsl/vector_double.c b/ext/gsl_native/vector_double.c
similarity index 85%
rename from ext/gsl/vector_double.c
rename to ext/gsl_native/vector_double.c
index 894489d..1c022d2 100644
--- a/ext/gsl/vector_double.c
+++ b/ext/gsl_native/vector_double.c
@@ -14,9 +14,7 @@
 #include "include/rb_gsl_histogram.h"
 #include "include/rb_gsl_complex.h"
 #include "include/rb_gsl_poly.h"
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
 VALUE rb_gsl_vector_inner_product(int argc, VALUE *argv, VALUE obj);
 static VALUE rb_gsl_vector_product_to_m(int argc, VALUE *argv, VALUE obj);
@@ -24,7 +22,7 @@ VALUE rb_gsl_vector_int_to_f(VALUE obj);
 VALUE rb_ary_to_gv(VALUE klass, VALUE ary);
 
 static VALUE rb_gsl_vector_Xspace(double min, double max, int i,
-				  gsl_vector* (*f)(const double, const double, const size_t))
+                                  gsl_vector* (*f)(const double, const double, const size_t))
 {
   gsl_vector *v = NULL;
   size_t n;
@@ -35,8 +33,8 @@ static VALUE rb_gsl_vector_Xspace(double min, double max, int i,
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
 }
 
-static gsl_vector* gsl_vector_linspace(const double min, 
-				       const double max, const size_t n)
+static gsl_vector* gsl_vector_linspace(const double min,
+                                       const double max, const size_t n)
 {
   gsl_vector *v = NULL;
   double dx;
@@ -53,8 +51,8 @@ static gsl_vector* gsl_vector_linspace(const double min,
   return v;
 }
 
-static gsl_vector* gsl_vector_logspace(const double min, 
-				       const double max, const size_t n)
+static gsl_vector* gsl_vector_logspace(const double min,
+                                       const double max, const size_t n)
 {
   gsl_vector *v = NULL;
   double dx;
@@ -86,9 +84,9 @@ static VALUE rb_gsl_vector_linspace(int argc, VALUE *argv, VALUE klass)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
     break;
   }
-  Need_Float(argv[0]);   Need_Float(argv[1]); 
+  Need_Float(argv[0]);   Need_Float(argv[1]);
   return rb_gsl_vector_Xspace(NUM2DBL(argv[0]), NUM2DBL(argv[1]), n,
-			      gsl_vector_linspace);
+                              gsl_vector_linspace);
 }
 
 static VALUE rb_gsl_vector_logspace(int argc, VALUE *argv, VALUE klass)
@@ -106,9 +104,9 @@ static VALUE rb_gsl_vector_logspace(int argc, VALUE *argv, VALUE klass)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
     break;
   }
-  Need_Float(argv[0]);   Need_Float(argv[1]); 
+  Need_Float(argv[0]);   Need_Float(argv[1]);
   return rb_gsl_vector_Xspace(NUM2DBL(argv[0]), NUM2DBL(argv[1]), n,
-			      gsl_vector_logspace);
+                              gsl_vector_logspace);
 }
 
 static VALUE rb_gsl_vector_logspace2(int argc, VALUE *argv, VALUE klass)
@@ -126,10 +124,10 @@ static VALUE rb_gsl_vector_logspace2(int argc, VALUE *argv, VALUE klass)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
     break;
   }
-  Need_Float(argv[0]);   Need_Float(argv[1]); 
-  return rb_gsl_vector_Xspace(log10(NUM2DBL(argv[0])), 
-			      log10(NUM2DBL(argv[1])), n,
-			      gsl_vector_logspace);
+  Need_Float(argv[0]);   Need_Float(argv[1]);
+  return rb_gsl_vector_Xspace(log10(NUM2DBL(argv[0])),
+                              log10(NUM2DBL(argv[1])), n,
+                              gsl_vector_logspace);
 }
 
 /********************************************************/
@@ -144,7 +142,7 @@ enum {
   GSL_VECTOR_DIV,
 };
 
-static VALUE rb_gsl_vector_arithmetics(int flag, VALUE obj, VALUE bb) 
+static VALUE rb_gsl_vector_arithmetics(int flag, VALUE obj, VALUE bb)
 {
   gsl_vector *v = NULL, *vnew = NULL, *b = NULL;
   gsl_vector_complex *cvnew = NULL, *cb = NULL;
@@ -171,9 +169,9 @@ static VALUE rb_gsl_vector_arithmetics(int flag, VALUE obj, VALUE bb)
       gsl_vector_scale(vnew, 1.0/NUM2DBL(bb));
       break;
     }
-    if (!VECTOR_VIEW_P(obj)) 
+    if (!VECTOR_VIEW_P(obj))
       return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_vector_free, vnew);
-    else 
+    else
       return Data_Wrap_Struct(VECTOR_ROW_COL(obj), 0, gsl_vector_free, vnew);
     break;
   default:
@@ -182,68 +180,68 @@ static VALUE rb_gsl_vector_arithmetics(int flag, VALUE obj, VALUE bb)
       Data_Get_Struct(bb, gsl_vector, b);
       switch (flag) {
       case GSL_VECTOR_ADD:
-	vnew = make_vector_clone(v);
-	gsl_vector_add(vnew, b);
-	break;
+        vnew = make_vector_clone(v);
+        gsl_vector_add(vnew, b);
+        break;
       case GSL_VECTOR_SUB:
-	vnew = make_vector_clone(v);
-	gsl_vector_sub(vnew, b);
-	break;
+        vnew = make_vector_clone(v);
+        gsl_vector_sub(vnew, b);
+        break;
       case GSL_VECTOR_MUL:
-	vnew = make_vector_clone(v);
-	gsl_vector_mul(vnew, b);
-	break;
+        vnew = make_vector_clone(v);
+        gsl_vector_mul(vnew, b);
+        break;
       case GSL_VECTOR_DIV:
-	vnew = make_vector_clone(v);
-	gsl_vector_div(vnew, b);
-	break;
+        vnew = make_vector_clone(v);
+        gsl_vector_div(vnew, b);
+        break;
       }
-      if (!VECTOR_VIEW_P(obj)) 
-	return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_vector_free, vnew);
-      else 
-	return Data_Wrap_Struct(VECTOR_ROW_COL(obj), 0, gsl_vector_free, vnew);
+      if (!VECTOR_VIEW_P(obj))
+        return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_vector_free, vnew);
+      else
+        return Data_Wrap_Struct(VECTOR_ROW_COL(obj), 0, gsl_vector_free, vnew);
     } else if (VECTOR_COMPLEX_P(bb)) {
       Data_Get_Struct(bb, gsl_vector_complex, cb);
       cvnew = vector_to_complex(v);
       switch (flag) {
       case GSL_VECTOR_ADD:
-	gsl_vector_complex_add(cvnew, cb);
-	break;
+        gsl_vector_complex_add(cvnew, cb);
+        break;
       case GSL_VECTOR_SUB:
-	gsl_vector_complex_sub(cvnew, cb);
-	break;
+        gsl_vector_complex_sub(cvnew, cb);
+        break;
       case GSL_VECTOR_MUL:
-	gsl_vector_complex_mul(cvnew, cb);
-	break;
+        gsl_vector_complex_mul(cvnew, cb);
+        break;
       case GSL_VECTOR_DIV:
-	gsl_vector_complex_div(cvnew, cb);
-	break;
+        gsl_vector_complex_div(cvnew, cb);
+        break;
       }
       if (VECTOR_COL_P(obj))
-	return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cvnew);
+        return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cvnew);
       else
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
     } else if (COMPLEX_P(bb)) {
       Data_Get_Struct(bb, gsl_complex, c);
       cvnew = vector_to_complex(v);
       switch (flag) {
       case GSL_VECTOR_ADD:
-	gsl_vector_complex_add_constant(cvnew, *c);
-	break;
+        gsl_vector_complex_add_constant(cvnew, *c);
+        break;
       case GSL_VECTOR_SUB:
-	gsl_vector_complex_add_constant(cvnew, gsl_complex_negative(*c));
-	break;
+        gsl_vector_complex_add_constant(cvnew, gsl_complex_negative(*c));
+        break;
       case GSL_VECTOR_MUL:
-	gsl_vector_complex_scale(cvnew, *c);
-	break;
+        gsl_vector_complex_scale(cvnew, *c);
+        break;
       case GSL_VECTOR_DIV:
-	gsl_vector_complex_scale(cvnew, gsl_complex_inverse(*c));
-	break;
+        gsl_vector_complex_scale(cvnew, gsl_complex_inverse(*c));
+        break;
       }
-      if (VECTOR_COL_P(obj)) 
-	return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cvnew);
+      if (VECTOR_COL_P(obj))
+        return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cvnew);
       else
-	return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
+        return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cvnew);
     } else {
       rb_raise(rb_eTypeError, "wrong type argument %s", rb_class2name(CLASS_OF(bb)));
     }
@@ -412,17 +410,17 @@ static VALUE rb_gsl_vector_coerce(VALUE obj, VALUE other)
       cv = gsl_vector_complex_alloc(v->size);
       if (cv == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
       gsl_vector_complex_set_all(cv, *c);
-      if (VECTOR_ROW_P(obj)) 
-	vv = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cv);
+      if (VECTOR_ROW_P(obj))
+        vv = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cv);
       else
-	vv = Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cv);
+        vv = Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cv);
       return rb_ary_new3(2, vv, obj);
     } else if (VECTOR_COMPLEX_P(other)) {
       cv = vector_to_complex(v);
-      if (VECTOR_ROW_P(obj)) 
-	vv = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cv);
+      if (VECTOR_ROW_P(obj))
+        vv = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, cv);
       else
-	vv = Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cv);
+        vv = Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, cv);
       return rb_ary_new3(2, other, vv);
     } else {
       rb_raise(rb_eTypeError, "cannot coerced");
@@ -442,25 +440,25 @@ static VALUE rb_gsl_vector_product_to_m(int argc, VALUE *argv, VALUE obj)
   case T_CLASS:
   case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     if (!VECTOR_COL_P(argv[0]))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector::Col expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     if (!VECTOR_ROW_P(argv[1]))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector expected)",
-	       rb_class2name(CLASS_OF(argv[1])));
+               rb_class2name(CLASS_OF(argv[1])));
     Data_Get_Struct(argv[0], gsl_vector, v);
     Data_Get_Struct(argv[1], gsl_vector, v2);
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     if (!VECTOR_COL_P(obj))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector::Col expected)",
-	       rb_class2name(CLASS_OF(obj)));
+               rb_class2name(CLASS_OF(obj)));
     if (!VECTOR_ROW_P(argv[0]))
       rb_raise(rb_eTypeError, "wrong argument type %s (GSL::Vector expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     Data_Get_Struct(obj, gsl_vector, v);
     Data_Get_Struct(argv[0], gsl_vector, v2);
     break;
@@ -491,7 +489,7 @@ VALUE rb_gsl_vector_to_i(VALUE obj)
     val = (int) gsl_vector_get(v, i);
     gsl_vector_int_set(vi, i, val);
   }
-  if (VECTOR_COL_P(obj)) 
+  if (VECTOR_COL_P(obj))
     return Data_Wrap_Struct(cgsl_vector_int_col, 0, gsl_vector_int_free, vi);
   else
     return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, vi);
@@ -503,9 +501,21 @@ static void draw_hist(VALUE obj, FILE *fp);
 static void draw_vector(VALUE obj, FILE *fp);
 static void draw_vector2(VALUE xx, VALUE yy, FILE *fp);
 static void draw_vector_array(VALUE ary, FILE *fp);
+
 #ifdef HAVE_NARRAY_H
-static void draw_narray(VALUE obj, FILE *fp);
+static void draw_narray(VALUE obj, FILE *fp)
+{
+  struct NARRAY *na;
+  double *ptr;
+  size_t j;
+  GetNArray(obj, na);
+  ptr = (double *) na->ptr;
+  for (j = 0; j < na->total; j++)
+    fprintf(fp, "%d %g\n", (int) j, ptr[j]);
+  fflush(fp);
+}
 #endif // HAVE_NARRAY_H
+
 #endif // HAVE_GNU_GRAPH
 
 static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
@@ -520,7 +530,6 @@ static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
   FILE *fp = NULL;
   if (argc < 1)
     rb_raise(rb_eArgError, "two few arguments");
-
   if (TYPE(argv[argc-1]) == T_STRING) {
     sprintf(command, "graph -T X %s", STR2CSTR(argv[argc-1]));
     iend = argc-1;
@@ -528,7 +537,6 @@ static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
     strcpy(command, "graph -T X -C -g 3");
     iend = argc;
   }
-
   if (iend == 1) {
     fp = popen(command, "w");
     if (fp == NULL) rb_raise(rb_eIOError, "GNU graph not found.");
@@ -544,8 +552,8 @@ static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
 #endif
     } else {
       if (fp) pclose(fp);
-      rb_raise(rb_eTypeError, "wrong argument type %s", 
-	       rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError, "wrong argument type %s",
+               rb_class2name(CLASS_OF(argv[0])));
     }
     if (fp) pclose(fp);
     return Qtrue;
@@ -562,7 +570,7 @@ static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
       x = gsl_vector_alloc(h->n);
       n = x->size;
       for (j = 0; j < x->size; j++)
-	gsl_vector_set(x, j, h->range[j]);
+        gsl_vector_set(x, j, h->range[j]);
       flag = 1;
       draw_hist(argv[0], fp);
       fprintf(fp, "\n");
@@ -578,26 +586,26 @@ static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
     } else if (NIL_P(argv[0])) {
       if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
       if (VECTOR_P(argv[1])) {
-	Data_Get_Struct(argv[1], gsl_vector, y);
-	n = y->size;
+        Data_Get_Struct(argv[1], gsl_vector, y);
+        n = y->size;
       } else if (HISTOGRAM_P(argv[1])) {
-	Data_Get_Struct(argv[1], gsl_histogram, h);
-	n = h->n;
+        Data_Get_Struct(argv[1], gsl_histogram, h);
+        n = h->n;
 #ifdef HAVE_NARRAY_H
       } else if (NA_IsNArray(argv[1])) {
-	n = NA_TOTAL(argv[1]);
+        n = NA_TOTAL(argv[1]);
 #endif
       } else {
-	rb_raise(rb_eTypeError, "wrong argument type %s", 
-		 rb_class2name(CLASS_OF(argv[0])));
+        rb_raise(rb_eTypeError, "wrong argument type %s",
+                 rb_class2name(CLASS_OF(argv[0])));
       }
       x = gsl_vector_alloc(n);
       for (j = 0; j < n; j++) gsl_vector_set(x, j, (double) j);
       flag = 1;
     } else {
       if (fp) pclose(fp);
-      rb_raise(rb_eTypeError, "wrong argument type %s", 
-	       rb_class2name(CLASS_OF(argv[0])));
+      rb_raise(rb_eTypeError, "wrong argument type %s",
+               rb_class2name(CLASS_OF(argv[0])));
     }
     if (flag == 1) vx = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, x);
     for (i = 1; i < iend; i++) {
@@ -607,9 +615,9 @@ static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
 #ifdef HAVE_NARRAY_H
       else if (NA_IsNArray(argv[i])) draw_vector2(vx, argv[i], fp);
 #endif
-      else 
-	rb_raise(rb_eTypeError, "wrong argument type %s", 
-		 rb_class2name(CLASS_OF(argv[i])));
+      else
+        rb_raise(rb_eTypeError, "wrong argument type %s",
+                 rb_class2name(CLASS_OF(argv[i])));
       fprintf(fp, "\n");
       fflush(fp);
     }
@@ -636,9 +644,6 @@ static void draw_vector(VALUE obj, FILE *fp)
 
 static void draw_vector2(VALUE xx, VALUE yy, FILE *fp)
 {
-#ifdef HAVE_NARRAY_H
-  struct NARRAY *nax, *nay;
-#endif // HAVE_NARRAY_H
   double *ptr1 = NULL, *ptr2 = NULL;
   gsl_vector *vx, *vy;
   size_t j, n, stridex = 1, stridey = 1;
@@ -649,6 +654,7 @@ static void draw_vector2(VALUE xx, VALUE yy, FILE *fp)
     stridex = vx->stride;
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(xx)) {
+    struct NARRAY *nax;
     GetNArray(xx, nax);
     ptr1 = (double *) nax->ptr;
     n = nax->total;
@@ -656,7 +662,7 @@ static void draw_vector2(VALUE xx, VALUE yy, FILE *fp)
 #endif // HAVE_NARRAY_H
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Vector expected)",
-	     rb_class2name(CLASS_OF(xx)));
+             rb_class2name(CLASS_OF(xx)));
   }
   if (VECTOR_P(yy)) {
     Data_Get_Struct(yy, gsl_vector, vy);
@@ -665,41 +671,28 @@ static void draw_vector2(VALUE xx, VALUE yy, FILE *fp)
     stridey = vy->stride;
 #ifdef HAVE_NARRAY_H
   } else if (NA_IsNArray(yy)) {
+    struct NARRAY *nay;
     GetNArray(yy, nay);
     ptr2 = (double *) nay->ptr;
     stridey = 1;
 #endif // HAVE_NARRAY_H
   } else {
     rb_raise(rb_eTypeError, "wrong argument type %s (Vector expected)",
-	     rb_class2name(CLASS_OF(yy)));
+             rb_class2name(CLASS_OF(yy)));
   }
   for (j = 0; j < n; j++)
     fprintf(fp, "%g %g\n", ptr1[j*stridex], ptr2[j*stridey]);
   fflush(fp);
 }
 
-#ifdef HAVE_NARRAY_H
-static void draw_narray(VALUE obj, FILE *fp)
-{
-  struct NARRAY *na;
-  double *ptr;
-  size_t j;
-  GetNArray(obj, na);
-  ptr = (double *) na->ptr;
-  for (j = 0; j < na->total; j++)
-    fprintf(fp, "%d %g\n", (int) j, ptr[j]);
-  fflush(fp);
-}
-#endif // HAVE_NARRAY_H
-
 static void draw_hist(VALUE obj, FILE *fp)
 {
   gsl_histogram *h = NULL;
   size_t j;
   Data_Get_Struct(obj, gsl_histogram, h);
   for (j = 0; j < h->n; j++) {
-    fprintf(fp, "%g %g\n%g %g\n", 
-	    h->range[j], h->bin[j], h->range[j+1], h->bin[j]);
+    fprintf(fp, "%g %g\n%g %g\n",
+            h->range[j], h->bin[j], h->range[j+1], h->bin[j]);
   }
   fflush(fp);
 }
@@ -718,7 +711,7 @@ static void draw_vector_array(VALUE ary, FILE *fp)
   case 2:
     ptry = get_vector_ptr(rb_ary_entry(ary, 1), &stridey, &n);
     vx = rb_ary_entry(ary, 0);
-    if (NIL_P(vx)) {flag = 1;}
+    if (NIL_P(vx)) {flag = 1; }
     else {
       ptrx = get_vector_ptr(vx, &stridex, &n);
     }
@@ -727,32 +720,32 @@ static void draw_vector_array(VALUE ary, FILE *fp)
     ptrz = get_vector_ptr(rb_ary_entry(ary, 2), &stridez, &n);
     ptry = get_vector_ptr(rb_ary_entry(ary, 1), &stridey, &n);
     vx = rb_ary_entry(ary, 0);
-    if (NIL_P(vx)) {flag = 2;}
+    if (NIL_P(vx)) {flag = 2; }
     else {
       ptrx = get_vector_ptr(vx, &stridex, &n);
       flag = 3;
     }
     break;
   default:
-    rb_raise(rb_eRuntimeError, "wrong array length (%d for 1 or 2)", 
-	     (int) RARRAY_LEN(ary));
+    rb_raise(rb_eRuntimeError, "wrong array length (%d for 1 or 2)",
+             (int) RARRAY_LEN(ary));
     break;
   }
   switch (flag) {
   case 0:
-    for (j = 0; j < n; j++) 
+    for (j = 0; j < n; j++)
       fprintf(fp, "%g %g\n", ptrx[j*stridex], ptry[j*stridey]);
     break;
   case 1:
-    for (j = 0; j < n; j++) 
+    for (j = 0; j < n; j++)
       fprintf(fp, "%d %g\n", (int) j, ptry[j*stridey]);
     break;
   case 2:
-    for (j = 0; j < n; j++) 
+    for (j = 0; j < n; j++)
       fprintf(fp, "%d %g %g\n", (int) j, ptry[j*stridey], ptrz[j*stridez]);
     break;
   case 3:
-    for (j = 0; j < n; j++) 
+    for (j = 0; j < n; j++)
       fprintf(fp, "%g %g %g\n", ptrx[j*stridex], ptry[j*stridey], ptrz[j*stridez]);
     break;
   default:
@@ -776,7 +769,7 @@ static VALUE rb_gsl_vector_plot2(int argc, VALUE *argv, VALUE obj)
   case 5:
     if (TYPE(argv[4]) == T_STRING)
       sprintf(command, "%s %s", command, STR2CSTR(argv[4]));
-    /* no break */
+  /* no break */
   case 4:
     if (TYPE(argv[3]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[3]));
@@ -784,9 +777,9 @@ static VALUE rb_gsl_vector_plot2(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(argv[3], gsl_vector, yerr);
     } else {
       rb_raise(rb_eTypeError, "argv[3] wrong type %s (String or Vector expected)",
-	       rb_class2name(CLASS_OF(argv[3])));
+               rb_class2name(CLASS_OF(argv[3])));
     }
-    /* no break */
+  /* no break */
   case 3:
     if (TYPE(argv[2]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[2]));
@@ -794,9 +787,9 @@ static VALUE rb_gsl_vector_plot2(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(argv[2], gsl_vector, xerr);
     } else {
       rb_raise(rb_eTypeError, "argv[2] wrong type %s (String or Vector expected)",
-	       rb_class2name(CLASS_OF(argv[2])));
+               rb_class2name(CLASS_OF(argv[2])));
     }
-    /* no break */
+  /* no break */
   case 2:
     if (TYPE(argv[1]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[1]));
@@ -804,9 +797,9 @@ static VALUE rb_gsl_vector_plot2(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(argv[1], gsl_vector, y);
     } else {
       rb_raise(rb_eTypeError, "argv[1] wrong type %s (String or Vector expected)",
-	       rb_class2name(CLASS_OF(argv[1])));
+               rb_class2name(CLASS_OF(argv[1])));
     }
-    /* no break */
+  /* no break */
   case 1:
     if (TYPE(argv[0]) == T_STRING) {
       sprintf(command, "%s %s", command, STR2CSTR(argv[0]));
@@ -814,7 +807,7 @@ static VALUE rb_gsl_vector_plot2(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(argv[0], gsl_vector, x);
     } else {
       rb_raise(rb_eTypeError, "argv[0] wrong type %s (String or Vector expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   default:
@@ -825,16 +818,16 @@ static VALUE rb_gsl_vector_plot2(int argc, VALUE *argv, VALUE obj)
   n = x->size;
   fprintf(fp, "%s\n", command);
   for (i = 0; i < n; i++) {
-    if (y == NULL) 
+    if (y == NULL)
       fprintf(fp, "%d %g\n", (int) i, gsl_vector_get(x, i));
     else if (yerr == NULL)
       fprintf(fp, "%g %g\n", gsl_vector_get(x, i), gsl_vector_get(y, i));
-    else if (xerr) 
+    else if (xerr)
       fprintf(fp, "%g %g %g %g\n", gsl_vector_get(x, i), gsl_vector_get(y, i),
-	      gsl_vector_get(xerr, i), gsl_vector_get(yerr, i));
+              gsl_vector_get(xerr, i), gsl_vector_get(yerr, i));
     else
-     fprintf(fp, "%g %g %g\n", gsl_vector_get(x, i), gsl_vector_get(y, i),
-	     gsl_vector_get(yerr, i));
+      fprintf(fp, "%g %g %g\n", gsl_vector_get(x, i), gsl_vector_get(y, i),
+              gsl_vector_get(yerr, i));
   }
   fprintf(fp, "e\n");
   fflush(fp);
@@ -864,10 +857,10 @@ static VALUE rb_gsl_vector_normalize(int argc, VALUE *argv, VALUE obj)
   vnew = make_vector_clone(v);
   /*  mean = gsl_stats_mean(v->data, v->stride, v->size);
   gsl_vector_add_constant(vnew, -mean);
-  sd = gsl_stats_sd(vnew->data, vnew->stride, vnew->size);  
+  sd = gsl_stats_sd(vnew->data, vnew->stride, vnew->size);
   gsl_vector_scale(vnew, sqrt(nrm)/sd);*/
   gsl_vector_scale(vnew, nrm/gsl_blas_dnrm2(v));
-  return Data_Wrap_Struct(VECTOR_ROW_COL(obj), 0, gsl_vector_free, vnew);  
+  return Data_Wrap_Struct(VECTOR_ROW_COL(obj), 0, gsl_vector_free, vnew);
 }
 
 static VALUE rb_gsl_vector_normalize_bang(int argc, VALUE *argv, VALUE obj)
@@ -891,7 +884,7 @@ static VALUE rb_gsl_vector_normalize_bang(int argc, VALUE *argv, VALUE obj)
   Data_Get_Vector(obj, v);
   /*  mean = gsl_stats_mean(v->data, v->stride, v->size);
   gsl_vector_add_constant(v, -mean);
-  sd = gsl_stats_sd(v->data, v->stride, v->size);  
+  sd = gsl_stats_sd(v->data, v->stride, v->size);
   gsl_vector_scale(v, sqrt(nrm)/sd);*/
   factor = nrm/gsl_blas_dnrm2(v);
   gsl_vector_scale(v, factor);
@@ -941,7 +934,7 @@ static VALUE rb_gsl_vector_filescan_na(VALUE klass, VALUE file)
     for (j = 0; j < n; j++) {
       p = str_scan_double(p, &val);
       if (p) ptr[j][i] = val;
-      else break;      
+      else break;
     }
   }
   fclose(fp);
@@ -958,9 +951,9 @@ static VALUE rb_gsl_vector_decimate(VALUE obj, VALUE nn)
   CHECK_FIXNUM(nn);
   Data_Get_Vector(obj, v);
   n = (size_t) FIX2INT(nn);
-  if (n > v->size) 
-    rb_raise(rb_eArgError, 
-	     "decimation factor must be smaller than the vector length.");
+  if (n > v->size)
+    rb_raise(rb_eArgError,
+             "decimation factor must be smaller than the vector length.");
   if (n == 0) rb_raise(rb_eArgError, "decimation factor must be greater than 1");
   n2 = (size_t) ceil((double)v->size/n);
   vnew = gsl_vector_alloc(n2);
@@ -969,7 +962,7 @@ static VALUE rb_gsl_vector_decimate(VALUE obj, VALUE nn)
     if (i == n2-1) vv = gsl_vector_subvector(v, i*n, n3);
     else vv = gsl_vector_subvector(v, i*n, n);
     gsl_vector_set(vnew, i, gsl_stats_mean(vv.vector.data, vv.vector.stride,
-					   vv.vector.size));
+                                           vv.vector.size));
   }
   return Data_Wrap_Struct(VECTOR_ROW_COL(obj), 0, gsl_vector_free, vnew);
 }
@@ -1077,21 +1070,21 @@ static VALUE rb_gsl_vector_rotate_bang(int argc, VALUE *argv, VALUE klass)
       v0 = rb_ary_entry(argv[0], 0);
       v1 = rb_ary_entry(argv[0], 1);
       if (VECTOR_P(v0) && VECTOR_P(v1)) {
-	Data_Get_Struct(v0, gsl_vector, vx);
-	Data_Get_Struct(v1, gsl_vector, vy);
-	n = (size_t) GSL_MIN(vx->size, vy->size);
-	rad = NUM2DBL(argv[1]);
-	retval = argv[0];
+        Data_Get_Struct(v0, gsl_vector, vx);
+        Data_Get_Struct(v1, gsl_vector, vy);
+        n = (size_t) GSL_MIN(vx->size, vy->size);
+        rad = NUM2DBL(argv[1]);
+        retval = argv[0];
       } else {
-	x = NUM2DBL(rb_ary_entry(argv[0], 0));
-	y = NUM2DBL(rb_ary_entry(argv[0], 1));
-	rad = NUM2DBL(argv[1]);
-	c = cos(rad); s = sin(rad);
-	return rb_ary_new3(2, rb_float_new(c*x - s*y), rb_float_new(s*x + c*y));
+        x = NUM2DBL(rb_ary_entry(argv[0], 0));
+        y = NUM2DBL(rb_ary_entry(argv[0], 1));
+        rad = NUM2DBL(argv[1]);
+        c = cos(rad); s = sin(rad);
+        return rb_ary_new3(2, rb_float_new(c*x - s*y), rb_float_new(s*x + c*y));
       }
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Array expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   case 3:
@@ -1136,19 +1129,19 @@ static VALUE rb_gsl_vector_rotate(int argc, VALUE *argv, VALUE klass)
       v0 = rb_ary_entry(argv[0], 0);
       v1 = rb_ary_entry(argv[0], 1);
       if (VECTOR_P(v0) && VECTOR_P(v1)) {
-	Data_Get_Struct(v0, gsl_vector, vx);
-	Data_Get_Struct(v1, gsl_vector, vy);
-	rad = NUM2DBL(argv[1]);
+        Data_Get_Struct(v0, gsl_vector, vx);
+        Data_Get_Struct(v1, gsl_vector, vy);
+        rad = NUM2DBL(argv[1]);
       } else {
-	x = NUM2DBL(rb_ary_entry(argv[0], 0));
-	y = NUM2DBL(rb_ary_entry(argv[0], 1));
-	rad = NUM2DBL(argv[1]);
-	c = cos(rad); s = sin(rad);
-	return rb_ary_new3(2, rb_float_new(c*x - s*y), rb_float_new(s*x + c*y));
+        x = NUM2DBL(rb_ary_entry(argv[0], 0));
+        y = NUM2DBL(rb_ary_entry(argv[0], 1));
+        rad = NUM2DBL(argv[1]);
+        c = cos(rad); s = sin(rad);
+        return rb_ary_new3(2, rb_float_new(c*x - s*y), rb_float_new(s*x + c*y));
       }
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (Array expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   case 3:
@@ -1179,7 +1172,7 @@ static VALUE rb_gsl_vector_rotate(int argc, VALUE *argv, VALUE klass)
     gsl_vector_set(vynew, i, s*x + c*y);
   }
   return rb_ary_new3(2, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vxnew),
-		     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vynew));
+                     Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vynew));
 }
 
 #include "gsl/gsl_fit.h"
@@ -1195,21 +1188,21 @@ static VALUE rb_gsl_vector_linearfit(int argc, VALUE *argv, VALUE klass)
     Data_Get_Struct(argv[1], gsl_vector, w);
     Data_Get_Struct(argv[2], gsl_vector, y);
     gsl_fit_wlinear(x->data, x->stride, w->data, w->stride,
-		    y->data, y->stride, y->size, &c0, &c1, &c00, &c01, &c11,
-		    &sumsq);
+                    y->data, y->stride, y->size, &c0, &c1, &c00, &c01, &c11,
+                    &sumsq);
     break;
   case 2:
-    CHECK_VECTOR(argv[0]); CHECK_VECTOR(argv[1]); 
+    CHECK_VECTOR(argv[0]); CHECK_VECTOR(argv[1]);
     Data_Get_Struct(argv[0], gsl_vector, x);
     Data_Get_Struct(argv[1], gsl_vector, y);
-    gsl_fit_linear(x->data, x->stride, y->data,y->stride, y->size, 
-		   &c0, &c1, &c00, &c01, &c11, &sumsq);
+    gsl_fit_linear(x->data, x->stride, y->data,y->stride, y->size,
+                   &c0, &c1, &c00, &c01, &c11, &sumsq);
     break;
   default:
     rb_raise(rb_eArgError, "Wrong number of arguments (%d for 2 or 3).\n", argc);
   }
   return rb_ary_new3(6, rb_float_new(c0), rb_float_new(c1), rb_float_new(c00),
-		    rb_float_new(c01), rb_float_new(c11), rb_float_new(sumsq));
+                     rb_float_new(c01), rb_float_new(c11), rb_float_new(sumsq));
 }
 
 static VALUE rb_gsl_vector_center(VALUE obj)
@@ -1226,7 +1219,7 @@ static VALUE rb_gsl_vector_center(VALUE obj)
 
 static VALUE rb_gsl_vector_clip(int argc, VALUE *argv, VALUE obj)
 {
-  gsl_vector *v, *vnew;  
+  gsl_vector *v, *vnew;
   double hi = 1.0, lo = 0.0;
   double x;
   size_t i;
@@ -1254,7 +1247,7 @@ static VALUE rb_gsl_vector_clip(int argc, VALUE *argv, VALUE obj)
     x = gsl_vector_get(v, i);
     if (x > hi) x = hi;
     else if (x < lo) x = lo;
-    else {};
+    else {}
     gsl_vector_set(vnew, i, x);
   }
   return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
@@ -1271,12 +1264,12 @@ static VALUE rb_gsl_vector_amp_phase(VALUE obj)
   amp = gsl_vector_alloc(v->size/2);
   phase = gsl_vector_alloc(v->size/2);
   gsl_vector_set(amp, 0, gsl_vector_get(v, 0));
-  gsl_vector_set(phase, 0, 0);  
+  gsl_vector_set(phase, 0, 0);
   gsl_vector_set(amp, amp->size-1, gsl_vector_get(v, v->size-1));
-  gsl_vector_set(phase, phase->size-1, 0);    
-  for (i = 1; i < v->size-1; i+=2) {
+  gsl_vector_set(phase, phase->size-1, 0);
+  for (i = 1; i < v->size-1; i += 2) {
     re = gsl_vector_get(v, i);
-    im = gsl_vector_get(v, i+1);    
+    im = gsl_vector_get(v, i+1);
     gsl_vector_set(amp, i/2+1, sqrt(re*re + im*im));
     gsl_vector_set(phase, i/2+1, atan2(im, re));
   }
@@ -1307,7 +1300,7 @@ static VALUE rb_gsl_vector_clean(int argc, VALUE *argv, VALUE obj)
   vnew = make_vector_clone(v);
   n = v->size;
   for (i = 0; i < n; i++) if (fabs(vnew->data[i]) < eps) vnew->data[i] = 0.0;
-  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);;
+  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
 }
 
 static VALUE rb_gsl_vector_clean_bang(int argc, VALUE *argv, VALUE obj)
@@ -1430,11 +1423,11 @@ void Init_gsl_vector(VALUE module)
   rb_define_method(cgsl_vector, "amp_phase", rb_gsl_vector_amp_phase, 0);
   rb_define_method(cgsl_vector, "clean", rb_gsl_vector_clean, -1);
   rb_define_method(cgsl_vector, "clean!", rb_gsl_vector_clean_bang, -1);
-  
+
   rb_define_method(cgsl_vector, "pow", rb_gsl_vector_pow, 1);
   rb_define_alias(cgsl_vector, "**", "pow");
-  
-  rb_define_method(cgsl_vector, "pow!", rb_gsl_vector_pow_bang, 1);  
-  
+
+  rb_define_method(cgsl_vector, "pow!", rb_gsl_vector_pow_bang, 1);
+
   Init_gsl_vector_init(module);
 }
diff --git a/ext/gsl/vector_int.c b/ext/gsl_native/vector_int.c
similarity index 85%
rename from ext/gsl/vector_int.c
rename to ext/gsl_native/vector_int.c
index d783c55..3e1cc09 100644
--- a/ext/gsl/vector_int.c
+++ b/ext/gsl_native/vector_int.c
@@ -12,9 +12,7 @@
 
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_complex.h"
-#ifdef HAVE_NARRAY_H
 #include "include/rb_gsl_with_narray.h"
-#endif
 
 VALUE rb_gsl_vector_int_inner_product(int argc, VALUE *argv, VALUE obj);
 VALUE rb_gsl_vector_int_do_something(VALUE obj, void (*func)(gsl_vector_int*));
@@ -31,7 +29,7 @@ VALUE rb_gsl_vector_int_to_f(VALUE obj)
   size_t i;
   Data_Get_Struct(obj, gsl_vector_int, v);
   vnew = gsl_vector_alloc(v->size);
-  for (i = 0; i < v->size; i++) 
+  for (i = 0; i < v->size; i++)
     gsl_vector_set(vnew, i, (double) gsl_vector_int_get(v, i));
   if (VECTOR_INT_COL_P(obj))
     return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, vnew);
@@ -92,17 +90,17 @@ static VALUE rb_gsl_vector_int_add(VALUE obj, VALUE b)
     return rb_gsl_vector_add_constant(rb_gsl_vector_int_to_f(obj), b);
     break;
   default:
-   if (rb_obj_is_kind_of(b, cgsl_vector_int)) {
-     Data_Get_Struct(obj, gsl_vector_int, v);
-     Data_Get_Struct(b, gsl_vector_int, vb);
-     vnew = gsl_vector_int_alloc(v->size);
-     gsl_vector_int_memcpy(vnew, v);
-     gsl_vector_int_add(vnew, vb);
-     return Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
-   } else {
-     return rb_gsl_vector_add(rb_gsl_vector_int_to_f(obj), b);
-   }
-   break;
+    if (rb_obj_is_kind_of(b, cgsl_vector_int)) {
+      Data_Get_Struct(obj, gsl_vector_int, v);
+      Data_Get_Struct(b, gsl_vector_int, vb);
+      vnew = gsl_vector_int_alloc(v->size);
+      gsl_vector_int_memcpy(vnew, v);
+      gsl_vector_int_add(vnew, vb);
+      return Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
+    } else {
+      return rb_gsl_vector_add(rb_gsl_vector_int_to_f(obj), b);
+    }
+    break;
   }
 }
 
@@ -119,12 +117,12 @@ static VALUE rb_gsl_vector_int_sub(VALUE obj, VALUE b)
     break;
   default:
     if (rb_obj_is_kind_of(b, cgsl_vector_int)) {
-     Data_Get_Struct(obj, gsl_vector_int, v);
-     Data_Get_Struct(b, gsl_vector_int, vb);
-     vnew = gsl_vector_int_alloc(v->size);
-     gsl_vector_int_memcpy(vnew, v);
-     gsl_vector_int_sub(vnew, vb);
-     return Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
+      Data_Get_Struct(obj, gsl_vector_int, v);
+      Data_Get_Struct(b, gsl_vector_int, vb);
+      vnew = gsl_vector_int_alloc(v->size);
+      gsl_vector_int_memcpy(vnew, v);
+      gsl_vector_int_sub(vnew, vb);
+      return Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
     } else {
       return rb_gsl_vector_sub(rb_gsl_vector_int_to_f(obj), b);
     }
@@ -151,7 +149,7 @@ static VALUE rb_gsl_vector_int_mul(VALUE obj, VALUE b)
       argv[0] = obj;
       argv[1] = b;
       return rb_gsl_vector_int_inner_product(2, argv, CLASS_OF(obj));
-    } else  if (VECTOR_INT_ROW_P(obj) && MATRIX_INT_P(b)) {
+    } else if (VECTOR_INT_ROW_P(obj) && MATRIX_INT_P(b)) {
       Data_Get_Struct(obj, gsl_vector_int, v);
       Data_Get_Struct(b, gsl_matrix_int, m);
       vnew = mygsl_vector_int_mul_matrix(v, m);
@@ -162,10 +160,10 @@ static VALUE rb_gsl_vector_int_mul(VALUE obj, VALUE b)
       if (v->size != v2->size) rb_raise(rb_eIndexError, "Vector sizes does not match.");
       m = gsl_matrix_int_alloc(v->size, v2->size);
       for (i = 0; i < v->size; i++) {
-	for (j = 0; j < v2->size; j++) {
-	  val = gsl_vector_int_get(v, i)*gsl_vector_int_get(v2, j);
-	  gsl_matrix_int_set(m, i, j, val);
-	}
+        for (j = 0; j < v2->size; j++) {
+          val = gsl_vector_int_get(v, i)*gsl_vector_int_get(v2, j);
+          gsl_matrix_int_set(m, i, j, val);
+        }
       }
       return Data_Wrap_Struct(cgsl_matrix_int, 0, gsl_matrix_int_free, m);
     } else {
diff --git a/ext/gsl/vector_source.c b/ext/gsl_native/vector_source.h
similarity index 82%
rename from ext/gsl/vector_source.c
rename to ext/gsl_native/vector_source.h
index 561fcd2..1d343cd 100644
--- a/ext/gsl/vector_source.c
+++ b/ext/gsl_native/vector_source.h
@@ -39,10 +39,10 @@
 void FUNCTION(get_range,beg_en_n)(VALUE range, BASE *beg, BASE *en, size_t *n, int *step);
 
 void get_range_beg_en_n_for_size(VALUE range,
-    int *beg, int *en, size_t *n, int *step, size_t size);
+                                 int *beg, int *en, size_t *n, int *step, size_t size);
 
 void parse_subvector_args(int argc, VALUE *argv, size_t size,
-    size_t *offset, size_t *stride, size_t *n);
+                          size_t *offset, size_t *stride, size_t *n);
 
 void FUNCTION(get_range,beg_en_n)(VALUE range, BASE *beg, BASE *en, size_t *n, int *step)
 {
@@ -66,7 +66,7 @@ void get_range_beg_en_n_for_size(VALUE range, int *beg, int *en, size_t *n, int
 }
 
 void parse_subvector_args(int argc, VALUE *argv, size_t size,
-    size_t *offset, size_t *stride, size_t *n)
+                          size_t *offset, size_t *stride, size_t *n)
 {
   int begin = 0, end, step, length;
   *stride = 1;
@@ -83,13 +83,13 @@ void parse_subvector_args(int argc, VALUE *argv, size_t size,
       // want to let Ruby crash if GSL does not have bounds checking enabled.
       if(begin < 0 || (size_t)begin >= size) {
         rb_raise(rb_eRangeError,
-            "begin value %d is out of range for Vector of length %d",
-		 begin, (int) size);
+                 "begin value %d is out of range for Vector of length %d",
+                 begin, (int) size);
       }
       if(end < 0 || (size_t)end >= size) {
         rb_raise(rb_eRangeError,
-            "end value %d is out of range for Vector of length %d",
-		 end, (int) size);
+                 "end value %d is out of range for Vector of length %d",
+                 end, (int) size);
       }
       *stride = (size_t)step;
     } else {
@@ -97,8 +97,8 @@ void parse_subvector_args(int argc, VALUE *argv, size_t size,
       length = FIX2INT(argv[0]);
       if((length < 0 && -length > (int) size) || (length > 0 && length > (int) size)) {
         rb_raise(rb_eRangeError,
-            "length %d is out of range for Vector of length %d",
-		 length, (int) size);
+                 "length %d is out of range for Vector of length %d",
+                 length, (int) size);
       } else if(length < 0) {
         begin = length;
         *n = (size_t)(-length);
@@ -113,13 +113,13 @@ void parse_subvector_args(int argc, VALUE *argv, size_t size,
       get_range_beg_en_n_for_size(argv[0], &begin, &end, n, &step, size);
       if(begin < 0 || (size_t)begin >= size) {
         rb_raise(rb_eRangeError,
-            "begin value %d is out of range for Vector of length %d",
-		 (int) begin, (int) size);
+                 "begin value %d is out of range for Vector of length %d",
+                 (int) begin, (int) size);
       }
       if(end < 0 || (size_t)end >= size) {
         rb_raise(rb_eRangeError,
-            "end value %d is out of range for Vector of length %d",
-		 (int) end, (int) size);
+                 "end value %d is out of range for Vector of length %d",
+                 (int) end, (int) size);
       }
       CHECK_FIXNUM(argv[1]);
       step = FIX2INT(argv[1]);
@@ -210,13 +210,11 @@ VALUE FUNCTION(rb_gsl_vector,new)(int argc, VALUE *argv, VALUE klass)
   size_t n, i;
   BASE beg, en;
   int step;
-#ifdef HAVE_NARRAY_H
-  VALUE ary2;
-#endif
   switch (argc) {
   case 1:
 #ifdef HAVE_NARRAY_H
     if (NA_IsNArray(argv[0])) {
+      VALUE ary2;
       n = NA_TOTAL(argv[0]);
       v = FUNCTION(gsl_vector,alloc)(n);
       if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
@@ -230,7 +228,7 @@ VALUE FUNCTION(rb_gsl_vector,new)(int argc, VALUE *argv, VALUE klass)
     }
 #endif
     switch (TYPE(argv[0])) {
-    case T_FIXNUM:  
+    case T_FIXNUM:
       /*! if an integer n is given, create an empty vector of length n */
       CHECK_FIXNUM(argv[0]);
       n = FIX2INT(argv[0]);
@@ -243,35 +241,35 @@ VALUE FUNCTION(rb_gsl_vector,new)(int argc, VALUE *argv, VALUE klass)
     case T_FLOAT:
       v = FUNCTION(gsl_vector,alloc)(1);
       switch(TYPE(argv[0])) {
-        case T_FIXNUM: case T_BIGNUM: case T_FLOAT:
-          xnative = NUMCONV2(argv[0]);
-          break;
-        default:
-          xnative = (BASE)0;
+      case T_FIXNUM: case T_BIGNUM: case T_FLOAT:
+        xnative = NUMCONV2(argv[0]);
+        break;
+      default:
+        xnative = (BASE)0;
       }
       FUNCTION(gsl_vector,set)(v, 0, xnative);
       break;
 #ifdef BASE_DOUBLE
-    case T_ARRAY: 
+    case T_ARRAY:
       v = make_cvector_from_rarrays(argv[0]);
       break;
 #endif
     default:
       if (CLASS_OF(argv[0]) == rb_cRange) {
-	FUNCTION(get_range,beg_en_n)(argv[0], &beg, &en, &n, &step);
-	v = FUNCTION(gsl_vector,alloc)(n);
-	FUNCTION(set_ptr_data,by_range)(v->data, v->size, argv[0]);
-	return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_vector,free), v);
+        FUNCTION(get_range,beg_en_n)(argv[0], &beg, &en, &n, &step);
+        v = FUNCTION(gsl_vector,alloc)(n);
+        FUNCTION(set_ptr_data,by_range)(v->data, v->size, argv[0]);
+        return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_vector,free), v);
       } else if (VEC_P(argv[0])) {
-	/*! Create a new vector with the same elements of the vector given */ 
-	Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), vtmp);
-	v = FUNCTION(gsl_vector,alloc)(vtmp->size);
-	for (i = 0; i < vtmp->size; i++) 
-	  FUNCTION(gsl_vector,set)(v, i, FUNCTION(gsl_vector,get)(vtmp, i));
-	return Data_Wrap_Struct(VEC_ROW_COL(argv[0]), 0, FUNCTION(gsl_vector,free), v);
+        /*! Create a new vector with the same elements of the vector given */
+        Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), vtmp);
+        v = FUNCTION(gsl_vector,alloc)(vtmp->size);
+        for (i = 0; i < vtmp->size; i++)
+          FUNCTION(gsl_vector,set)(v, i, FUNCTION(gsl_vector,get)(vtmp, i));
+        return Data_Wrap_Struct(VEC_ROW_COL(argv[0]), 0, FUNCTION(gsl_vector,free), v);
       } else {
-	rb_raise(rb_eTypeError, 
-		 "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
+        rb_raise(rb_eTypeError,
+                 "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
       }
       break;
     }
@@ -281,11 +279,11 @@ VALUE FUNCTION(rb_gsl_vector,new)(int argc, VALUE *argv, VALUE klass)
     if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
     for (i = 0; (int) i < argc; i++) {
       switch(TYPE(argv[i])) {
-        case T_FIXNUM: case T_BIGNUM: case T_FLOAT:
-          xnative = NUMCONV2(argv[i]);
-          break;
-        default:
-          xnative = (BASE)0;
+      case T_FIXNUM: case T_BIGNUM: case T_FLOAT:
+        xnative = NUMCONV2(argv[i]);
+        break;
+      default:
+        xnative = (BASE)0;
       }
       FUNCTION(gsl_vector,set)(v, i, xnative);
     }
@@ -322,7 +320,7 @@ static VALUE FUNCTION(rb_gsl_vector,get)(int argc, VALUE *argv, VALUE obj)
     switch (TYPE(argv[0])) {
     case T_FIXNUM:
       i = FIX2INT(argv[0]);
-      if (i < 0) 
+      if (i < 0)
         retval = C_TO_VALUE2(FUNCTION(gsl_vector,get)(v, (size_t) (v->size + i)));
       else
         retval = C_TO_VALUE2(FUNCTION(gsl_vector,get)(v, (size_t) (i)));
@@ -332,7 +330,7 @@ static VALUE FUNCTION(rb_gsl_vector,get)(int argc, VALUE *argv, VALUE obj)
       for (j = 0; j < vnew->size; j++) {
         i = NUMCONV(rb_ary_entry(argv[0], j));
         if (i < 0) k = v->size + i;
-        //	else k = j;
+        //  else k = j;
         else k = i;
         FUNCTION(gsl_vector,set)(vnew, j, FUNCTION(gsl_vector,get)(v, k));
       }
@@ -437,7 +435,6 @@ static VALUE FUNCTION(rb_gsl_vector,set)(int argc, VALUE *argv, VALUE obj)
   if(argc < 1 || argc > 4) {
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-4)", argc);
   }
-
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   other = argv[argc-1];
 
@@ -458,7 +455,6 @@ static VALUE FUNCTION(rb_gsl_vector,set)(int argc, VALUE *argv, VALUE obj)
     // assignment to v.subvector(...)
     FUNCTION(rb_gsl_vector,set_subvector)(argc-1, argv, v, other);
   }
-
   return obj;
 }
 
@@ -471,7 +467,7 @@ static VALUE FUNCTION(rb_gsl_vector,set_all)(VALUE obj, VALUE xx)
   return obj;
 }
 
-VALUE FUNCTION(rb_gsl_vector,do_something)(VALUE obj, void (*func)(GSL_TYPE(gsl_vector)*))
+VALUE FUNCTION(rb_gsl_vector,do_something)(VALUE obj, void (*func)(GSL_TYPE (gsl_vector)*))
 {
   GSL_TYPE(gsl_vector) *v = NULL;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
@@ -659,9 +655,9 @@ static VALUE FUNCTION(rb_gsl_vector,trans)(VALUE obj)
     return Data_Wrap_Struct(cgsl_vector_int_col, 0, gsl_vector_int_free, vnew);
   else if (VECTOR_INT_COL_P(obj))
     return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, vnew);
-  else rb_raise(rb_eTypeError, 
-		"wrong type %s (Vector::Int or Vector::Int::Col expected)",
-		rb_class2name(CLASS_OF(obj)));
+  else rb_raise(rb_eTypeError,
+                "wrong type %s (Vector::Int or Vector::Int::Col expected)",
+                rb_class2name(CLASS_OF(obj)));
 #endif
   return Qnil;
 }
@@ -673,14 +669,14 @@ static VALUE FUNCTION(rb_gsl_vector,trans_bang)(VALUE obj)
   else if (CLASS_OF(obj) == cgsl_vector_col) RBGSL_SET_CLASS(obj, cgsl_vector);
   else {
     rb_raise(rb_eRuntimeError, "method trans! for %s is not permitted.",
-	     rb_class2name(CLASS_OF(obj)));
-  }	
+             rb_class2name(CLASS_OF(obj)));
+  }
 #elif defined(BASE_INT)
   if (CLASS_OF(obj) == cgsl_vector_int) RBGSL_SET_CLASS(obj, cgsl_vector_int_col);
   else if (CLASS_OF(obj) == cgsl_vector_int_col) RBGSL_SET_CLASS(obj, cgsl_vector_int);
   else {
     rb_raise(rb_eRuntimeError, "method trans! for %s is not permitted.",
-	     rb_class2name(CLASS_OF(obj)));
+             rb_class2name(CLASS_OF(obj)));
   }
 #endif
   return obj;
@@ -704,7 +700,7 @@ VALUE FUNCTION(rb_gsl_vector,uminus)(VALUE obj)
   }
   if (CLASS_OF(obj) == GSL_TYPE(cgsl_poly))
     return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
-  else 
+  else
     return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
@@ -810,7 +806,7 @@ static VALUE FUNCTION(rb_gsl_vector,sgn)(VALUE obj)
     x = FUNCTION(gsl_vector,get)(v, i);
     FUNCTION(gsl_vector,set)(vnew, i, (BASE)(x>0 ? 1 : (x<0 ? -1 : 0)));
   }
-  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);  
+  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
 static VALUE FUNCTION(rb_gsl_vector,abs)(VALUE obj)
@@ -822,7 +818,7 @@ static VALUE FUNCTION(rb_gsl_vector,abs)(VALUE obj)
   for (i = 0; i < v->size; i++) {
     FUNCTION(gsl_vector,set)(vnew, i, (BASE) fabs(FUNCTION(gsl_vector,get)(v, i)));
   }
-  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);  
+  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
 static VALUE FUNCTION(rb_gsl_vector,square)(VALUE obj)
@@ -834,7 +830,7 @@ static VALUE FUNCTION(rb_gsl_vector,square)(VALUE obj)
   for (i = 0; i < v->size; i++) {
     FUNCTION(gsl_vector,set)(vnew, i, gsl_pow_2(FUNCTION(gsl_vector,get)(v, i)));
   }
-  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);  
+  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
 static VALUE FUNCTION(rb_gsl_vector,sqrt)(VALUE obj)
@@ -846,7 +842,7 @@ static VALUE FUNCTION(rb_gsl_vector,sqrt)(VALUE obj)
   for (i = 0; i < v->size; i++) {
     FUNCTION(gsl_vector,set)(vnew, i, sqrt(FUNCTION(gsl_vector,get)(v, i)));
   }
-  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);  
+  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
 static VALUE FUNCTION(rb_gsl_vector,memcpy)(VALUE obj, VALUE dest, VALUE src)
@@ -867,7 +863,7 @@ static VALUE FUNCTION(rb_gsl_vector,clone)(VALUE obj)
   FUNCTION(gsl_vector,memcpy)(vnew, v);
   if (!VEC_VIEW_P(obj))
     return Data_Wrap_Struct(CLASS_OF(obj), 0, FUNCTION(gsl_vector,free), vnew);
-  else 
+  else
     return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
@@ -919,7 +915,7 @@ static VALUE FUNCTION(rb_gsl_vector,fprintf)(int argc, VALUE *argv, VALUE obj)
   GSL_TYPE(gsl_vector) *h = NULL;
   FILE *fp = NULL;
   int status, flag = 0;
-  if (argc != 1 && argc != 2) 
+  if (argc != 1 && argc != 2)
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), h);
   fp = rb_gsl_open_writefile(argv[0], &flag);
@@ -941,7 +937,7 @@ static VALUE FUNCTION(rb_gsl_vector,printf)(int argc, VALUE *argv, VALUE obj)
   int status;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), h);
   if (argc == 1) {
-    if (TYPE(argv[0]) != T_STRING) 
+    if (TYPE(argv[0]) != T_STRING)
       rb_raise(rb_eTypeError, "String expected");
     else
       status = FUNCTION(gsl_vector,fprintf)(stdout, h, STR2CSTR(argv[0]));
@@ -974,7 +970,7 @@ VALUE FUNCTION(rb_gsl_vector,inner_product)(int argc, VALUE *argv, VALUE obj)
   switch (TYPE(obj)) {
   case T_MODULE:  case T_CLASS:  case T_OBJECT:
     if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
-			    argc);
+                            argc);
     CHECK_VEC(argv[0]);
     CHECK_VEC(argv[1]);
     Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
@@ -982,7 +978,7 @@ VALUE FUNCTION(rb_gsl_vector,inner_product)(int argc, VALUE *argv, VALUE obj)
     break;
   default:
     if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			    argc);
+                            argc);
     CHECK_VEC(argv[0]);
     Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
     Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v2);
@@ -1052,7 +1048,7 @@ static VALUE FUNCTION(rb_gsl_vector,equal)(int argc, VALUE *argv, VALUE obj)
   case T_FLOAT:
     x = NUM2DBL(other);
     Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v1);
-    for (i = 0; i < v1->size; i++) 
+    for (i = 0; i < v1->size; i++)
       if (fabs(x-FUNCTION(gsl_vector,get)(v1, i)) > eps) return Qfalse;
     return Qtrue;
     break;
@@ -1108,14 +1104,14 @@ static VALUE FUNCTION(rb_gsl_vector,graph)(int argc, VALUE *argv, VALUE obj)
     if (TYPE(argv[1]) == T_STRING) {
       make_graphcommand(command, argv[1]);
       if (VEC_P(argv[0])) {
-	Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
+        Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
       } else {
-	rb_raise(rb_eTypeError, "argv[0] wrong type %s (String or Vector expected)", 
-		 rb_class2name(CLASS_OF(argv[0])));
+        rb_raise(rb_eTypeError, "argv[0] wrong type %s (String or Vector expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       }
     } else {
-      rb_raise(rb_eTypeError, "argv[1] wrong type %s (String or Vector expected)", 
-	       rb_class2name(CLASS_OF(argv[1])));
+      rb_raise(rb_eTypeError, "argv[1] wrong type %s (String or Vector expected)",
+               rb_class2name(CLASS_OF(argv[1])));
     }
     break;
   default:
@@ -1125,7 +1121,7 @@ static VALUE FUNCTION(rb_gsl_vector,graph)(int argc, VALUE *argv, VALUE obj)
   if (y == NULL) rb_raise(rb_eRuntimeError, "ydata not given");
   fp = popen(command, "w");
   for (i = 0; i < y->size; i++) {
-    if (x == NULL) 
+    if (x == NULL)
       fprintf(fp, "%d %e\n", (int) i, (double) FUNCTION(gsl_vector,get)(y, i));
     else
       fprintf(fp, "%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i), (double) FUNCTION(gsl_vector,get)(y, i));
@@ -1165,14 +1161,14 @@ static VALUE FUNCTION(rb_gsl_vector,graph_step)(int argc, VALUE *argv, VALUE obj
     if (TYPE(argv[1]) == T_STRING) {
       make_graphcommand(command, argv[1]);
       if (VEC_P(argv[0])) {
-	Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
+        Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
       } else {
-	rb_raise(rb_eTypeError, "argv[0] wrong type %s (String or Vector expected)", 
-		 rb_class2name(CLASS_OF(argv[0])));
+        rb_raise(rb_eTypeError, "argv[0] wrong type %s (String or Vector expected)",
+                 rb_class2name(CLASS_OF(argv[0])));
       }
     } else {
-      rb_raise(rb_eTypeError, "argv[1] wrong type %s (String or Vector expected)", 
-	       rb_class2name(CLASS_OF(argv[1])));
+      rb_raise(rb_eTypeError, "argv[1] wrong type %s (String or Vector expected)",
+               rb_class2name(CLASS_OF(argv[1])));
     }
     break;
   default:
@@ -1184,19 +1180,19 @@ static VALUE FUNCTION(rb_gsl_vector,graph_step)(int argc, VALUE *argv, VALUE obj
   for (i = 0; i < y->size; i++) {
     if (x == NULL) {
       fprintf(fp, "%d %e\n%d %e\n", (int) i, (double) FUNCTION(gsl_vector,get)(y, i),
-	      (int) (i+1), (double) FUNCTION(gsl_vector,get)(y, i));
+              (int) (i+1), (double) FUNCTION(gsl_vector,get)(y, i));
     } else {
-      if (i != y->size-1) 
-	fprintf(fp, "%e %e\n%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i), 
-	(double) FUNCTION(gsl_vector,get)(y, i),
-	(double) FUNCTION(gsl_vector,get)(x, i+1), 
-	(double) FUNCTION(gsl_vector,get)(y, i));
+      if (i != y->size-1)
+        fprintf(fp, "%e %e\n%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i),
+                (double) FUNCTION(gsl_vector,get)(y, i),
+                (double) FUNCTION(gsl_vector,get)(x, i+1),
+                (double) FUNCTION(gsl_vector,get)(y, i));
       else
-	fprintf(fp, "%e %e\n%e %e", 
-	(double) FUNCTION(gsl_vector,get)(x, i), 
-	(double) FUNCTION(gsl_vector,get)(y, i),
-	2.0*FUNCTION(gsl_vector,get)(x, i)-FUNCTION(gsl_vector,get)(x, i-1), 
-	(double) FUNCTION(gsl_vector,get)(y, i));
+        fprintf(fp, "%e %e\n%e %e",
+                (double) FUNCTION(gsl_vector,get)(x, i),
+                (double) FUNCTION(gsl_vector,get)(y, i),
+                2.0*FUNCTION(gsl_vector,get)(x, i)-FUNCTION(gsl_vector,get)(x, i-1),
+                (double) FUNCTION(gsl_vector,get)(y, i));
     }
   }
   fflush(fp);
@@ -1228,7 +1224,7 @@ static VALUE FUNCTION(rb_gsl_vector,plot)(int argc, VALUE *argv, VALUE obj)
       Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
     } else {
       rb_raise(rb_eTypeError, "wrong argument type %s (String or Vector expected)",
-	       rb_class2name(CLASS_OF(argv[0])));
+               rb_class2name(CLASS_OF(argv[0])));
     }
     break;
   case 2:
@@ -1243,11 +1239,11 @@ static VALUE FUNCTION(rb_gsl_vector,plot)(int argc, VALUE *argv, VALUE obj)
   }
   if (y == NULL) rb_raise(rb_eRuntimeError, "ydata not given");
   for (i = 0; i < y->size; i++) {
-    if (x == NULL) 
+    if (x == NULL)
       fprintf(fp, "%d %e\n", (int) i, (double) FUNCTION(gsl_vector,get)(y, i));
     else
-      fprintf(fp, "%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i), 
-	(double) FUNCTION(gsl_vector,get)(y, i));
+      fprintf(fp, "%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i),
+              (double) FUNCTION(gsl_vector,get)(y, i));
   }
   fprintf(fp, "e\n");
   fflush(fp);
@@ -1261,11 +1257,11 @@ void FUNCTION(gsl_vector,print)(const GSL_TYPE(gsl_vector) *v, VALUE klass)
   size_t i;
   printf("[ ");
   if (klass == cgsl_vector_col || klass == cgsl_vector_col_view
-	|| klass == cgsl_vector_col_view_ro
-	|| klass == cgsl_vector_int_col || klass == cgsl_vector_int_col_view
-	|| klass == cgsl_vector_int_col_view_ro) {
+      || klass == cgsl_vector_col_view_ro
+      || klass == cgsl_vector_int_col || klass == cgsl_vector_int_col_view
+      || klass == cgsl_vector_int_col_view_ro) {
     printf(PRINTF_FORMAT, FUNCTION(gsl_vector,get)(v, 0));
-    for (i = 1; i < v->size; i++) {	
+    for (i = 1; i < v->size; i++) {
       printf(PRINTF_FORMAT, FUNCTION(gsl_vector,get)(v, i));
       if (i != v->size-1) printf("\n");
     }
@@ -1317,16 +1313,16 @@ VALUE FUNCTION(rb_gsl_vector,to_s)(VALUE obj)
     strcpy(format2, format);
 #else
     strcpy(format, PRINTF_FORMAT);
-    strcpy(format2, " "PRINTF_FORMAT);
+    strcpy(format2, " " PRINTF_FORMAT);
 #endif
     for (i = 0; i < v->size; i++) {
       if (i != 0) {
-	strcpy(buf, "  ");
-	rb_str_cat(str, buf, strlen(buf));
+        strcpy(buf, "  ");
+        rb_str_cat(str, buf, strlen(buf));
       }
       x = FUNCTION(gsl_vector,get)(v, i);
-      if (x < 0) sprintf(buf, format, x); 
-      else sprintf(buf, format2, x); 
+      if (x < 0) sprintf(buf, format, x);
+      else sprintf(buf, format2, x);
       if (i != v->size-1) strcat(buf, "\n");
       rb_str_cat(str, buf, strlen(buf));
       if (i >= 20 && i != v->size-1) {
@@ -1459,8 +1455,8 @@ static VALUE FUNCTION(rb_gsl_vector,matrix_view)(int argc, VALUE *argv, VALUE ob
     break;
   case 3:
     mv = ALLOC(QUALIFIED_VIEW(gsl_matrix,view));
-    *mv = FUNCTION(gsl_matrix,view_vector_with_tda)(v, FIX2INT(argv[0]), FIX2INT(argv[1]), 
-				 FIX2INT(argv[2]));
+    *mv = FUNCTION(gsl_matrix,view_vector_with_tda)(v, FIX2INT(argv[0]), FIX2INT(argv[1]),
+                                                    FIX2INT(argv[2]));
     break;
   default:
     rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
@@ -1470,7 +1466,7 @@ static VALUE FUNCTION(rb_gsl_vector,matrix_view)(int argc, VALUE *argv, VALUE ob
 }
 
 static VALUE FUNCTION(rb_gsl_vector,matrix_view_with_tda)(VALUE obj, VALUE nn1, VALUE nn2,
-						VALUE tda)
+                                                          VALUE tda)
 {
   GSL_TYPE(gsl_vector) *v = NULL;
   QUALIFIED_VIEW(gsl_matrix,view) *mv = NULL;
@@ -1514,16 +1510,16 @@ VALUE FUNCTION(rb_gsl_vector,scale)(VALUE obj, VALUE x)
   GSL_TYPE(gsl_vector) *v, *vnew;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   vnew = FUNCTION(make_vector,clone)(v);
-  FUNCTION(gsl_vector,scale)(vnew, NUMCONV(x));
+  FUNCTION(gsl_vector,scale)(vnew, NUMCONV2(x));
   //  return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
-    return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
+  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
 VALUE FUNCTION(rb_gsl_vector,scale_bang)(VALUE obj, VALUE x)
 {
   GSL_TYPE(gsl_vector) *v = NULL;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
-  FUNCTION(gsl_vector,scale)(v, NUMCONV(x));
+  FUNCTION(gsl_vector,scale)(v, NUMCONV2(x));
   return obj;
 }
 
@@ -1532,7 +1528,7 @@ VALUE FUNCTION(rb_gsl_vector,add_constant)(VALUE obj, VALUE x)
   GSL_TYPE(gsl_vector) *v, *vnew;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   vnew = FUNCTION(make_vector,clone)(v);
-  FUNCTION(gsl_vector,add_constant)(vnew, NUMCONV(x));
+  FUNCTION(gsl_vector,add_constant)(vnew, NUMCONV2(x));
   //  return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
   return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
@@ -1541,7 +1537,7 @@ VALUE FUNCTION(rb_gsl_vector,add_constant_bang)(VALUE obj, VALUE x)
 {
   GSL_TYPE(gsl_vector) *v = NULL;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
-  FUNCTION(gsl_vector,add_constant)(v, NUMCONV(x));
+  FUNCTION(gsl_vector,add_constant)(v, NUMCONV2(x));
   return obj;
 }
 
@@ -1600,7 +1596,7 @@ static VALUE FUNCTION(rb_gsl_vector,to_gplot)(int argc, VALUE *argv, VALUE obj)
     if (argc < 1) rb_raise(rb_eArgError, "no vectors given");
     if (TYPE(argv[0]) == T_ARRAY) nv = RARRAY_LEN(argv[0]);
     else nv = argc;
-    vp = (GSL_TYPE(gsl_vector)**) ALLOC_N(GSL_TYPE(gsl_vector)*, nv);
+    vp = (GSL_TYPE(gsl_vector)**)ALLOC_N(GSL_TYPE(gsl_vector)*, nv);
     istart = 0;
     break;
   default:
@@ -1608,7 +1604,7 @@ static VALUE FUNCTION(rb_gsl_vector,to_gplot)(int argc, VALUE *argv, VALUE obj)
     Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
     if (argc >= 1 && TYPE(argv[0]) == T_ARRAY) nv = 1 + RARRAY_LEN(argv[0]);
     else nv = argc + 1;
-    vp = (GSL_TYPE(gsl_vector)**) ALLOC_N(GSL_TYPE(gsl_vector)*, nv);
+    vp = (GSL_TYPE(gsl_vector)**)ALLOC_N(GSL_TYPE(gsl_vector)*, nv);
     vp[0] = v; len = v->size;
     istart = 1;
     break;
@@ -1619,7 +1615,7 @@ static VALUE FUNCTION(rb_gsl_vector,to_gplot)(int argc, VALUE *argv, VALUE obj)
     CHECK_VEC(tmp);
     Data_Get_Struct(tmp, GSL_TYPE(gsl_vector), v);
     if (len == 0) len = v->size;
-    if (len != v->size) 
+    if (len != v->size)
       rb_raise(rb_eRuntimeError, "vectors must have equal lengths");
     vp[i+istart] = v;
   }
@@ -1675,7 +1671,7 @@ static VALUE FUNCTION(rb_gsl_vector,collect_bang)(VALUE obj)
 
 /* Modified 2006/Sep/26 */
 GSL_TYPE(gsl_vector)* FUNCTION(mygsl_vector,mul_matrix)(GSL_TYPE(gsl_vector) *v,
-							GSL_TYPE(gsl_matrix) *m)
+                                                        GSL_TYPE(gsl_matrix) *m)
 {
   GSL_TYPE(gsl_vector) *vnew;
   size_t i, j;
@@ -1715,7 +1711,7 @@ static VALUE FUNCTION(rb_gsl_vector,to_m_circulant)(VALUE obj)
 }
 
 static void FUNCTION(mygsl_vector,indgen)(GSL_TYPE(gsl_vector) *v,
-					  BASE start, BASE step)
+                                          BASE start, BASE step)
 {
   size_t k = 0;
   BASE i;
@@ -1734,10 +1730,10 @@ static VALUE FUNCTION(rb_gsl_vector,indgen_singleton)(int argc, VALUE *argv, VAL
   switch (argc) {
   case 3:
     step = NUMCONV2(argv[2]);
-    /* no break */
+  /* no break */
   case 2:
     start = NUMCONV2(argv[1]);
-    /* no break */
+  /* no break */
   case 1:
     n = NUM2INT(argv[0]);
     break;
@@ -1757,7 +1753,7 @@ static VALUE FUNCTION(rb_gsl_vector,indgen)(int argc, VALUE *argv, VALUE obj)
   switch (argc) {
   case 2:
     step = NUMCONV2(argv[1]);
-    /* no break */
+  /* no break */
   case 1:
     start = NUMCONV2(argv[0]);
     break;
@@ -1780,7 +1776,7 @@ static VALUE FUNCTION(rb_gsl_vector,indgen_bang)(int argc, VALUE *argv, VALUE ob
   switch (argc) {
   case 2:
     step = NUMCONV2(argv[1]);
-    /* no break */
+  /* no break */
   case 1:
     start = NUMCONV2(argv[0]);
     break;
@@ -1906,7 +1902,7 @@ static VALUE FUNCTION(rb_gsl_vector,histogram)(int argc, VALUE *argv, VALUE obj)
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   switch (argc) {
   case 1:
-    if (rb_obj_is_kind_of(argv[0], rb_cRange)) 
+    if (rb_obj_is_kind_of(argv[0], rb_cRange))
       argv[0] = rb_gsl_range2ary(argv[0]);
     switch (TYPE(argv[0])) {
     case T_FIXNUM:
@@ -1939,7 +1935,7 @@ static VALUE FUNCTION(rb_gsl_vector,histogram)(int argc, VALUE *argv, VALUE obj)
       break;
     default:
       rb_raise(rb_eTypeError, "wrong argument type %s (Array expected)",
-	       rb_class2name(CLASS_OF(argv[1])));
+               rb_class2name(CLASS_OF(argv[1])));
       break;
     }
     h = gsl_histogram_alloc(n);
@@ -1986,56 +1982,56 @@ static VALUE FUNCTION(rb_gsl_vector,concat)(VALUE obj, VALUE other)
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
 
   switch(TYPE(other)) {
-    case T_FIXNUM:
-    case T_BIGNUM:
-    case T_FLOAT:
-      vnew = FUNCTION(gsl_vector,alloc)(v->size + 1);
-      vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
-      FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
-      FUNCTION(gsl_vector,set)(vnew, v->size, NUMCONV2(other));
-      break;
+  case T_FIXNUM:
+  case T_BIGNUM:
+  case T_FLOAT:
+    vnew = FUNCTION(gsl_vector,alloc)(v->size + 1);
+    vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
+    FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
+    FUNCTION(gsl_vector,set)(vnew, v->size, NUMCONV2(other));
+    break;
 
-    case T_ARRAY:
-      size2 = RARRAY_LEN(other);
+  case T_ARRAY:
+    size2 = RARRAY_LEN(other);
+    vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
+    vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
+    FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
+    for (i = 0; i < size2; i++) {
+      x = rb_ary_entry(other, i);
+      FUNCTION(gsl_vector,set)(vnew, v->size + i, NUMCONV2(x));
+    }
+    break;
+
+  default:
+    if(rb_obj_is_kind_of(other, rb_cRange)) {
+      FUNCTION(get_range,beg_en_n)(other, &beg, &end, &size2, &step);
       vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
       vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
       FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
       for (i = 0; i < size2; i++) {
-        x = rb_ary_entry(other, i);
-        FUNCTION(gsl_vector,set)(vnew, v->size + i, NUMCONV2(x));
+        FUNCTION(gsl_vector,set)(vnew, v->size + i, beg);
+        beg += step;
       }
-      break;
-
-    default:
-      if(rb_obj_is_kind_of(other, rb_cRange)) {
-        FUNCTION(get_range,beg_en_n)(other, &beg, &end, &size2, &step);
-        vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
-        vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
-        FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
-        for (i = 0; i < size2; i++) {
-          FUNCTION(gsl_vector,set)(vnew, v->size + i, beg);
-          beg += step;
-        }
-      } else if (rb_obj_is_kind_of(other, GSL_TYPE(cgsl_vector))) {
-        Data_Get_Struct(other, GSL_TYPE(gsl_vector), v2);
-        size2 = v2->size;
-        vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
-        vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
-        FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
-        vv = FUNCTION(gsl_vector,subvector)(vnew, v->size, size2);
-        FUNCTION(gsl_vector,memcpy)(&vv.vector, v2);
-      } else {
-        rb_raise(rb_eTypeError, "wrong argument type %s (Array, Numeric, Range, or %s expected)",
-            rb_class2name(CLASS_OF(other)), rb_class2name(GSL_TYPE(cgsl_vector)));
-      }
-      break;
+    } else if (rb_obj_is_kind_of(other, GSL_TYPE(cgsl_vector))) {
+      Data_Get_Struct(other, GSL_TYPE(gsl_vector), v2);
+      size2 = v2->size;
+      vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
+      vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
+      FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
+      vv = FUNCTION(gsl_vector,subvector)(vnew, v->size, size2);
+      FUNCTION(gsl_vector,memcpy)(&vv.vector, v2);
+    } else {
+      rb_raise(rb_eTypeError, "wrong argument type %s (Array, Numeric, Range, or %s expected)",
+               rb_class2name(CLASS_OF(other)), rb_class2name(GSL_TYPE(cgsl_vector)));
+    }
+    break;
   }
 
-  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);  
+  return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
 void FUNCTION(mygsl_vector,diff)(GSL_TYPE(gsl_vector) *vdst,
-				 GSL_TYPE(gsl_vector) *vsrc, size_t n)
+                                 GSL_TYPE(gsl_vector) *vsrc, size_t n)
 {
   BASE a, b;
   int coef, fac, nn, ff;
@@ -2086,7 +2082,7 @@ static VALUE FUNCTION(rb_gsl_vector,test)(VALUE obj, int (*f)(const double))
   size_t i;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   vi = gsl_vector_int_alloc(v->size);
-  for (i = 0; i < v->size; i++) 
+  for (i = 0; i < v->size; i++)
     gsl_vector_int_set(vi, i, (*f)(FUNCTION(gsl_vector,get)(v, i)));
   return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, vi);
 }
@@ -2227,23 +2223,23 @@ static VALUE FUNCTION(rb_gsl_vector,filescan)(VALUE klass, VALUE file)
   Check_Type(file, T_STRING);
   strcpy(filename, STR2CSTR(file));
   sprintf(buf, "sed '/^#/d' %s | wc", filename);
-  if ((fp = popen(buf, "r")) == NULL) 
+  if ((fp = popen(buf, "r")) == NULL)
     rb_raise(rb_eIOError, "popen failed.");
   if (fgets(buf, 1024, fp) == NULL)
     rb_sys_fail(0);
   pclose(fp);
   sscanf(buf, "%d", &nn);
   lines = (size_t) nn;  /*  vector length */
-  if ((fp = fopen(filename, "r")) == NULL) 
+  if ((fp = fopen(filename, "r")) == NULL)
     rb_raise(rb_eIOError, "cannot open file %s.", filename);
   while (1) {
-	  if (fgets(buf, 1024, fp) == NULL)    /* read the first line to count number of columns */
+    if (fgets(buf, 1024, fp) == NULL)    /* read the first line to count number of columns */
       rb_sys_fail(0);
-	  if (buf[0] == '#') continue;
-	  else break;
-	}
+    if (buf[0] == '#') continue;
+    else break;
+  }
   n = count_columns(buf);  /* number of vectors to be created */
-  x = (GSL_TYPE(gsl_vector)**) xmalloc(sizeof(GSL_TYPE(gsl_vector)*)*n);
+  x = (GSL_TYPE(gsl_vector)**)xmalloc(sizeof(GSL_TYPE(gsl_vector)*)*n);
   ary = rb_ary_new2(n);
   for (j = 0; j < n; j++) {
     x[j] = FUNCTION(gsl_vector,alloc)(lines);
@@ -2251,11 +2247,11 @@ static VALUE FUNCTION(rb_gsl_vector,filescan)(VALUE klass, VALUE file)
   }
   rewind(fp);
   for (i = 0, ii = 0; ii < lines; i++) {
-		pos = ftell(fp);
-		if (fgets(buf, 1024, fp) == NULL)
+    pos = ftell(fp);
+    if (fgets(buf, 1024, fp) == NULL)
       rb_sys_fail(0);
-		if (buf[0] == '#') continue;
-		fseek(fp, pos, SEEK_SET);
+    if (buf[0] == '#') continue;
+    fseek(fp, pos, SEEK_SET);
     for (j = 0, jj = 0; jj < n; j++) {
       k = fscanf(fp, FORMAT_TMP, &val);
       if (k != 1) continue;
@@ -2269,9 +2265,9 @@ static VALUE FUNCTION(rb_gsl_vector,filescan)(VALUE klass, VALUE file)
 }
 #undef FORMAT_TMP
 
-static int FUNCTION(gsl_vector,eq)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,eq)(const GSL_TYPE(gsl_vector) *a,
+                                   const GSL_TYPE(gsl_vector) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2285,9 +2281,9 @@ static int FUNCTION(gsl_vector,eq)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,ne)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,ne)(const GSL_TYPE(gsl_vector) *a,
+                                   const GSL_TYPE(gsl_vector) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2301,9 +2297,9 @@ static int FUNCTION(gsl_vector,ne)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,gt)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,gt)(const GSL_TYPE(gsl_vector) *a,
+                                   const GSL_TYPE(gsl_vector) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2317,9 +2313,9 @@ static int FUNCTION(gsl_vector,gt)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,ge)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,ge)(const GSL_TYPE(gsl_vector) *a,
+                                   const GSL_TYPE(gsl_vector) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2333,9 +2329,9 @@ static int FUNCTION(gsl_vector,ge)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,lt)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,lt)(const GSL_TYPE(gsl_vector) *a,
+                                   const GSL_TYPE(gsl_vector) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2349,9 +2345,9 @@ static int FUNCTION(gsl_vector,lt)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,le)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,le)(const GSL_TYPE(gsl_vector) *a,
+                                   const GSL_TYPE(gsl_vector) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2365,9 +2361,9 @@ static int FUNCTION(gsl_vector,le)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,and)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,and)(const GSL_TYPE(gsl_vector) *a,
+                                    const GSL_TYPE(gsl_vector) *b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2381,9 +2377,9 @@ static int FUNCTION(gsl_vector,and)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,or)(const GSL_TYPE(gsl_vector) *a, 
-				   const GSL_TYPE(gsl_vector) *b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,or)(const GSL_TYPE(gsl_vector) *a,
+                                   const GSL_TYPE(gsl_vector) *b,
+                                   gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2397,9 +2393,9 @@ static int FUNCTION(gsl_vector,or)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,xor)(const GSL_TYPE(gsl_vector) *a, 
-				    const GSL_TYPE(gsl_vector) *b,
-				    gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,xor)(const GSL_TYPE(gsl_vector) *a,
+                                    const GSL_TYPE(gsl_vector) *b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2413,8 +2409,8 @@ static int FUNCTION(gsl_vector,xor)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,eq2)(const GSL_TYPE(gsl_vector) *a, 
-				    BASE b, gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,eq2)(const GSL_TYPE(gsl_vector) *a,
+                                    BASE b, gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2427,9 +2423,9 @@ static int FUNCTION(gsl_vector,eq2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,ne2)(const GSL_TYPE(gsl_vector) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,ne2)(const GSL_TYPE(gsl_vector) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2442,9 +2438,9 @@ static int FUNCTION(gsl_vector,ne2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,gt2)(const GSL_TYPE(gsl_vector) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,gt2)(const GSL_TYPE(gsl_vector) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2457,9 +2453,9 @@ static int FUNCTION(gsl_vector,gt2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,ge2)(const GSL_TYPE(gsl_vector) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,ge2)(const GSL_TYPE(gsl_vector) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2472,9 +2468,9 @@ static int FUNCTION(gsl_vector,ge2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,lt2)(const GSL_TYPE(gsl_vector) *a, 
-				   BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,lt2)(const GSL_TYPE(gsl_vector) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2487,9 +2483,9 @@ static int FUNCTION(gsl_vector,lt2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,le2)(const GSL_TYPE(gsl_vector) *a, 
-				    BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,le2)(const GSL_TYPE(gsl_vector) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2502,9 +2498,9 @@ static int FUNCTION(gsl_vector,le2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,and2)(const GSL_TYPE(gsl_vector) *a, 
-				    BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,and2)(const GSL_TYPE(gsl_vector) *a,
+                                     BASE b,
+                                     gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2517,9 +2513,9 @@ static int FUNCTION(gsl_vector,and2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,or2)(const GSL_TYPE(gsl_vector) *a, 
-				    BASE b,
-				   gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,or2)(const GSL_TYPE(gsl_vector) *a,
+                                    BASE b,
+                                    gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2532,9 +2528,9 @@ static int FUNCTION(gsl_vector,or2)(const GSL_TYPE(gsl_vector) *a,
   return 0;
 }
 
-static int FUNCTION(gsl_vector,xor2)(const GSL_TYPE(gsl_vector) *a, 
-				     BASE b,
-				    gsl_block_uchar *c)
+static int FUNCTION(gsl_vector,xor2)(const GSL_TYPE(gsl_vector) *a,
+                                     BASE b,
+                                     gsl_block_uchar *c)
 {
   size_t i;
   BASE x, y;
@@ -2549,12 +2545,12 @@ static int FUNCTION(gsl_vector,xor2)(const GSL_TYPE(gsl_vector) *a,
 
 
 static VALUE FUNCTION(rb_gsl_vector,compare)(VALUE aa, VALUE bb,
-					     int (*cmp)(const GSL_TYPE(gsl_vector)*,
-							const GSL_TYPE(gsl_vector)*,
-							gsl_block_uchar*),
-					     int (*cmp2)(const GSL_TYPE(gsl_vector)*,
-							 BASE,
-							 gsl_block_uchar*))
+                                             int (*cmp)(const GSL_TYPE (gsl_vector)*,
+                                                        const GSL_TYPE (gsl_vector)*,
+                                                        gsl_block_uchar*),
+                                             int (*cmp2)(const GSL_TYPE (gsl_vector)*,
+                                                         BASE,
+                                                         gsl_block_uchar*))
 {
   GSL_TYPE(gsl_vector) *a, *b;
   /*  gsl_vector_int *c;*/
@@ -2564,9 +2560,9 @@ static VALUE FUNCTION(rb_gsl_vector,compare)(VALUE aa, VALUE bb,
   c = gsl_block_uchar_alloc(a->size);
   if (VEC_P(bb)) {
     Data_Get_Struct(bb, GSL_TYPE(gsl_vector), b);
-    if (a->size != b->size) 
-      rb_raise(rb_eRuntimeError, "Vector size mismatch, %d and %d", (int) a->size, 
-	       (int) b->size);
+    if (a->size != b->size)
+      rb_raise(rb_eRuntimeError, "Vector size mismatch, %d and %d", (int) a->size,
+               (int) b->size);
     /*status =*/ (*cmp)(a, b, c);
   } else {
     /*status =*/ (*cmp2)(a, NUMCONV(bb), c);
@@ -2577,55 +2573,55 @@ static VALUE FUNCTION(rb_gsl_vector,compare)(VALUE aa, VALUE bb,
 static VALUE FUNCTION(rb_gsl_vector,eq)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,eq),
-					 FUNCTION(gsl_vector,eq2));
+                                         FUNCTION(gsl_vector,eq2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,ne)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,ne),
-					 FUNCTION(gsl_vector,ne2));
+                                         FUNCTION(gsl_vector,ne2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,gt)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,gt),
-					 FUNCTION(gsl_vector,gt2));
+                                         FUNCTION(gsl_vector,gt2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,ge)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,ge),
-					 FUNCTION(gsl_vector,ge2));
+                                         FUNCTION(gsl_vector,ge2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,lt)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,lt),
-					 FUNCTION(gsl_vector,lt2));
+                                         FUNCTION(gsl_vector,lt2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,le)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,le),
-					 FUNCTION(gsl_vector,le2));
+                                         FUNCTION(gsl_vector,le2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,and)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,and),
-					 FUNCTION(gsl_vector,and2));
+                                         FUNCTION(gsl_vector,and2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,or)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,or),
-					 FUNCTION(gsl_vector,or2));
+                                         FUNCTION(gsl_vector,or2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,xor)(VALUE aa, VALUE bb)
 {
   return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,xor),
-					 FUNCTION(gsl_vector,xor2));
+                                         FUNCTION(gsl_vector,xor2));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,not)(VALUE obj)
@@ -2663,11 +2659,11 @@ static VALUE FUNCTION(rb_gsl_vector,any2)(VALUE obj)
 
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   if (rb_block_given_p()) {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) return Qtrue;
     return Qfalse;
   } else {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (v->data[i*v->stride]) return Qtrue;
     return Qfalse;
   }
@@ -2680,11 +2676,11 @@ static VALUE FUNCTION(rb_gsl_vector,none)(VALUE obj)
 
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   if (rb_block_given_p()) {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) return Qfalse;
     return Qtrue;
   } else {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (v->data[i*v->stride]) return Qfalse;
     return Qtrue;
   }
@@ -2697,11 +2693,11 @@ static VALUE FUNCTION(rb_gsl_vector,all)(VALUE obj)
 
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   if (rb_block_given_p()) {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (!rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) return Qfalse;
     return Qtrue;
   } else {
-    for (i = 0; i < v->size; i++) 
+    for (i = 0; i < v->size; i++)
       if (!v->data[i*v->stride]) return Qfalse;
     return Qtrue;
   }
@@ -2719,10 +2715,10 @@ static VALUE FUNCTION(rb_gsl_vector,where)(VALUE obj)
     btmp = gsl_block_uchar_alloc(v->size);
     for (i = 0; i < v->size; i++) {
       if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) {
-	btmp->data[i] = 1;
-	n++;
+        btmp->data[i] = 1;
+        n++;
       } else {
-	btmp->data[i] = 0;
+        btmp->data[i] = 0;
       }
     }  /* for */
   } else { /* block is not given */
@@ -2754,10 +2750,10 @@ static VALUE FUNCTION(rb_gsl_vector,where2)(VALUE obj)
     btmp = gsl_block_uchar_alloc(v->size);
     for (i = 0; i < v->size; i++) {
       if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) {
-	btmp->data[i] = 1;
-	n++;
+        btmp->data[i] = 1;
+        n++;
       } else {
-	btmp->data[i] = 0;
+        btmp->data[i] = 0;
       }
     } /* for */
   } else {  /* block is not given */
@@ -2768,11 +2764,11 @@ static VALUE FUNCTION(rb_gsl_vector,where2)(VALUE obj)
     v2 = gsl_permutation_calloc(v->size);  /* calloc() initializes v2 */
     vv1 = Qnil;
     vv2 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v2);
-  } else if (v->size-n == 0) { 
+  } else if (v->size-n == 0) {
     v1 = gsl_permutation_calloc(n);           /* calloc() initializes v1 */
-    vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);     
+    vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);
     vv2 = Qnil;
-  } else { 
+  } else {
     /* same case as 'where' */
     v1 = gsl_permutation_alloc(n);
     v2 = gsl_permutation_alloc(v->size-n);
@@ -2787,8 +2783,8 @@ static VALUE FUNCTION(rb_gsl_vector,where2)(VALUE obj)
   return rb_ary_new3(2, vv1, vv2);
 }
 
-static VALUE FUNCTION(rb_gsl_vector,op_inplace)(VALUE vv1, VALUE vv2, 
-						int (*f)(GSL_TYPE(gsl_vector)*, const GSL_TYPE(gsl_vector)*))
+static VALUE FUNCTION(rb_gsl_vector,op_inplace)(VALUE vv1, VALUE vv2,
+                                                int (*f)(GSL_TYPE (gsl_vector)*, const GSL_TYPE (gsl_vector)*))
 {
   GSL_TYPE(gsl_vector) *v1, *v2;
   Data_Get_Struct(vv1, GSL_TYPE(gsl_vector), v1);
@@ -2866,14 +2862,14 @@ static VALUE FUNCTION(rb_gsl_vector,zip)(int argc, VALUE *argv, VALUE obj)
     argv2 = argv;
   } else {
     if (argc < 1) rb_raise(rb_eArgError, "Too few arguments.");
-    Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v0);    
+    Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v0);
     argc2 = argc - 1;
     argv2 = argv + 1;
   }
   for (i = 0; (int) i < argc2; i++) {
     CHECK_VEC(argv2[i]);
   }
-  vp = (GSL_TYPE(gsl_vector)**) malloc(sizeof(GSL_TYPE(gsl_vector)**));
+  vp = (GSL_TYPE(gsl_vector)**)malloc(sizeof(GSL_TYPE(gsl_vector)**));
   for (i = 0; (int) i < argc2; i++) {
     Data_Get_Struct(argv2[i], GSL_TYPE(gsl_vector), vp[i]);
   }
@@ -2883,15 +2879,14 @@ static VALUE FUNCTION(rb_gsl_vector,zip)(int argc, VALUE *argv, VALUE obj)
     FUNCTION(gsl_vector,set)(vnew, 0, FUNCTION(gsl_vector,get)(v0, i));
     for (j = 0; (int) j < argc2; j++) {
       if (i < vp[j]->size) {
-	FUNCTION(gsl_vector,set)(vnew, j+1, FUNCTION(gsl_vector,get)(vp[j], i));
+        FUNCTION(gsl_vector,set)(vnew, j+1, FUNCTION(gsl_vector,get)(vp[j], i));
       } else {
-	FUNCTION(gsl_vector,set)(vnew, j+1, 0.0);
+        FUNCTION(gsl_vector,set)(vnew, j+1, 0.0);
       }
     }
     rb_ary_store(ary, i, Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew));
   }
-  
-  free((GSL_TYPE(gsl_vector)**) vp);
+  free((GSL_TYPE(gsl_vector)**)vp);
   return ary;
 }
 
@@ -2955,17 +2950,16 @@ static VALUE FUNCTION(rb_gsl_vector,cumprod)(VALUE obj)
   return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
 }
 
-#ifdef GSL_1_9_LATER
 static VALUE FUNCTION(rb_gsl_vector,property)(VALUE obj,
-  int (*f)(const GSL_TYPE(gsl_vector) *)) {
+                                              int (*f)(const GSL_TYPE (gsl_vector) *)) {
   GSL_TYPE(gsl_vector) *v;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
-  return INT2FIX((*f)(v));  
+  return INT2FIX((*f)(v));
 }
 
 static VALUE FUNCTION(rb_gsl_vector,property2)(VALUE obj,
-  int (*f)(const GSL_TYPE(gsl_vector) *)) {
-  GSL_TYPE(gsl_vector) *v;  
+                                               int (*f)(const GSL_TYPE (gsl_vector) *)) {
+  GSL_TYPE(gsl_vector) *v;
   Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
   if ((*f)(v)) return Qtrue;
   else return Qfalse;
@@ -2977,19 +2971,17 @@ static VALUE FUNCTION(rb_gsl_vector,ispos)(VALUE obj)
 }
 static VALUE FUNCTION(rb_gsl_vector,ispos2)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, ispos));  
+  return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, ispos));
 }
 static VALUE FUNCTION(rb_gsl_vector,isneg)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_vector,property)(obj, FUNCTION(gsl_vector, isneg));    
+  return FUNCTION(rb_gsl_vector,property)(obj, FUNCTION(gsl_vector, isneg));
 }
 static VALUE FUNCTION(rb_gsl_vector,isneg2)(VALUE obj)
 {
-  return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, isneg));      
+  return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, isneg));
 }
-#endif
 
-#ifdef GSL_1_10_LATER
 static VALUE FUNCTION(rb_gsl_vector,isnonneg)(VALUE obj)
 {
   return FUNCTION(rb_gsl_vector,property)(obj, FUNCTION(gsl_vector, isnonneg));
@@ -2997,19 +2989,18 @@ static VALUE FUNCTION(rb_gsl_vector,isnonneg)(VALUE obj)
 static VALUE FUNCTION(rb_gsl_vector,isnonneg2)(VALUE obj)
 {
   return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, isnonneg));
-}  
-#endif
+}
 
 void FUNCTION(Init_gsl_vector,init)(VALUE module)
 {
-  /*  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "new", 
+  /*  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "new",
       FUNCTION(rb_gsl_vector,new), -1);*/
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "[]", 
-			     FUNCTION(rb_gsl_vector,new), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "alloc", 
-			     FUNCTION(rb_gsl_vector,new), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "calloc", 
-			     FUNCTION(rb_gsl_vector,calloc), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "[]",
+                             FUNCTION(rb_gsl_vector,new), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "alloc",
+                             FUNCTION(rb_gsl_vector,new), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "calloc",
+                             FUNCTION(rb_gsl_vector,calloc), 1);
 
 /*****/
   rb_define_method(GSL_TYPE(cgsl_vector), "get", FUNCTION(rb_gsl_vector,get), -1);
@@ -3078,86 +3069,86 @@ void FUNCTION(Init_gsl_vector,init)(VALUE module)
   rb_define_method(GSL_TYPE(cgsl_vector), "cumsum", FUNCTION(rb_gsl_vector,cumsum), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "cumprod", FUNCTION(rb_gsl_vector,cumprod), 0);
 
-  rb_define_method(GSL_TYPE(cgsl_vector), "connect", 
-		   FUNCTION(rb_gsl_vector,connect), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "connect", 
-			     FUNCTION(rb_gsl_vector,connect), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "connect",
+                   FUNCTION(rb_gsl_vector,connect), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "connect",
+                             FUNCTION(rb_gsl_vector,connect), -1);
 
 
   rb_define_method(GSL_TYPE(cgsl_vector), "sgn", FUNCTION(rb_gsl_vector,sgn), 0);
   rb_define_alias(GSL_TYPE(cgsl_vector), "signum", "sgn");
   rb_define_method(GSL_TYPE(cgsl_vector), "abs", FUNCTION(rb_gsl_vector,abs), 0);
   rb_define_alias(GSL_TYPE(cgsl_vector), "fabs", "abs");
-  rb_define_method(GSL_TYPE(cgsl_vector), "square", 
-		   FUNCTION(rb_gsl_vector,square), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "square",
+                   FUNCTION(rb_gsl_vector,square), 0);
   rb_define_alias(GSL_TYPE(cgsl_vector), "abs2", "square");
   rb_define_method(GSL_TYPE(cgsl_vector), "sqrt", FUNCTION(rb_gsl_vector,sqrt), 0);
 
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "memcpy", 
-			     FUNCTION(rb_gsl_vector,memcpy), 2);
-  rb_define_method(GSL_TYPE(cgsl_vector), "clone", 
-		   FUNCTION(rb_gsl_vector,clone), 0);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "memcpy",
+                             FUNCTION(rb_gsl_vector,memcpy), 2);
+  rb_define_method(GSL_TYPE(cgsl_vector), "clone",
+                   FUNCTION(rb_gsl_vector,clone), 0);
   rb_define_alias(GSL_TYPE(cgsl_vector), "duplicate", "clone");
   rb_define_alias(GSL_TYPE(cgsl_vector), "dup", "clone");
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "swap", 
-			     FUNCTION(rb_gsl_vector,swap), 2);
-  rb_define_method(GSL_TYPE(cgsl_vector), "swap_elements", 
-		   FUNCTION(rb_gsl_vector,swap_elements), 2);
-
-  rb_define_method(GSL_TYPE(cgsl_vector), "fwrite", 
-		   FUNCTION(rb_gsl_vector,fwrite), 1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "fread", 
-		   FUNCTION(rb_gsl_vector,fread), 1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "fprintf", 
-		   FUNCTION(rb_gsl_vector,fprintf), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "printf", 
-		   FUNCTION(rb_gsl_vector,printf), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "fscanf", 
-		   FUNCTION(rb_gsl_vector,fscanf), 1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "swap",
+                             FUNCTION(rb_gsl_vector,swap), 2);
+  rb_define_method(GSL_TYPE(cgsl_vector), "swap_elements",
+                   FUNCTION(rb_gsl_vector,swap_elements), 2);
+
+  rb_define_method(GSL_TYPE(cgsl_vector), "fwrite",
+                   FUNCTION(rb_gsl_vector,fwrite), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "fread",
+                   FUNCTION(rb_gsl_vector,fread), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "fprintf",
+                   FUNCTION(rb_gsl_vector,fprintf), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "printf",
+                   FUNCTION(rb_gsl_vector,printf), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "fscanf",
+                   FUNCTION(rb_gsl_vector,fscanf), 1);
 
   /* 2.Aug.2004 */
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "inner_product", 
-			     FUNCTION(rb_gsl_vector,inner_product), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "dot", 
-			     FUNCTION(rb_gsl_vector,inner_product), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "inner_product",
+                             FUNCTION(rb_gsl_vector,inner_product), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "dot",
+                             FUNCTION(rb_gsl_vector,inner_product), -1);
   rb_define_method(GSL_TYPE(cgsl_vector), "inner_product",
-		   FUNCTION(rb_gsl_vector,inner_product), -1);
+                   FUNCTION(rb_gsl_vector,inner_product), -1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "dot", "inner_product");
 
-  rb_define_method(GSL_TYPE(cgsl_vector), "equal?", 
-		   FUNCTION(rb_gsl_vector,equal), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "equal?",
+                   FUNCTION(rb_gsl_vector,equal), -1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "==", "equal?");
 
-  rb_define_method(GSL_TYPE(cgsl_vector), "to_poly", 
-		   FUNCTION(rb_gsl_vector,to_poly), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "to_poly",
+                   FUNCTION(rb_gsl_vector,to_poly), 0);
 
 /*****/
-  rb_define_method(GSL_TYPE(cgsl_vector), "graph", 
-		   FUNCTION(rb_gsl_vector,graph), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "graph_step", 
-		   FUNCTION(rb_gsl_vector,graph_step), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "plot", 
-		   FUNCTION(rb_gsl_vector,plot), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "graph",
+                   FUNCTION(rb_gsl_vector,graph), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "graph_step",
+                   FUNCTION(rb_gsl_vector,graph_step), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "plot",
+                   FUNCTION(rb_gsl_vector,plot), -1);
 
   rb_define_method(GSL_TYPE(cgsl_vector), "print",
-		   FUNCTION(rb_gsl_vector,print), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "inspect", 
-		   FUNCTION(rb_gsl_vector,inspect), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "to_s", 
-		   FUNCTION(rb_gsl_vector,to_s), 0);
+                   FUNCTION(rb_gsl_vector,print), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "inspect",
+                   FUNCTION(rb_gsl_vector,inspect), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "to_s",
+                   FUNCTION(rb_gsl_vector,to_s), 0);
 
 /*****/
   rb_define_method(GSL_TYPE(cgsl_vector), "subvector",
-		   FUNCTION(rb_gsl_vector,subvector), -1);
+                   FUNCTION(rb_gsl_vector,subvector), -1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "view", "subvector");
-  rb_define_method(GSL_TYPE(cgsl_vector), "subvector_with_stride", 
-		   FUNCTION(rb_gsl_vector,subvector_with_stride), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "subvector_with_stride",
+                   FUNCTION(rb_gsl_vector,subvector_with_stride), -1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "view_with_stride", "subvector_with_stride");
 
-  rb_define_method(GSL_TYPE(cgsl_vector), "matrix_view", 
-		   FUNCTION(rb_gsl_vector,matrix_view), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "matrix_view_with_tda", 
-		   FUNCTION(rb_gsl_vector,matrix_view_with_tda), 3);
+  rb_define_method(GSL_TYPE(cgsl_vector), "matrix_view",
+                   FUNCTION(rb_gsl_vector,matrix_view), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "matrix_view_with_tda",
+                   FUNCTION(rb_gsl_vector,matrix_view_with_tda), 3);
 
 #ifdef BASE_DOUBLE
   rb_undef_method(cgsl_vector_view_ro, "set");
@@ -3171,106 +3162,106 @@ void FUNCTION(Init_gsl_vector,init)(VALUE module)
   rb_undef_method(cgsl_vector_int_col_view_ro, "[]=");
 #endif
 
-  rb_define_method(GSL_TYPE(cgsl_vector), "scale", 
-		   FUNCTION(rb_gsl_vector,scale), 1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "scale!", 
-		   FUNCTION(rb_gsl_vector,scale_bang), 1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "add_constant", 
-		   FUNCTION(rb_gsl_vector,add_constant), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "scale",
+                   FUNCTION(rb_gsl_vector,scale), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "scale!",
+                   FUNCTION(rb_gsl_vector,scale_bang), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "add_constant",
+                   FUNCTION(rb_gsl_vector,add_constant), 1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "add_const", "add_constant");
-  rb_define_method(GSL_TYPE(cgsl_vector), "add_constant!", 
-		   FUNCTION(rb_gsl_vector,add_constant_bang), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "add_constant!",
+                   FUNCTION(rb_gsl_vector,add_constant_bang), 1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "add_const!", "add_constant!");
 
 #ifdef HAVE_TENSOR_TENSOR_H
-  rb_define_method(GSL_TYPE(cgsl_vector), "to_tensor", 
-		   FUNCTION(rb_gsl_vector,to_tensor), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "to_tensor",
+                   FUNCTION(rb_gsl_vector,to_tensor), -1);
 #endif
 
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "to_gplot", 
-			     FUNCTION(rb_gsl_vector,to_gplot), -1);
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "to_gsplot", 
-			     FUNCTION(rb_gsl_vector,to_gplot), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "to_gplot", 
-		   FUNCTION(rb_gsl_vector,to_gplot), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "to_gplot",
+                             FUNCTION(rb_gsl_vector,to_gplot), -1);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "to_gsplot",
+                             FUNCTION(rb_gsl_vector,to_gplot), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "to_gplot",
+                   FUNCTION(rb_gsl_vector,to_gplot), -1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "to_gsplot", "to_gplot");
 
   /*****/
-  rb_define_method(GSL_TYPE(cgsl_vector), "collect", 
-		   FUNCTION(rb_gsl_vector,collect), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "collect!", 
-		   FUNCTION(rb_gsl_vector,collect_bang), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "collect",
+                   FUNCTION(rb_gsl_vector,collect), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "collect!",
+                   FUNCTION(rb_gsl_vector,collect_bang), 0);
   rb_define_alias(GSL_TYPE(cgsl_vector), "map", "collect");
   rb_define_alias(GSL_TYPE(cgsl_vector), "map!", "collect!");
 
   rb_define_method(GSL_TYPE(cgsl_vector), "to_m", FUNCTION(rb_gsl_vector,to_m), 2);
   rb_define_alias(GSL_TYPE(cgsl_vector), "to_matrix", "to_m");
   rb_define_alias(GSL_TYPE(cgsl_vector), "reshape", "to_m");
-  rb_define_method(GSL_TYPE(cgsl_vector), "to_m_diagonal", 
-		   FUNCTION(rb_gsl_vector,to_m_diagonal), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "block", 
-		   FUNCTION(rb_gsl_vector,block), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "to_m_circulant", 
-		   FUNCTION(rb_gsl_vector,to_m_circulant), 0);
-  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "indgen", 
-			     FUNCTION(rb_gsl_vector,indgen_singleton), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "indgen", 
-		   FUNCTION(rb_gsl_vector,indgen), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "indgen!", 
-		   FUNCTION(rb_gsl_vector,indgen_bang), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "to_m_diagonal",
+                   FUNCTION(rb_gsl_vector,to_m_diagonal), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "block",
+                   FUNCTION(rb_gsl_vector,block), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "to_m_circulant",
+                   FUNCTION(rb_gsl_vector,to_m_circulant), 0);
+  rb_define_singleton_method(GSL_TYPE(cgsl_vector), "indgen",
+                             FUNCTION(rb_gsl_vector,indgen_singleton), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "indgen",
+                   FUNCTION(rb_gsl_vector,indgen), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "indgen!",
+                   FUNCTION(rb_gsl_vector,indgen_bang), -1);
   /*****/
-  rb_define_method(GSL_TYPE(cgsl_vector), "sort!", 
-		   GSL_TYPE(rb_gsl_sort_vector), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "sort", 
-		   GSL_TYPE(rb_gsl_sort_vector2), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "sort_index", 
-		   FUNCTION(rb_gsl_sort_vector,index), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "sort!",
+                   GSL_TYPE(rb_gsl_sort_vector), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "sort",
+                   GSL_TYPE(rb_gsl_sort_vector2), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "sort_index",
+                   FUNCTION(rb_gsl_sort_vector,index), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "sort_smallest",
-		   FUNCTION(rb_gsl_sort_vector,smallest), 1);
+                   FUNCTION(rb_gsl_sort_vector,smallest), 1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "smallest", "sort_smallest");
   rb_define_method(GSL_TYPE(cgsl_vector), "sort_largest",
-		   FUNCTION(rb_gsl_sort_vector,largest), 1);
+                   FUNCTION(rb_gsl_sort_vector,largest), 1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "largest", "sort_largest");
-  rb_define_method(GSL_TYPE(cgsl_vector), "sort_smallest_index", 
-		   FUNCTION(rb_gsl_sort_vector,smallest_index), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "sort_smallest_index",
+                   FUNCTION(rb_gsl_sort_vector,smallest_index), 1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "smallest_index", "sort_smallest_index");
-  rb_define_method(GSL_TYPE(cgsl_vector), "sort_largest_index", 
-		   FUNCTION(rb_gsl_sort_vector,largest_index), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "sort_largest_index",
+                   FUNCTION(rb_gsl_sort_vector,largest_index), 1);
   rb_define_alias(GSL_TYPE(cgsl_vector), "largest_index", "sort_largest_index");
 
   /*****/
   rb_define_method(GSL_TYPE(cgsl_vector), "histogram",
-		   FUNCTION(rb_gsl_vector,histogram), -1);
-
-  rb_define_method(GSL_TYPE(cgsl_vector), "last", 
-		   FUNCTION(rb_gsl_vector,last), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "first", 
-		   FUNCTION(rb_gsl_vector,first), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "concat", 
-		   FUNCTION(rb_gsl_vector,concat), 1);
-
-  rb_define_method(GSL_TYPE(cgsl_vector), "diff", 
-		   FUNCTION(rb_gsl_vector,diff), -1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "isnan", 
-		   FUNCTION(rb_gsl_vector,isnan), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "isinf", 
-		   FUNCTION(rb_gsl_vector,isinf), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "finite", 
-		   FUNCTION(rb_gsl_vector,finite), 0);
-
-  rb_define_method(GSL_TYPE(cgsl_vector), "isnan?", 
-		   FUNCTION(rb_gsl_vector,isnan2), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "isinf?", 
-		   FUNCTION(rb_gsl_vector,isinf2), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "finite?", 
-		   FUNCTION(rb_gsl_vector,finite2), 0);
-
-  rb_define_method(GSL_TYPE(cgsl_vector), "delete_at", 
-		   FUNCTION(rb_gsl_vector,delete_at), 1);
-  rb_define_method(GSL_TYPE(cgsl_vector), "delete_if", 
-		   FUNCTION(rb_gsl_vector,delete_if), 0);
-  rb_define_method(GSL_TYPE(cgsl_vector), "delete", 
-		   FUNCTION(rb_gsl_vector,delete), 1);
+                   FUNCTION(rb_gsl_vector,histogram), -1);
+
+  rb_define_method(GSL_TYPE(cgsl_vector), "last",
+                   FUNCTION(rb_gsl_vector,last), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "first",
+                   FUNCTION(rb_gsl_vector,first), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "concat",
+                   FUNCTION(rb_gsl_vector,concat), 1);
+
+  rb_define_method(GSL_TYPE(cgsl_vector), "diff",
+                   FUNCTION(rb_gsl_vector,diff), -1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "isnan",
+                   FUNCTION(rb_gsl_vector,isnan), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "isinf",
+                   FUNCTION(rb_gsl_vector,isinf), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "finite",
+                   FUNCTION(rb_gsl_vector,finite), 0);
+
+  rb_define_method(GSL_TYPE(cgsl_vector), "isnan?",
+                   FUNCTION(rb_gsl_vector,isnan2), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "isinf?",
+                   FUNCTION(rb_gsl_vector,isinf2), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "finite?",
+                   FUNCTION(rb_gsl_vector,finite2), 0);
+
+  rb_define_method(GSL_TYPE(cgsl_vector), "delete_at",
+                   FUNCTION(rb_gsl_vector,delete_at), 1);
+  rb_define_method(GSL_TYPE(cgsl_vector), "delete_if",
+                   FUNCTION(rb_gsl_vector,delete_if), 0);
+  rb_define_method(GSL_TYPE(cgsl_vector), "delete",
+                   FUNCTION(rb_gsl_vector,delete), 1);
   /***/
   rb_define_singleton_method(GSL_TYPE(cgsl_vector), "filescan", FUNCTION(rb_gsl_vector,filescan), 1);
 
@@ -3294,9 +3285,9 @@ void FUNCTION(Init_gsl_vector,init)(VALUE module)
   rb_define_method(GSL_TYPE(cgsl_vector), "all?", FUNCTION(rb_gsl_vector,all), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "none?", FUNCTION(rb_gsl_vector,none), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "any",
-		   FUNCTION(rb_gsl_vector,any), 0);
+                   FUNCTION(rb_gsl_vector,any), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "any?",
-		   FUNCTION(rb_gsl_vector,any2), 0);
+                   FUNCTION(rb_gsl_vector,any2), 0);
 
   rb_define_method(GSL_TYPE(cgsl_vector), "where", FUNCTION(rb_gsl_vector,where), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "where2", FUNCTION(rb_gsl_vector,where2), 0);
@@ -3309,17 +3300,12 @@ void FUNCTION(Init_gsl_vector,init)(VALUE module)
   rb_define_singleton_method(GSL_TYPE(cgsl_vector), "zip", FUNCTION(rb_gsl_vector,zip), -1);
   rb_define_method(GSL_TYPE(cgsl_vector), "zip", FUNCTION(rb_gsl_vector,zip), -1);
   rb_define_method(GSL_TYPE(cgsl_vector), "join", FUNCTION(rb_gsl_vector,join), -1);
-#ifdef GSL_1_9_LATER
   rb_define_method(GSL_TYPE(cgsl_vector), "ispos", FUNCTION(rb_gsl_vector,ispos), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "ispos?", FUNCTION(rb_gsl_vector,ispos2), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "isneg", FUNCTION(rb_gsl_vector,isneg), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "isneg?", FUNCTION(rb_gsl_vector,isneg2), 0);
-#endif
-
-#ifdef GSL_1_10_LATER
   rb_define_method(GSL_TYPE(cgsl_vector), "isnonneg", FUNCTION(rb_gsl_vector,isnonneg), 0);
   rb_define_method(GSL_TYPE(cgsl_vector), "isnonneg?", FUNCTION(rb_gsl_vector,isnonneg2), 0);
-#endif
 }
 
 #undef NUMCONV
diff --git a/ext/gsl/wavelet.c b/ext/gsl_native/wavelet.c
similarity index 64%
rename from ext/gsl/wavelet.c
rename to ext/gsl_native/wavelet.c
index be7ddf4..cb3944d 100644
--- a/ext/gsl/wavelet.c
+++ b/ext/gsl_native/wavelet.c
@@ -12,22 +12,16 @@
 #include "include/rb_gsl_array.h"
 #include "include/rb_gsl_common.h"
 
-#ifdef GSL_1_6_LATER
 #include <gsl/gsl_wavelet.h>
 #include <gsl/gsl_wavelet2d.h>
-#endif
-
-#ifdef HAVE_NARRAY_H
-#include "narray.h"
-#endif
 
 #ifndef CHECK_WAVELET
-#define CHECK_WAVELET(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet))\
+#define CHECK_WAVELET(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet)) \
     rb_raise(rb_eTypeError, "wrong argument type (Wavelet expected)");
 #endif
 
 #ifndef CHECK_WORKSPACE
-#define CHECK_WORKSPACE(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet_workspace))\
+#define CHECK_WORKSPACE(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet_workspace)) \
     rb_raise(rb_eTypeError, "wrong argument type (Wavelet::Workspace expected)");
 #endif
 
@@ -47,14 +41,11 @@ enum {
   GSL_WAVELET_BSPLINE_CENTERED,
 };
 
-#ifdef GSL_1_6_LATER
 static const gsl_wavelet_type* rb_gsl_wavelet_get_type(VALUE t);
 static VALUE cgsl_wavelet_workspace;
-#endif
 
 static VALUE rb_gsl_wavelet_new(VALUE klass, VALUE t, VALUE m)
 {
-#ifdef GSL_1_6_LATER
   const gsl_wavelet_type *T;
   size_t member;
   gsl_wavelet *w = NULL;
@@ -64,13 +55,8 @@ static VALUE rb_gsl_wavelet_new(VALUE klass, VALUE t, VALUE m)
   w = gsl_wavelet_alloc(T, member);
   if (w == NULL) rb_raise(rb_eNoMemError, "gsl_wavelet_alloc failed");
   return Data_Wrap_Struct(klass, 0, gsl_wavelet_free, w);
-#else
-  rb_raise(rb_eNotImpError, "Wavelet transforms not supported in GSL-%s, use GSL-1.6 or later", GSL_VERSION);
-  return Qnil;
-#endif
 }
 
-#ifdef GSL_1_6_LATER
 static const gsl_wavelet_type* rb_gsl_wavelet_get_type_str(char *name);
 static const gsl_wavelet_type* rb_gsl_wavelet_get_type_int(int t);
 static const gsl_wavelet_type* rb_gsl_wavelet_get_type(VALUE t)
@@ -84,9 +70,9 @@ static const gsl_wavelet_type* rb_gsl_wavelet_get_type(VALUE t)
     T = rb_gsl_wavelet_get_type_int(FIX2INT(t));
     break;
   default:
-    rb_raise(rb_eTypeError, 
-	     "wrong type of argument %s (String or Fixnum expected)",
-	     rb_class2name(CLASS_OF(t)));
+    rb_raise(rb_eTypeError,
+             "wrong type of argument %s (String or Fixnum expected)",
+             rb_class2name(CLASS_OF(t)));
     break;
   }
   return T;
@@ -174,19 +160,19 @@ static VALUE rb_gsl_wavelet_workspace_new(VALUE klass, VALUE nn)
 }
 
 static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
-				    int (*trans)(const gsl_wavelet *, 
-						 gsl_matrix *,
-						 gsl_wavelet_workspace *),
-				    int sss);
+                                    int (*trans)(const gsl_wavelet *,
+                                                 gsl_matrix *,
+                                                 gsl_wavelet_workspace *),
+                                    int sss);
 static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
-			      int (*trans)(const gsl_wavelet *, 
-					   gsl_matrix *, 
-					   gsl_wavelet_direction, 
-					   gsl_wavelet_workspace *),
-			      int sss);
+                              int (*trans)(const gsl_wavelet *,
+                                           gsl_matrix *,
+                                           gsl_wavelet_direction,
+                                           gsl_wavelet_workspace *),
+                              int sss);
 
 static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
-				       int sss)
+                                       int sss)
 {
   gsl_wavelet *w = NULL;
   gsl_vector *v = NULL, *vnew;
@@ -212,7 +198,7 @@ static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
 
     if (MATRIX_P(argv[1])) {
       return rb_gsl_wavelet2d(argc, argv, obj,
-			      gsl_wavelet2d_transform_matrix, sss);
+                              gsl_wavelet2d_transform_matrix, sss);
     }
     if (VECTOR_P(argv[1])) {
       Data_Get_Struct(argv[0], gsl_wavelet, w);
@@ -237,10 +223,9 @@ static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
     break;
   default:
     if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
-
     if (MATRIX_P(argv[0])) {
       return rb_gsl_wavelet2d(argc, argv, obj,
-			      gsl_wavelet2d_transform_matrix, sss);
+                              gsl_wavelet2d_transform_matrix, sss);
     }
     if (VECTOR_P(obj)) {
       CHECK_WAVELET(argv[0]);
@@ -312,7 +297,7 @@ static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
     break;
   }
   if (naflag == 0) {
-    if (sss == RB_GSL_DWT_COPY) { 
+    if (sss == RB_GSL_DWT_COPY) {
       vnew = gsl_vector_alloc(v->size);
       gsl_vector_memcpy(vnew, v);
       ary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
@@ -349,10 +334,10 @@ static VALUE rb_gsl_wavelet_transform2(int argc, VALUE *argv, VALUE obj)
 }
 
 static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
-				  int (*trans)(const gsl_wavelet *, 
-					       double *, size_t, size_t, 
-					       gsl_wavelet_workspace *),
-				  int sss)
+                                  int (*trans)(const gsl_wavelet *,
+                                               double *, size_t, size_t,
+                                               gsl_wavelet_workspace *),
+                                  int sss)
 {
   gsl_wavelet *w = NULL;
   gsl_vector *v = NULL, *vnew;
@@ -375,11 +360,11 @@ static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
 
     if (MATRIX_P(argv[1])) {
       if (trans == gsl_wavelet_transform_forward) {
-	return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				      gsl_wavelet2d_transform_matrix_forward, sss);
+        return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                      gsl_wavelet2d_transform_matrix_forward, sss);
       } else {
-	return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				      gsl_wavelet2d_transform_matrix_inverse, sss);
+        return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                      gsl_wavelet2d_transform_matrix_inverse, sss);
       }
     }
     if (VECTOR_P(argv[1])) {
@@ -405,14 +390,13 @@ static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
     break;
   default:
     if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
-
     if (MATRIX_P(argv[0])) {
       if (trans == gsl_wavelet_transform_forward) {
-	return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				      gsl_wavelet2d_transform_matrix_forward, sss);
+        return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                      gsl_wavelet2d_transform_matrix_forward, sss);
       } else {
-	return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				      gsl_wavelet2d_transform_matrix_inverse, sss);
+        return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                      gsl_wavelet2d_transform_matrix_inverse, sss);
       }
     }
     if (VECTOR_P(obj)) {
@@ -500,33 +484,33 @@ static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
 static VALUE rb_gsl_wavelet_transform_forward(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_forward,
-			      RB_GSL_DWT_COPY);
+                              RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet_transform_inverse(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_inverse,
-			      RB_GSL_DWT_COPY);
+                              RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet_transform_forward2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_forward,
-			      RB_GSL_DWT_INPLACE);
+                              RB_GSL_DWT_INPLACE);
 }
 
 static VALUE rb_gsl_wavelet_transform_inverse2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_inverse,
-			      RB_GSL_DWT_INPLACE);
+                              RB_GSL_DWT_INPLACE);
 }
 
 static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
-			      int (*trans)(const gsl_wavelet *, 
-					   gsl_matrix *, 
-					   gsl_wavelet_direction, 
-					   gsl_wavelet_workspace *),
-			      int sss)
+                              int (*trans)(const gsl_wavelet *,
+                                           gsl_matrix *,
+                                           gsl_wavelet_direction,
+                                           gsl_wavelet_workspace *),
+                              int sss)
 {
   gsl_wavelet *w = NULL;
   gsl_matrix *m = NULL, *mnew;
@@ -605,20 +589,20 @@ static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
 static VALUE rb_gsl_wavelet2d_transform_matrix(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_transform_matrix,
-			  RB_GSL_DWT_COPY);
+                          RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet2d_transform_matrix2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_transform_matrix,
-			  RB_GSL_DWT_INPLACE);
+                          RB_GSL_DWT_INPLACE);
 }
 
 static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
-				    int (*trans)(const gsl_wavelet *, 
-						 gsl_matrix *,
-						 gsl_wavelet_workspace *),
-				    int sss)
+                                    int (*trans)(const gsl_wavelet *,
+                                                 gsl_matrix *,
+                                                 gsl_wavelet_workspace *),
+                                    int sss)
 {
   gsl_wavelet *w = NULL;
   gsl_matrix *m = NULL, *mnew;
@@ -682,75 +666,73 @@ static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
 
 static VALUE rb_gsl_wavelet2d_transform_matrix_forward(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_transform_matrix_forward,
-				RB_GSL_DWT_COPY);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_transform_matrix_forward,
+                                RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet2d_transform_matrix_forward2(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_transform_matrix_forward,
-				RB_GSL_DWT_INPLACE);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_transform_matrix_forward,
+                                RB_GSL_DWT_INPLACE);
 }
 
 static VALUE rb_gsl_wavelet2d_transform_matrix_inverse(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_transform_matrix_inverse,
-				RB_GSL_DWT_COPY);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_transform_matrix_inverse,
+                                RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet2d_transform_matrix_inverse2(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_transform_matrix_inverse,
-				RB_GSL_DWT_INPLACE);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_transform_matrix_inverse,
+                                RB_GSL_DWT_INPLACE);
 }
 
 /** nstransform **/
 static VALUE rb_gsl_wavelet2d_nstransform_matrix(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_nstransform_matrix,
-			  RB_GSL_DWT_COPY);
+                          RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet2d_nstransform_matrix2(int argc, VALUE *argv, VALUE obj)
 {
   return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_nstransform_matrix,
-			  RB_GSL_DWT_INPLACE);
+                          RB_GSL_DWT_INPLACE);
 }
 
 static VALUE rb_gsl_wavelet2d_nstransform_matrix_forward(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_nstransform_matrix_forward,
-				RB_GSL_DWT_COPY);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_nstransform_matrix_forward,
+                                RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet2d_nstransform_matrix_forward2(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_nstransform_matrix_forward,
-				RB_GSL_DWT_INPLACE);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_nstransform_matrix_forward,
+                                RB_GSL_DWT_INPLACE);
 }
 
 static VALUE rb_gsl_wavelet2d_nstransform_matrix_inverse(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_nstransform_matrix_inverse,
-				RB_GSL_DWT_COPY);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_nstransform_matrix_inverse,
+                                RB_GSL_DWT_COPY);
 }
 
 static VALUE rb_gsl_wavelet2d_nstransform_matrix_inverse2(int argc, VALUE *argv, VALUE obj)
 {
-  return rb_gsl_wavelet2d_trans(argc, argv, obj, 
-				gsl_wavelet2d_nstransform_matrix_inverse,
-				RB_GSL_DWT_INPLACE);
+  return rb_gsl_wavelet2d_trans(argc, argv, obj,
+                                gsl_wavelet2d_nstransform_matrix_inverse,
+                                RB_GSL_DWT_INPLACE);
 }
 
-#endif
-
 void Init_wavelet(VALUE module)
 {
   VALUE cgsl_wavelet2d;
@@ -760,183 +742,180 @@ void Init_wavelet(VALUE module)
 
   rb_define_singleton_method(cgsl_wavelet, "alloc", rb_gsl_wavelet_new, 2);
 
-#ifdef GSL_1_6_LATER
   rb_gsl_wavelet_define_const(cgsl_wavelet);
   rb_define_method(cgsl_wavelet, "name", rb_gsl_wavelet_name, 0);
 
   cgsl_wavelet_workspace = rb_define_class_under(cgsl_wavelet, "Workspace", cGSL_Object);
-  rb_define_singleton_method(cgsl_wavelet_workspace, "alloc", 
-			     rb_gsl_wavelet_workspace_new, 1);
+  rb_define_singleton_method(cgsl_wavelet_workspace, "alloc",
+                             rb_gsl_wavelet_workspace_new, 1);
 
   /*****/
 
-  rb_define_singleton_method(cgsl_wavelet, "transform", 
-			     rb_gsl_wavelet_transform, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform",
+                             rb_gsl_wavelet_transform, -1);
   rb_define_method(cgsl_wavelet, "transform", rb_gsl_wavelet_transform, -1);
   rb_define_method(cgsl_vector, "wavelet_transform", rb_gsl_wavelet_transform, -1);
-  rb_define_singleton_method(cgsl_wavelet, "transform!", 
-			     rb_gsl_wavelet_transform2, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform!",
+                             rb_gsl_wavelet_transform2, -1);
   rb_define_method(cgsl_wavelet, "transform!", rb_gsl_wavelet_transform2, -1);
   rb_define_method(cgsl_vector, "wavelet_transform!", rb_gsl_wavelet_transform2, -1);
 
   /**/
 
-  rb_define_singleton_method(cgsl_wavelet, "transform_forward", 
-			     rb_gsl_wavelet_transform_forward, -1);
-  rb_define_method(cgsl_wavelet, "transform_forward", 
-		   rb_gsl_wavelet_transform_forward, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform_forward",
+                             rb_gsl_wavelet_transform_forward, -1);
+  rb_define_method(cgsl_wavelet, "transform_forward",
+                   rb_gsl_wavelet_transform_forward, -1);
   rb_define_alias(cgsl_wavelet, "forward", "transform_forward");
-  rb_define_method(cgsl_vector, "wavelet_transform_forward", 
-		   rb_gsl_wavelet_transform_forward, -1);
+  rb_define_method(cgsl_vector, "wavelet_transform_forward",
+                   rb_gsl_wavelet_transform_forward, -1);
 
-  rb_define_singleton_method(cgsl_wavelet, "transform_inverse", 
-			     rb_gsl_wavelet_transform_inverse, -1);
-  rb_define_method(cgsl_wavelet, "transform_inverse", 
-		   rb_gsl_wavelet_transform_inverse, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform_inverse",
+                             rb_gsl_wavelet_transform_inverse, -1);
+  rb_define_method(cgsl_wavelet, "transform_inverse",
+                   rb_gsl_wavelet_transform_inverse, -1);
   rb_define_alias(cgsl_wavelet, "inverse", "transform_inverse");
-  rb_define_method(cgsl_vector, "wavelet_transform_inverse", 
-		   rb_gsl_wavelet_transform_inverse, -1);
+  rb_define_method(cgsl_vector, "wavelet_transform_inverse",
+                   rb_gsl_wavelet_transform_inverse, -1);
 
-  rb_define_singleton_method(cgsl_wavelet, "transform_forward!", 
-			     rb_gsl_wavelet_transform_forward2, -1);
-  rb_define_method(cgsl_wavelet, "transform_forward!", 
-		   rb_gsl_wavelet_transform_forward2, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform_forward!",
+                             rb_gsl_wavelet_transform_forward2, -1);
+  rb_define_method(cgsl_wavelet, "transform_forward!",
+                   rb_gsl_wavelet_transform_forward2, -1);
   rb_define_alias(cgsl_wavelet, "forward!", "transform_forward!");
-  rb_define_method(cgsl_vector, "wavelet_transform_forward!", 
-		   rb_gsl_wavelet_transform_forward2, -1);
+  rb_define_method(cgsl_vector, "wavelet_transform_forward!",
+                   rb_gsl_wavelet_transform_forward2, -1);
 
-  rb_define_singleton_method(cgsl_wavelet, "transform_inverse!", 
-			     rb_gsl_wavelet_transform_inverse2, -1);
-  rb_define_method(cgsl_wavelet, "transform_inverse!", 
-		   rb_gsl_wavelet_transform_inverse2, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform_inverse!",
+                             rb_gsl_wavelet_transform_inverse2, -1);
+  rb_define_method(cgsl_wavelet, "transform_inverse!",
+                   rb_gsl_wavelet_transform_inverse2, -1);
   rb_define_alias(cgsl_wavelet, "inverse!", "transform_inverse!");
-  rb_define_method(cgsl_vector, "wavelet_transform_inverse!", 
-		   rb_gsl_wavelet_transform_inverse2, -1);
+  rb_define_method(cgsl_vector, "wavelet_transform_inverse!",
+                   rb_gsl_wavelet_transform_inverse2, -1);
   /***** 2d *****/
-  rb_define_singleton_method(cgsl_wavelet, "transform_matrix", 
-			     rb_gsl_wavelet2d_transform_matrix, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "transform", 
-			     rb_gsl_wavelet2d_transform_matrix, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform_matrix",
+                             rb_gsl_wavelet2d_transform_matrix, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "transform",
+                             rb_gsl_wavelet2d_transform_matrix, -1);
   rb_define_method(cgsl_wavelet, "transform_matrix",
-		   rb_gsl_wavelet2d_transform_matrix, -1);
-  rb_define_method(cgsl_wavelet2d, "transform", 
-		   rb_gsl_wavelet2d_transform_matrix, -1);
-  rb_define_method(cgsl_matrix, "wavelet_transform", 
-		   rb_gsl_wavelet2d_transform_matrix, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "transform_matrix!", 
-			     rb_gsl_wavelet2d_transform_matrix2, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "transform!", 
-			     rb_gsl_wavelet2d_transform_matrix2, -1);
+                   rb_gsl_wavelet2d_transform_matrix, -1);
+  rb_define_method(cgsl_wavelet2d, "transform",
+                   rb_gsl_wavelet2d_transform_matrix, -1);
+  rb_define_method(cgsl_matrix, "wavelet_transform",
+                   rb_gsl_wavelet2d_transform_matrix, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "transform_matrix!",
+                             rb_gsl_wavelet2d_transform_matrix2, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "transform!",
+                             rb_gsl_wavelet2d_transform_matrix2, -1);
   rb_define_method(cgsl_wavelet, "transform_matrix!",
-		   rb_gsl_wavelet2d_transform_matrix2, -1);
-  rb_define_method(cgsl_wavelet2d, "transform!", 
-		   rb_gsl_wavelet2d_transform_matrix2, -1);
-  rb_define_method(cgsl_matrix, "wavelet_transform!", 
-		   rb_gsl_wavelet2d_transform_matrix2, -1);
+                   rb_gsl_wavelet2d_transform_matrix2, -1);
+  rb_define_method(cgsl_wavelet2d, "transform!",
+                   rb_gsl_wavelet2d_transform_matrix2, -1);
+  rb_define_method(cgsl_matrix, "wavelet_transform!",
+                   rb_gsl_wavelet2d_transform_matrix2, -1);
   /**/
 
-  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward", 
-			     rb_gsl_wavelet2d_transform_matrix_forward, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "transform_forward", 
-			     rb_gsl_wavelet2d_transform_matrix_forward, -1);
-  rb_define_method(cgsl_wavelet, "transform_matrix_forward", 
-		   rb_gsl_wavelet2d_transform_matrix_forward, -1);
-  rb_define_method(cgsl_wavelet2d, "transform_forward", 
-		   rb_gsl_wavelet2d_transform_matrix_forward, -1);
-  rb_define_method(cgsl_matrix, "wavelet_transform_forward", 
-		   rb_gsl_wavelet2d_transform_matrix_forward, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward!", 
-			     rb_gsl_wavelet2d_transform_matrix_forward2, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "transform_forward!", 
-			     rb_gsl_wavelet2d_transform_matrix_forward2, -1);
-  rb_define_method(cgsl_wavelet, "transform_matrix_forward!", 
-		   rb_gsl_wavelet2d_transform_matrix_forward2, -1);
-  rb_define_method(cgsl_wavelet2d, "transform_forward!", 
-		   rb_gsl_wavelet2d_transform_matrix_forward2, -1);
-  rb_define_method(cgsl_matrix, "wavelet_transform_forward!", 
-		   rb_gsl_wavelet2d_transform_matrix_forward2, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse", 
-			     rb_gsl_wavelet2d_transform_matrix_inverse, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse", 
-			     rb_gsl_wavelet2d_transform_matrix_inverse, -1);
-  rb_define_method(cgsl_wavelet, "transform_matrix_inverse", 
-		   rb_gsl_wavelet2d_transform_matrix_inverse, -1);
-  rb_define_method(cgsl_wavelet2d, "transform_inverse", 
-		   rb_gsl_wavelet2d_transform_matrix_inverse, -1);
-  rb_define_method(cgsl_matrix, "wavelet_transform_inverse", 
-		   rb_gsl_wavelet2d_transform_matrix_inverse, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse!", 
-			     rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse!", 
-			     rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
-  rb_define_method(cgsl_wavelet, "transform_matrix_inverse!", 
-		   rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
-  rb_define_method(cgsl_wavelet2d, "transform_inverse!", 
-		   rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
-  rb_define_method(cgsl_matrix, "wavelet_transform_inverse!", 
-		   rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
+  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward",
+                             rb_gsl_wavelet2d_transform_matrix_forward, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "transform_forward",
+                             rb_gsl_wavelet2d_transform_matrix_forward, -1);
+  rb_define_method(cgsl_wavelet, "transform_matrix_forward",
+                   rb_gsl_wavelet2d_transform_matrix_forward, -1);
+  rb_define_method(cgsl_wavelet2d, "transform_forward",
+                   rb_gsl_wavelet2d_transform_matrix_forward, -1);
+  rb_define_method(cgsl_matrix, "wavelet_transform_forward",
+                   rb_gsl_wavelet2d_transform_matrix_forward, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward!",
+                             rb_gsl_wavelet2d_transform_matrix_forward2, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "transform_forward!",
+                             rb_gsl_wavelet2d_transform_matrix_forward2, -1);
+  rb_define_method(cgsl_wavelet, "transform_matrix_forward!",
+                   rb_gsl_wavelet2d_transform_matrix_forward2, -1);
+  rb_define_method(cgsl_wavelet2d, "transform_forward!",
+                   rb_gsl_wavelet2d_transform_matrix_forward2, -1);
+  rb_define_method(cgsl_matrix, "wavelet_transform_forward!",
+                   rb_gsl_wavelet2d_transform_matrix_forward2, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse",
+                             rb_gsl_wavelet2d_transform_matrix_inverse, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse",
+                             rb_gsl_wavelet2d_transform_matrix_inverse, -1);
+  rb_define_method(cgsl_wavelet, "transform_matrix_inverse",
+                   rb_gsl_wavelet2d_transform_matrix_inverse, -1);
+  rb_define_method(cgsl_wavelet2d, "transform_inverse",
+                   rb_gsl_wavelet2d_transform_matrix_inverse, -1);
+  rb_define_method(cgsl_matrix, "wavelet_transform_inverse",
+                   rb_gsl_wavelet2d_transform_matrix_inverse, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse!",
+                             rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse!",
+                             rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
+  rb_define_method(cgsl_wavelet, "transform_matrix_inverse!",
+                   rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
+  rb_define_method(cgsl_wavelet2d, "transform_inverse!",
+                   rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
+  rb_define_method(cgsl_matrix, "wavelet_transform_inverse!",
+                   rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
 
   /** nstransform **/
-  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix", 
-			     rb_gsl_wavelet2d_nstransform_matrix, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "nstransform", 
-			     rb_gsl_wavelet2d_nstransform_matrix, -1);
-  rb_define_method(cgsl_wavelet, "nstransform_matrix", 
-		   rb_gsl_wavelet2d_nstransform_matrix, -1);
-  rb_define_method(cgsl_wavelet2d, "nstransform", 
-		   rb_gsl_wavelet2d_nstransform_matrix, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix!", 
-			     rb_gsl_wavelet2d_nstransform_matrix2, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "nstransform!", 
-			     rb_gsl_wavelet2d_nstransform_matrix2, -1);
-  rb_define_method(cgsl_wavelet, "nstransform_matrix!", 
-		   rb_gsl_wavelet2d_nstransform_matrix2, -1);
-  rb_define_method(cgsl_wavelet2d, "nstransform!", 
-		   rb_gsl_wavelet2d_nstransform_matrix2, -1);
+  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix",
+                             rb_gsl_wavelet2d_nstransform_matrix, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "nstransform",
+                             rb_gsl_wavelet2d_nstransform_matrix, -1);
+  rb_define_method(cgsl_wavelet, "nstransform_matrix",
+                   rb_gsl_wavelet2d_nstransform_matrix, -1);
+  rb_define_method(cgsl_wavelet2d, "nstransform",
+                   rb_gsl_wavelet2d_nstransform_matrix, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix!",
+                             rb_gsl_wavelet2d_nstransform_matrix2, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "nstransform!",
+                             rb_gsl_wavelet2d_nstransform_matrix2, -1);
+  rb_define_method(cgsl_wavelet, "nstransform_matrix!",
+                   rb_gsl_wavelet2d_nstransform_matrix2, -1);
+  rb_define_method(cgsl_wavelet2d, "nstransform!",
+                   rb_gsl_wavelet2d_nstransform_matrix2, -1);
   /**/
 
-  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward", 
-			     rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward", 
-			     rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
-  rb_define_method(cgsl_wavelet, "nstransform_matrix_forward", 
-		   rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
-  rb_define_method(cgsl_wavelet2d, "nstransform_forward", 
-		   rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward!", 
-			     rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward!", 
-			     rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
-  rb_define_method(cgsl_wavelet, "nstransform_matrix_forward!", 
-		   rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
-  rb_define_method(cgsl_wavelet2d, "nstransform_forward!", 
-		   rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse", 
-			     rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse", 
-			     rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
-  rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse", 
-		   rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
-  rb_define_method(cgsl_wavelet2d, "nstransform_inverse", 
-		   rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
-
-  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse!", 
-			     rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
-  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse!", 
-			     rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
-  rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse!", 
-		   rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
-  rb_define_method(cgsl_wavelet2d, "nstransform_inverse!", 
-		   rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
-
-#endif
+  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward",
+                             rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward",
+                             rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
+  rb_define_method(cgsl_wavelet, "nstransform_matrix_forward",
+                   rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
+  rb_define_method(cgsl_wavelet2d, "nstransform_forward",
+                   rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward!",
+                             rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward!",
+                             rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
+  rb_define_method(cgsl_wavelet, "nstransform_matrix_forward!",
+                   rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
+  rb_define_method(cgsl_wavelet2d, "nstransform_forward!",
+                   rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse",
+                             rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse",
+                             rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
+  rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse",
+                   rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
+  rb_define_method(cgsl_wavelet2d, "nstransform_inverse",
+                   rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
+
+  rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse!",
+                             rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
+  rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse!",
+                             rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
+  rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse!",
+                   rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
+  rb_define_method(cgsl_wavelet2d, "nstransform_inverse!",
+                   rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
 }
 
 #undef CHECK_WAVELET
diff --git a/gsl.gemspec b/gsl.gemspec
new file mode 100644
index 0000000..2146245
--- /dev/null
+++ b/gsl.gemspec
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+require File.dirname(__FILE__) + '/lib/gsl/version'
+require 'date'
+
+Gem::Specification.new do |s|
+  s.name = 'gsl'
+  s.version = GSL::RUBY_GSL_VERSION
+  s.date = Date.today.to_s
+
+  s.require_paths = %w(lib)
+  s.authors = ['Yoshiki Tsunesada', 'David MacMahon', 'Jens Wille', 'Daniel Mendler']
+  s.summary = 'Ruby interface to the GNU Scientific Library'
+  s.description = 'Ruby/GSL is a Ruby interface to the GNU Scientific Library, for numerical computing with Ruby'
+  s.email = 'mail at daniel-mendler.de'
+  s.extensions  = Dir['ext/**/extconf.rb']
+  s.extra_rdoc_files = Dir['**/*.rdoc']
+  s.files = `git ls-files`.split("\n")
+  s.homepage = 'http://github.com/SciRuby/rb-gsl'
+  s.licenses = ['GPL-2.0']
+  s.rdoc_options = ['--title', "Ruby/GSL (#{GSL::RUBY_GSL_VERSION})", '--charset', 'UTF-8', '--line-numbers', '--all', '--main', 'index.rdoc', '--root', 'rdoc']
+  s.required_ruby_version = '>= 1.9.3'
+  s.requirements = ['GSL (http://www.gnu.org/software/gsl/)']
+
+  s.post_install_message = "#{s.name} can be installed with or without narray support. Please install narray before and reinstall #{s.name} if it is missing."
+
+  s.add_development_dependency 'rake-compiler', '>= 0'
+  s.add_development_dependency 'rake', '>= 0'
+  s.add_development_dependency 'test-unit', '>= 0'
+end
diff --git a/lib/gsl.rb b/lib/gsl.rb
index 048c4f8..042142d 100644
--- a/lib/gsl.rb
+++ b/lib/gsl.rb
@@ -3,12 +3,6 @@ begin
 rescue LoadError
 end
 
-begin
-  require "gsl/#{RUBY_VERSION[/\d+.\d+/]}/gsl_native"
-rescue LoadError => err
-  raise if err.respond_to?(:path) && !err.path
-  require 'gsl/gsl_native'
-end
-
+require 'gsl_native'
 require 'gsl/version'
 require 'gsl/oper'
diff --git a/lib/gsl/gnuplot.rb b/lib/gsl/gnuplot.rb
index d3bf49e..b5be6ee 100644
--- a/lib/gsl/gnuplot.rb
+++ b/lib/gsl/gnuplot.rb
@@ -18,7 +18,7 @@ class Array
   end
   def to_gsplot
     f = ""
-    
+
     if ( self[0].kind_of? Array ) then
       x = self[0]
       y = self[1]
@@ -35,7 +35,7 @@ class Array
     else
       self[0].zip( *self[1..-1] ).to_gsplot
     end
-    
+
     f
   end
 end
diff --git a/lib/gsl/version.rb b/lib/gsl/version.rb
index c0a7f79..cb7fd05 100644
--- a/lib/gsl/version.rb
+++ b/lib/gsl/version.rb
@@ -1,5 +1,3 @@
 module GSL
-
-  RUBY_GSL_VERSION = RB_GSL_VERSION = '1.16.0.4'
-
+  RUBY_GSL_VERSION = RB_GSL_VERSION = '1.16.0.6'
 end
diff --git a/metadata.yml b/metadata.yml
index 215a62c..1eb2dd9 100644
--- a/metadata.yml
+++ b/metadata.yml
@@ -1,53 +1,20 @@
 --- !ruby/object:Gem::Specification
-name: rb-gsl
+name: gsl
 version: !ruby/object:Gem::Version
-  version: 1.16.0.4
+  version: 1.16.0.6
 platform: ruby
 authors:
 - Yoshiki Tsunesada
 - David MacMahon
 - Jens Wille
+- Daniel Mendler
 autorequire: 
 bindir: bin
 cert_chain: []
-date: 2014-12-19 00:00:00.000000000 Z
+date: 2015-07-03 00:00:00.000000000 Z
 dependencies:
 - !ruby/object:Gem::Dependency
-  name: narray
-  requirement: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 0.5.9
-  type: :runtime
-  prerelease: false
-  version_requirements: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 0.5.9
-- !ruby/object:Gem::Dependency
-  name: hen
-  requirement: !ruby/object:Gem::Requirement
-    requirements:
-    - - "~>"
-      - !ruby/object:Gem::Version
-        version: '0.8'
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 0.8.1
-  type: :development
-  prerelease: false
-  version_requirements: !ruby/object:Gem::Requirement
-    requirements:
-    - - "~>"
-      - !ruby/object:Gem::Version
-        version: '0.8'
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 0.8.1
-- !ruby/object:Gem::Dependency
-  name: rake
+  name: rake-compiler
   requirement: !ruby/object:Gem::Requirement
     requirements:
     - - ">="
@@ -61,7 +28,7 @@ dependencies:
       - !ruby/object:Gem::Version
         version: '0'
 - !ruby/object:Gem::Dependency
-  name: rake-compiler
+  name: rake
   requirement: !ruby/object:Gem::Requirement
     requirements:
     - - ">="
@@ -89,73 +56,75 @@ dependencies:
       - !ruby/object:Gem::Version
         version: '0'
 description: Ruby/GSL is a Ruby interface to the GNU Scientific Library, for numerical
-  computing with Ruby [Ruby 2.x and GSL 1.16 compatible fork]
-email: jens.wille at gmail.com
+  computing with Ruby
+email: mail at daniel-mendler.de
 executables: []
 extensions:
-- ext/gsl/extconf.rb
+- ext/gsl_native/extconf.rb
 extra_rdoc_files:
-- rdoc/sf.rdoc
-- rdoc/alf.rdoc
+- rdoc/start.rdoc
+- rdoc/monte.rdoc
+- rdoc/hist3d.rdoc
+- rdoc/ntuple.rdoc
+- rdoc/ndlinear.rdoc
+- rdoc/complex.rdoc
 - rdoc/dht.rdoc
-- rdoc/fft.rdoc
-- rdoc/fit.rdoc
+- rdoc/odeiv.rdoc
+- rdoc/perm.rdoc
+- rdoc/const.rdoc
+- rdoc/nonlinearfit.rdoc
+- rdoc/tensor.rdoc
+- rdoc/linalg_complex.rdoc
+- rdoc/eigen.rdoc
+- rdoc/siman.rdoc
+- rdoc/function.rdoc
 - rdoc/min.rdoc
-- rdoc/ref.rdoc
-- rdoc/rng.rdoc
-- rdoc/sum.rdoc
-- rdoc/tut.rdoc
-- rdoc/use.rdoc
+- rdoc/cholesky_complex.rdoc
+- rdoc/qrng.rdoc
+- rdoc/multiroot.rdoc
 - rdoc/blas.rdoc
-- rdoc/cheb.rdoc
-- rdoc/diff.rdoc
+- rdoc/wavelet.rdoc
 - rdoc/hist.rdoc
 - rdoc/math.rdoc
-- rdoc/perm.rdoc
-- rdoc/poly.rdoc
-- rdoc/qrng.rdoc
-- rdoc/sort.rdoc
-- rdoc/combi.rdoc
-- rdoc/const.rdoc
-- rdoc/eigen.rdoc
-- rdoc/graph.rdoc
-- rdoc/index.rdoc
+- rdoc/sum.rdoc
+- rdoc/sf.rdoc
 - rdoc/intro.rdoc
-- rdoc/monte.rdoc
-- rdoc/odeiv.rdoc
-- rdoc/roots.rdoc
-- rdoc/siman.rdoc
-- rdoc/start.rdoc
-- rdoc/stats.rdoc
-- rdoc/hist2d.rdoc
-- rdoc/hist3d.rdoc
-- rdoc/interp.rdoc
 - rdoc/linalg.rdoc
+- rdoc/randist.rdoc
+- rdoc/tut.rdoc
 - rdoc/matrix.rdoc
+- rdoc/cheb.rdoc
+- rdoc/rng.rdoc
+- rdoc/vector_complex.rdoc
+- rdoc/integration.rdoc
+- rdoc/changes.rdoc
+- rdoc/bspline.rdoc
+- rdoc/graph.rdoc
+- rdoc/alf.rdoc
+- rdoc/hist2d.rdoc
 - rdoc/narray.rdoc
-- rdoc/ntuple.rdoc
-- rdoc/tensor.rdoc
+- rdoc/ref.rdoc
 - rdoc/vector.rdoc
-- rdoc/bspline.rdoc
-- rdoc/changes.rdoc
-- rdoc/complex.rdoc
-- rdoc/randist.rdoc
-- rdoc/wavelet.rdoc
-- rdoc/function.rdoc
+- rdoc/diff.rdoc
+- rdoc/stats.rdoc
+- rdoc/interp.rdoc
 - rdoc/multimin.rdoc
-- rdoc/ndlinear.rdoc
+- rdoc/poly.rdoc
+- rdoc/roots.rdoc
+- rdoc/use.rdoc
+- rdoc/combi.rdoc
+- rdoc/fit.rdoc
+- rdoc/sort.rdoc
+- rdoc/fft.rdoc
 - rdoc/ehandling.rdoc
-- rdoc/multiroot.rdoc
-- rdoc/integration.rdoc
-- rdoc/nonlinearfit.rdoc
-- rdoc/linalg_complex.rdoc
-- rdoc/vector_complex.rdoc
-- rdoc/cholesky_complex.rdoc
 files:
+- ".gitignore"
+- ".travis.yml"
 - AUTHORS
 - COPYING
 - ChangeLog
-- README
+- Gemfile
+- README.md
 - Rakefile
 - THANKS
 - examples/alf/alf.gp
@@ -505,156 +474,155 @@ files:
 - examples/vector/zip.rb
 - examples/wavelet/ecg.dat
 - examples/wavelet/wavelet1.rb
-- ext/gsl/alf.c
-- ext/gsl/array.c
-- ext/gsl/array_complex.c
-- ext/gsl/blas.c
-- ext/gsl/blas1.c
-- ext/gsl/blas2.c
-- ext/gsl/blas3.c
-- ext/gsl/block.c
-- ext/gsl/block_source.c
-- ext/gsl/bspline.c
-- ext/gsl/bundle.c
-- ext/gsl/cdf.c
-- ext/gsl/cheb.c
-- ext/gsl/combination.c
-- ext/gsl/common.c
-- ext/gsl/complex.c
-- ext/gsl/const.c
-- ext/gsl/const_additional.c
-- ext/gsl/cqp.c
-- ext/gsl/deriv.c
-- ext/gsl/dht.c
-- ext/gsl/diff.c
-- ext/gsl/dirac.c
-- ext/gsl/eigen.c
-- ext/gsl/error.c
-- ext/gsl/extconf.rb
-- ext/gsl/fcmp.c
-- ext/gsl/fft.c
-- ext/gsl/fit.c
-- ext/gsl/fresnel.c
-- ext/gsl/function.c
-- ext/gsl/geometry.c
-- ext/gsl/graph.c
-- ext/gsl/gsl.c
-- ext/gsl/gsl_narray.c
-- ext/gsl/histogram.c
-- ext/gsl/histogram2d.c
-- ext/gsl/histogram3d.c
-- ext/gsl/histogram3d_source.c
-- ext/gsl/histogram_find.c
-- ext/gsl/histogram_oper.c
-- ext/gsl/ieee.c
-- ext/gsl/include/rb_gsl.h
-- ext/gsl/include/rb_gsl_array.h
-- ext/gsl/include/rb_gsl_cheb.h
-- ext/gsl/include/rb_gsl_common.h
-- ext/gsl/include/rb_gsl_complex.h
-- ext/gsl/include/rb_gsl_const.h
-- ext/gsl/include/rb_gsl_dirac.h
-- ext/gsl/include/rb_gsl_eigen.h
-- ext/gsl/include/rb_gsl_fft.h
-- ext/gsl/include/rb_gsl_fit.h
-- ext/gsl/include/rb_gsl_function.h
-- ext/gsl/include/rb_gsl_graph.h
-- ext/gsl/include/rb_gsl_histogram.h
-- ext/gsl/include/rb_gsl_histogram3d.h
-- ext/gsl/include/rb_gsl_integration.h
-- ext/gsl/include/rb_gsl_interp.h
-- ext/gsl/include/rb_gsl_linalg.h
-- ext/gsl/include/rb_gsl_math.h
-- ext/gsl/include/rb_gsl_odeiv.h
-- ext/gsl/include/rb_gsl_poly.h
-- ext/gsl/include/rb_gsl_rational.h
-- ext/gsl/include/rb_gsl_rng.h
-- ext/gsl/include/rb_gsl_root.h
-- ext/gsl/include/rb_gsl_sf.h
-- ext/gsl/include/rb_gsl_statistics.h
-- ext/gsl/include/rb_gsl_tensor.h
-- ext/gsl/include/rb_gsl_with_narray.h
-- ext/gsl/include/templates_off.h
-- ext/gsl/include/templates_on.h
-- ext/gsl/integration.c
-- ext/gsl/interp.c
-- ext/gsl/jacobi.c
-- ext/gsl/linalg.c
-- ext/gsl/linalg_complex.c
-- ext/gsl/math.c
-- ext/gsl/matrix.c
-- ext/gsl/matrix_complex.c
-- ext/gsl/matrix_double.c
-- ext/gsl/matrix_int.c
-- ext/gsl/matrix_source.c
-- ext/gsl/min.c
-- ext/gsl/monte.c
-- ext/gsl/multifit.c
-- ext/gsl/multimin.c
-- ext/gsl/multimin_fsdf.c
-- ext/gsl/multiroots.c
-- ext/gsl/multiset.c
-- ext/gsl/ndlinear.c
-- ext/gsl/nmf.c
-- ext/gsl/nmf_wrap.c
-- ext/gsl/ntuple.c
-- ext/gsl/odeiv.c
-- ext/gsl/ool.c
-- ext/gsl/oper_complex_source.c
-- ext/gsl/permutation.c
-- ext/gsl/poly.c
-- ext/gsl/poly2.c
-- ext/gsl/poly_source.c
-- ext/gsl/qrng.c
-- ext/gsl/randist.c
-- ext/gsl/rational.c
-- ext/gsl/rng.c
-- ext/gsl/root.c
-- ext/gsl/sf.c
-- ext/gsl/sf_airy.c
-- ext/gsl/sf_bessel.c
-- ext/gsl/sf_clausen.c
-- ext/gsl/sf_coulomb.c
-- ext/gsl/sf_coupling.c
-- ext/gsl/sf_dawson.c
-- ext/gsl/sf_debye.c
-- ext/gsl/sf_dilog.c
-- ext/gsl/sf_elementary.c
-- ext/gsl/sf_ellint.c
-- ext/gsl/sf_elljac.c
-- ext/gsl/sf_erfc.c
-- ext/gsl/sf_exp.c
-- ext/gsl/sf_expint.c
-- ext/gsl/sf_fermi_dirac.c
-- ext/gsl/sf_gamma.c
-- ext/gsl/sf_gegenbauer.c
-- ext/gsl/sf_hyperg.c
-- ext/gsl/sf_laguerre.c
-- ext/gsl/sf_lambert.c
-- ext/gsl/sf_legendre.c
-- ext/gsl/sf_log.c
-- ext/gsl/sf_mathieu.c
-- ext/gsl/sf_power.c
-- ext/gsl/sf_psi.c
-- ext/gsl/sf_synchrotron.c
-- ext/gsl/sf_transport.c
-- ext/gsl/sf_trigonometric.c
-- ext/gsl/sf_zeta.c
-- ext/gsl/signal.c
-- ext/gsl/siman.c
-- ext/gsl/sort.c
-- ext/gsl/spline.c
-- ext/gsl/stats.c
-- ext/gsl/sum.c
-- ext/gsl/tamu_anova.c
-- ext/gsl/tensor.c
-- ext/gsl/tensor_source.c
-- ext/gsl/vector.c
-- ext/gsl/vector_complex.c
-- ext/gsl/vector_double.c
-- ext/gsl/vector_int.c
-- ext/gsl/vector_source.c
-- ext/gsl/wavelet.c
+- ext/gsl_native/alf.c
+- ext/gsl_native/array.c
+- ext/gsl_native/array_complex.c
+- ext/gsl_native/blas.c
+- ext/gsl_native/blas1.c
+- ext/gsl_native/blas2.c
+- ext/gsl_native/blas3.c
+- ext/gsl_native/block.c
+- ext/gsl_native/block_source.h
+- ext/gsl_native/bspline.c
+- ext/gsl_native/bundle.c
+- ext/gsl_native/cdf.c
+- ext/gsl_native/cheb.c
+- ext/gsl_native/combination.c
+- ext/gsl_native/common.c
+- ext/gsl_native/complex.c
+- ext/gsl_native/const.c
+- ext/gsl_native/const_additional.c
+- ext/gsl_native/cqp.c
+- ext/gsl_native/deriv.c
+- ext/gsl_native/dht.c
+- ext/gsl_native/diff.c
+- ext/gsl_native/dirac.c
+- ext/gsl_native/eigen.c
+- ext/gsl_native/error.c
+- ext/gsl_native/extconf.rb
+- ext/gsl_native/fft.c
+- ext/gsl_native/fit.c
+- ext/gsl_native/fresnel.c
+- ext/gsl_native/function.c
+- ext/gsl_native/geometry.c
+- ext/gsl_native/graph.c
+- ext/gsl_native/gsl.c
+- ext/gsl_native/gsl_narray.c
+- ext/gsl_native/histogram.c
+- ext/gsl_native/histogram2d.c
+- ext/gsl_native/histogram3d.c
+- ext/gsl_native/histogram3d_source.c
+- ext/gsl_native/histogram_find.c
+- ext/gsl_native/histogram_oper.c
+- ext/gsl_native/ieee.c
+- ext/gsl_native/include/rb_gsl.h
+- ext/gsl_native/include/rb_gsl_array.h
+- ext/gsl_native/include/rb_gsl_cheb.h
+- ext/gsl_native/include/rb_gsl_common.h
+- ext/gsl_native/include/rb_gsl_complex.h
+- ext/gsl_native/include/rb_gsl_const.h
+- ext/gsl_native/include/rb_gsl_dirac.h
+- ext/gsl_native/include/rb_gsl_eigen.h
+- ext/gsl_native/include/rb_gsl_fft.h
+- ext/gsl_native/include/rb_gsl_fit.h
+- ext/gsl_native/include/rb_gsl_function.h
+- ext/gsl_native/include/rb_gsl_graph.h
+- ext/gsl_native/include/rb_gsl_histogram.h
+- ext/gsl_native/include/rb_gsl_histogram3d.h
+- ext/gsl_native/include/rb_gsl_integration.h
+- ext/gsl_native/include/rb_gsl_interp.h
+- ext/gsl_native/include/rb_gsl_linalg.h
+- ext/gsl_native/include/rb_gsl_math.h
+- ext/gsl_native/include/rb_gsl_odeiv.h
+- ext/gsl_native/include/rb_gsl_poly.h
+- ext/gsl_native/include/rb_gsl_rational.h
+- ext/gsl_native/include/rb_gsl_rng.h
+- ext/gsl_native/include/rb_gsl_root.h
+- ext/gsl_native/include/rb_gsl_sf.h
+- ext/gsl_native/include/rb_gsl_statistics.h
+- ext/gsl_native/include/rb_gsl_tensor.h
+- ext/gsl_native/include/rb_gsl_with_narray.h
+- ext/gsl_native/include/templates_off.h
+- ext/gsl_native/include/templates_on.h
+- ext/gsl_native/integration.c
+- ext/gsl_native/interp.c
+- ext/gsl_native/jacobi.c
+- ext/gsl_native/linalg.c
+- ext/gsl_native/linalg_complex.c
+- ext/gsl_native/math.c
+- ext/gsl_native/matrix.c
+- ext/gsl_native/matrix_complex.c
+- ext/gsl_native/matrix_double.c
+- ext/gsl_native/matrix_int.c
+- ext/gsl_native/matrix_source.h
+- ext/gsl_native/min.c
+- ext/gsl_native/monte.c
+- ext/gsl_native/multifit.c
+- ext/gsl_native/multimin.c
+- ext/gsl_native/multimin_fsdf.c
+- ext/gsl_native/multiroots.c
+- ext/gsl_native/multiset.c
+- ext/gsl_native/ndlinear.c
+- ext/gsl_native/nmf.c
+- ext/gsl_native/nmf_wrap.c
+- ext/gsl_native/ntuple.c
+- ext/gsl_native/odeiv.c
+- ext/gsl_native/ool.c
+- ext/gsl_native/permutation.c
+- ext/gsl_native/poly.c
+- ext/gsl_native/poly2.c
+- ext/gsl_native/poly_source.h
+- ext/gsl_native/qrng.c
+- ext/gsl_native/randist.c
+- ext/gsl_native/rational.c
+- ext/gsl_native/rng.c
+- ext/gsl_native/root.c
+- ext/gsl_native/sf.c
+- ext/gsl_native/sf_airy.c
+- ext/gsl_native/sf_bessel.c
+- ext/gsl_native/sf_clausen.c
+- ext/gsl_native/sf_coulomb.c
+- ext/gsl_native/sf_coupling.c
+- ext/gsl_native/sf_dawson.c
+- ext/gsl_native/sf_debye.c
+- ext/gsl_native/sf_dilog.c
+- ext/gsl_native/sf_elementary.c
+- ext/gsl_native/sf_ellint.c
+- ext/gsl_native/sf_elljac.c
+- ext/gsl_native/sf_erfc.c
+- ext/gsl_native/sf_exp.c
+- ext/gsl_native/sf_expint.c
+- ext/gsl_native/sf_fermi_dirac.c
+- ext/gsl_native/sf_gamma.c
+- ext/gsl_native/sf_gegenbauer.c
+- ext/gsl_native/sf_hyperg.c
+- ext/gsl_native/sf_laguerre.c
+- ext/gsl_native/sf_lambert.c
+- ext/gsl_native/sf_legendre.c
+- ext/gsl_native/sf_log.c
+- ext/gsl_native/sf_mathieu.c
+- ext/gsl_native/sf_power.c
+- ext/gsl_native/sf_psi.c
+- ext/gsl_native/sf_synchrotron.c
+- ext/gsl_native/sf_transport.c
+- ext/gsl_native/sf_trigonometric.c
+- ext/gsl_native/sf_zeta.c
+- ext/gsl_native/signal.c
+- ext/gsl_native/siman.c
+- ext/gsl_native/sort.c
+- ext/gsl_native/spline.c
+- ext/gsl_native/stats.c
+- ext/gsl_native/sum.c
+- ext/gsl_native/tamu_anova.c
+- ext/gsl_native/tensor.c
+- ext/gsl_native/tensor_source.h
+- ext/gsl_native/vector.c
+- ext/gsl_native/vector_complex.c
+- ext/gsl_native/vector_double.c
+- ext/gsl_native/vector_int.c
+- ext/gsl_native/vector_source.h
+- ext/gsl_native/wavelet.c
+- gsl.gemspec
 - lib/gsl.rb
 - lib/gsl/gnuplot.rb
 - lib/gsl/oper.rb
@@ -682,7 +650,6 @@ files:
 - rdoc/hist.rdoc
 - rdoc/hist2d.rdoc
 - rdoc/hist3d.rdoc
-- rdoc/index.rdoc
 - rdoc/integration.rdoc
 - rdoc/interp.rdoc
 - rdoc/intro.rdoc
@@ -732,6 +699,7 @@ files:
 - test/gsl/err_test.rb
 - test/gsl/fit_test.rb
 - test/gsl/histo_test.rb
+- test/gsl/index_test.rb
 - test/gsl/integration_test.rb
 - test/gsl/interp_test.rb
 - test/gsl/linalg_test.rb
@@ -759,14 +727,16 @@ files:
 - test/gsl/wavelet_test.rb
 - test/gsl_test.rb
 - test/test_helper.rb
-homepage: http://github.com/blackwinter/rb-gsl
+- uncrustify.cfg
+homepage: http://github.com/SciRuby/rb-gsl
 licenses:
 - GPL-2.0
 metadata: {}
-post_install_message: 
+post_install_message: gsl can be installed with or without narray support. Please
+  install narray before and reinstall gsl if it is missing.
 rdoc_options:
 - "--title"
-- Ruby/GSL (v1.16.0.4)
+- Ruby/GSL (1.16.0.6)
 - "--charset"
 - UTF-8
 - "--line-numbers"
@@ -781,7 +751,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
   requirements:
   - - ">="
     - !ruby/object:Gem::Version
-      version: 1.8.7
+      version: 1.9.3
 required_rubygems_version: !ruby/object:Gem::Requirement
   requirements:
   - - ">="
@@ -790,9 +760,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
 requirements:
 - GSL (http://www.gnu.org/software/gsl/)
 rubyforge_project: 
-rubygems_version: 2.4.5
+rubygems_version: 2.2.2
 signing_key: 
 specification_version: 4
-summary: Ruby interface to the GNU Scientific Library [Ruby 2.x and GSL 1.16 compatible
-  fork]
+summary: Ruby interface to the GNU Scientific Library
 test_files: []
+has_rdoc: 
diff --git a/test/gsl/blas_test.rb b/test/gsl/blas_test.rb
index 9d36c91..ff951de 100644
--- a/test/gsl/blas_test.rb
+++ b/test/gsl/blas_test.rb
@@ -59,7 +59,7 @@ class BlasTest < GSL::TestCase
   end
 
   def test_dnrm2
-    require 'narray'
+    return unless GSL.have_narray?
 
     e = Math.sqrt((0..4).inject { |m, x| m + x * x })
 
diff --git a/test/gsl/index_test.rb b/test/gsl/index_test.rb
new file mode 100644
index 0000000..396132f
--- /dev/null
+++ b/test/gsl/index_test.rb
@@ -0,0 +1,61 @@
+require 'test_helper'
+
+class IndexTest < GSL::TestCase
+
+  # helper(s)
+
+  def _create_index array
+    i = GSL::Index.alloc(array.size)
+    array.each_with_index { |e, j| i[j] = e }
+    i
+  end
+
+  # tests
+
+  def test_get_int
+    i = GSL::Index.alloc(5)
+    assert_equal 2, i.get(2)
+    assert_equal 4, i.get(4)
+    assert_equal 3, i.get(-2)
+    assert_equal 0, i.get(-5)
+  end
+
+  def test_get_array
+    i = GSL::Index.alloc(5)
+    assert_equal _create_index([2, 3]), i.get([2, 3])
+    assert_equal _create_index([4, 2]), i.get([-1, 2])
+    assert_equal _create_index([4, 3, 1]), i.get([4, -2, 1])
+    assert_equal _create_index([0, 4, 4, 0]), i.get([0, 4, -1, -5])
+  end
+
+  def test_get_range
+    i = GSL::Index.alloc(5)
+    assert_equal _create_index([2, 3]), i.get(2..3)
+    assert_equal _create_index([0, 1, 2, 3, 4]), i.get(0..4)
+    assert_equal _create_index([0, 1, 2, 3, 4]), i.get(0..5)
+    assert_equal _create_index([0, 1, 2, 3, 4]), i.get(-5..-1)
+    assert_equal _create_index([0]), i.get(0..-5)
+    assert_equal _create_index([0]), i.get(-5..0)
+    assert_equal _create_index([3]), i.get(-2..3)
+    assert_equal _create_index([3, 4]), i.get(-2..4)
+    assert_equal _create_index([1, 2, 3]), i.get(-4...-1) # note the exclusive range operator!
+  end
+
+  def test_get_failure
+    i = GSL::Index.alloc(5)
+    assert_raises(RangeError) { i.get(5) }
+    assert_raises(RangeError) { i.get(-6) }
+    assert_raises(RangeError) { i.get(1_000_000) }
+    assert_raises(ArgumentError) { i.get(10**100) }
+
+    assert_raises(RangeError) { i.get([5]) }
+    assert_raises(RangeError) { i.get([-6]) }
+    assert_raises(RangeError) { i.get([-6, 0, 5]) }
+
+    assert_raises(RangeError) { i.get(-6..-1) }
+    assert_raises(RangeError) { i.get(3..-5) }
+    assert_raises(RangeError) { i.get(-2..-3) }
+    assert_raises(RangeError) { i.get(-2..1) }
+  end
+
+end
diff --git a/test/gsl/matrix_test.rb b/test/gsl/matrix_test.rb
index b4a083d..f333bbd 100644
--- a/test/gsl/matrix_test.rb
+++ b/test/gsl/matrix_test.rb
@@ -74,4 +74,25 @@ class MatrixTest < GSL::TestCase
     assert_equal z1, m[1, 0]
   end
 
+  def test_coerce
+    { 1 => m0 = GSL::Matrix.ones(1), 2 => GSL::Matrix[[2]] }.each { |a, b|
+      [a, a.to_f].each { |c| assert_equal([b, m0], m0.coerce(c)) } }
+
+    m1 = GSL::Matrix::Int.ones(1); [1, 2].each { |a|
+      [a, a.to_f].each { |c| assert_equal([c, m0], m1.coerce(c)) } }
+  end
+
+  def test_mul
+    { 1 => m0 = GSL::Matrix.ones(1), 2 => GSL::Matrix[[2]] }.each { |a, b|
+      [a, a.to_f].each { |c| assert_equal(b, m0 * c); assert_equal(b, c * m0) } }
+
+    { 1 => m1 = GSL::Matrix::Int.ones(1), 2 => GSL::Matrix::Int[[2]] }.each { |a, b|
+      assert_equal(b, m1 * a); [a, a.to_f].each { |c| assert_equal(b, c * m1) } }
+
+    assert_equal GSL::Matrix[[0.2]], m0 * 0.2
+    assert_equal GSL::Matrix[[0.2]], 0.2 * m0
+
+    assert_equal GSL::Matrix::Int[[0]], 0.2 * m1
+  end
+
 end
diff --git a/uncrustify.cfg b/uncrustify.cfg
new file mode 100644
index 0000000..65bceaa
--- /dev/null
+++ b/uncrustify.cfg
@@ -0,0 +1,1693 @@
+# Uncrustify 0.61
+
+#
+# General options
+#
+
+# The type of line endings
+newlines                                  = lf     # auto/lf/crlf/cr
+
+# The original size of tabs in the input
+input_tab_size                            = 8        # number
+
+# The size of tabs in the output (only used if align_with_tabs=true)
+output_tab_size                           = 8        # number
+
+# The ASCII value of the string escape char, usually 92 (\) or 94 (^). (Pawn)
+string_escape_char                        = 92       # number
+
+# Alternate string escape char for Pawn. Only works right before the quote char.
+string_escape_char2                       = 0        # number
+
+# Allow interpreting '>=' and '>>=' as part of a template in 'void f(list<list<B>>=val);'.
+# If true (default), 'assert(x<0 && y>=3)' will be broken.
+# Improvements to template detection may make this option obsolete.
+tok_split_gte                             = false    # false/true
+
+# Control what to do with the UTF-8 BOM (recommend 'remove')
+utf8_bom                                  = remove   # ignore/add/remove/force
+
+# If the file contains bytes with values between 128 and 255, but is not UTF-8, then output as UTF-8
+utf8_byte                                 = false    # false/true
+
+# Force the output encoding to UTF-8
+utf8_force                                = false    # false/true
+
+#
+# Indenting
+#
+
+# The number of columns to indent per level.
+# Usually 2, 3, 4, or 8.
+indent_columns                            = 2        # number
+
+# The continuation indent. If non-zero, this overrides the indent of '(' and '=' continuation indents.
+# For FreeBSD, this is set to 4. Negative value is absolute and not increased for each ( level
+indent_continue                           = 0        # number
+
+# How to use tabs when indenting code
+# 0=spaces only
+# 1=indent with tabs to brace level, align with spaces
+# 2=indent and align with tabs, using spaces when not on a tabstop
+indent_with_tabs                          = 0        # number
+
+# Comments that are not a brace level are indented with tabs on a tabstop.
+# Requires indent_with_tabs=2. If false, will use spaces.
+indent_cmt_with_tabs                      = false    # false/true
+
+# Whether to indent strings broken by '\' so that they line up
+indent_align_string                       = false    # false/true
+
+# The number of spaces to indent multi-line XML strings.
+# Requires indent_align_string=True
+indent_xml_string                         = 0        # number
+
+# Spaces to indent '{' from level
+indent_brace                              = 0        # number
+
+# Whether braces are indented to the body level
+indent_braces                             = false    # false/true
+
+# Disabled indenting function braces if indent_braces is true
+indent_braces_no_func                     = false    # false/true
+
+# Disabled indenting class braces if indent_braces is true
+indent_braces_no_class                    = false    # false/true
+
+# Disabled indenting struct braces if indent_braces is true
+indent_braces_no_struct                   = false    # false/true
+
+# Indent based on the size of the brace parent, i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc.
+indent_brace_parent                       = false    # false/true
+
+# Indent based on the paren open instead of the brace open in '({\n', default is to indent by brace.
+indent_paren_open_brace                   = false    # false/true
+
+# Whether the 'namespace' body is indented
+indent_namespace                          = false    # false/true
+
+# Only indent one namespace and no sub-namepaces.
+# Requires indent_namespace=true.
+indent_namespace_single_indent            = false    # false/true
+
+# The number of spaces to indent a namespace block
+indent_namespace_level                    = 0        # number
+
+# If the body of the namespace is longer than this number, it won't be indented.
+# Requires indent_namespace=true. Default=0 (no limit)
+indent_namespace_limit                    = 0        # number
+
+# Whether the 'extern "C"' body is indented
+indent_extern                             = false    # false/true
+
+# Whether the 'class' body is indented
+indent_class                              = false    # false/true
+
+# Whether to indent the stuff after a leading base class colon
+indent_class_colon                        = false    # false/true
+
+# Whether to indent the stuff after a leading class initializer colon
+indent_constr_colon                       = false    # false/true
+
+# Virtual indent from the ':' for member initializers. Default is 2
+indent_ctor_init_leading                  = 2        # number
+
+# Additional indenting for constructor initializer list
+indent_ctor_init                          = 0        # number
+
+# False=treat 'else\nif' as 'else if' for indenting purposes
+# True=indent the 'if' one level
+indent_else_if                            = false    # false/true
+
+# Amount to indent variable declarations after a open brace. neg=relative, pos=absolute
+indent_var_def_blk                        = 0        # number
+
+# Indent continued variable declarations instead of aligning.
+indent_var_def_cont                       = false    # false/true
+
+# True:  force indentation of function definition to start in column 1
+# False: use the default behavior
+indent_func_def_force_col1                = false    # false/true
+
+# True:  indent continued function call parameters one indent level
+# False: align parameters under the open paren
+indent_func_call_param                    = false    # false/true
+
+# Same as indent_func_call_param, but for function defs
+indent_func_def_param                     = false    # false/true
+
+# Same as indent_func_call_param, but for function protos
+indent_func_proto_param                   = false    # false/true
+
+# Same as indent_func_call_param, but for class declarations
+indent_func_class_param                   = false    # false/true
+
+# Same as indent_func_call_param, but for class variable constructors
+indent_func_ctor_var_param                = false    # false/true
+
+# Same as indent_func_call_param, but for templates
+indent_template_param                     = false    # false/true
+
+# Double the indent for indent_func_xxx_param options
+indent_func_param_double                  = false    # false/true
+
+# Indentation column for standalone 'const' function decl/proto qualifier
+indent_func_const                         = 0        # number
+
+# Indentation column for standalone 'throw' function decl/proto qualifier
+indent_func_throw                         = 0        # number
+
+# The number of spaces to indent a continued '->' or '.'
+# Usually set to 0, 1, or indent_columns.
+indent_member                             = 0        # number
+
+# Spaces to indent single line ('//') comments on lines before code
+indent_sing_line_comments                 = 0        # number
+
+# If set, will indent trailing single line ('//') comments relative
+# to the code instead of trying to keep the same absolute column
+indent_relative_single_line_comments      = false    # false/true
+
+# Spaces to indent 'case' from 'switch'
+# Usually 0 or indent_columns.
+indent_switch_case                        = 0        # number
+
+# Spaces to shift the 'case' line, without affecting any other lines
+# Usually 0.
+indent_case_shift                         = 0        # number
+
+# Spaces to indent '{' from 'case'.
+# By default, the brace will appear under the 'c' in case.
+# Usually set to 0 or indent_columns.
+indent_case_brace                         = 0        # number
+
+# Whether to indent comments found in first column
+indent_col1_comment                       = false    # false/true
+
+# How to indent goto labels
+#  >0 : absolute column where 1 is the leftmost column
+#  <=0 : subtract from brace indent
+indent_label                              = 1        # number
+
+# Same as indent_label, but for access specifiers that are followed by a colon
+indent_access_spec                        = 1        # number
+
+# Indent the code after an access specifier by one level.
+# If set, this option forces 'indent_access_spec=0'
+indent_access_spec_body                   = false    # false/true
+
+# If an open paren is followed by a newline, indent the next line so that it lines up after the open paren (not recommended)
+indent_paren_nl                           = false    # false/true
+
+# Controls the indent of a close paren after a newline.
+# 0: Indent to body level
+# 1: Align under the open paren
+# 2: Indent to the brace level
+indent_paren_close                        = 0        # number
+
+# Controls the indent of a comma when inside a paren.If TRUE, aligns under the open paren
+indent_comma_paren                        = false    # false/true
+
+# Controls the indent of a BOOL operator when inside a paren.If TRUE, aligns under the open paren
+indent_bool_paren                         = false    # false/true
+
+# If 'indent_bool_paren' is true, controls the indent of the first expression. If TRUE, aligns the first expression to the following ones
+indent_first_bool_expr                    = false    # false/true
+
+# If an open square is followed by a newline, indent the next line so that it lines up after the open square (not recommended)
+indent_square_nl                          = false    # false/true
+
+# Don't change the relative indent of ESQL/C 'EXEC SQL' bodies
+indent_preserve_sql                       = false    # false/true
+
+# Align continued statements at the '='. Default=True
+# If FALSE or the '=' is followed by a newline, the next line is indent one tab.
+indent_align_assign                       = true     # false/true
+
+# Indent OC blocks at brace level instead of usual rules.
+indent_oc_block                           = false    # false/true
+
+# Indent OC blocks in a message relative to the parameter name.
+# 0=use indent_oc_block rules, 1+=spaces to indent
+indent_oc_block_msg                       = 0        # number
+
+# Minimum indent for subsequent parameters
+indent_oc_msg_colon                       = 0        # number
+
+# If true, prioritize aligning with initial colon (and stripping spaces from lines, if necessary).
+# Default is true.
+indent_oc_msg_prioritize_first_colon      = true     # false/true
+
+# If indent_oc_block_msg and this option are on, blocks will be indented the way that Xcode does by default (from keyword if the parameter is on its own line; otherwise, from the previous indentation level).
+indent_oc_block_msg_xcode_style           = false    # false/true
+
+# If indent_oc_block_msg and this option are on, blocks will be indented from where the brace is relative to a msg keyword.
+indent_oc_block_msg_from_keyword          = false    # false/true
+
+# If indent_oc_block_msg and this option are on, blocks will be indented from where the brace is relative to a msg colon.
+indent_oc_block_msg_from_colon            = false    # false/true
+
+# If indent_oc_block_msg and this option are on, blocks will be indented from where the block caret is.
+indent_oc_block_msg_from_caret            = false    # false/true
+
+# If indent_oc_block_msg and this option are on, blocks will be indented from where the brace is.
+indent_oc_block_msg_from_brace            = false    # false/true
+
+#
+# Spacing options
+#
+
+# Add or remove space around arithmetic operator '+', '-', '/', '*', etc
+sp_arith                                  = ignore   # ignore/add/remove/force
+
+# Add or remove space around assignment operator '=', '+=', etc
+sp_assign                                 = add   # ignore/add/remove/force
+
+# Add or remove space around '=' in C++11 lambda capture specifications. Overrides sp_assign
+sp_cpp_lambda_assign                      = ignore   # ignore/add/remove/force
+
+# Add or remove space after the capture specification in C++11 lambda.
+sp_cpp_lambda_paren                       = ignore   # ignore/add/remove/force
+
+# Add or remove space around assignment operator '=' in a prototype
+sp_assign_default                         = ignore   # ignore/add/remove/force
+
+# Add or remove space before assignment operator '=', '+=', etc. Overrides sp_assign.
+sp_before_assign                          = add   # ignore/add/remove/force
+
+# Add or remove space after assignment operator '=', '+=', etc. Overrides sp_assign.
+sp_after_assign                           = add  # ignore/add/remove/force
+
+# Add or remove space in 'NS_ENUM ('
+sp_enum_paren                             = ignore   # ignore/add/remove/force
+
+# Add or remove space around assignment '=' in enum
+sp_enum_assign                            = ignore   # ignore/add/remove/force
+
+# Add or remove space before assignment '=' in enum. Overrides sp_enum_assign.
+sp_enum_before_assign                     = ignore   # ignore/add/remove/force
+
+# Add or remove space after assignment '=' in enum. Overrides sp_enum_assign.
+sp_enum_after_assign                      = ignore   # ignore/add/remove/force
+
+# Add or remove space around preprocessor '##' concatenation operator. Default=Add
+sp_pp_concat                              = add      # ignore/add/remove/force
+
+# Add or remove space after preprocessor '#' stringify operator. Also affects the '#@' charizing operator.
+sp_pp_stringify                           = ignore   # ignore/add/remove/force
+
+# Add or remove space before preprocessor '#' stringify operator as in '#define x(y) L#y'.
+sp_before_pp_stringify                    = ignore   # ignore/add/remove/force
+
+# Add or remove space around boolean operators '&&' and '||'
+sp_bool                                   = ignore   # ignore/add/remove/force
+
+# Add or remove space around compare operator '<', '>', '==', etc
+sp_compare                                = ignore   # ignore/add/remove/force
+
+# Add or remove space inside '(' and ')'
+sp_inside_paren                           = ignore   # ignore/add/remove/force
+
+# Add or remove space between nested parens: '((' vs ') )'
+sp_paren_paren                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between back-to-back parens: ')(' vs ') ('
+sp_cparen_oparen                          = ignore   # ignore/add/remove/force
+
+# Whether to balance spaces inside nested parens
+sp_balance_nested_parens                  = false    # false/true
+
+# Add or remove space between ')' and '{'
+sp_paren_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove space before pointer star '*'
+sp_before_ptr_star                        = ignore   # ignore/add/remove/force
+
+# Add or remove space before pointer star '*' that isn't followed by a variable name
+# If set to 'ignore', sp_before_ptr_star is used instead.
+sp_before_unnamed_ptr_star                = ignore   # ignore/add/remove/force
+
+# Add or remove space between pointer stars '*'
+sp_between_ptr_star                       = ignore   # ignore/add/remove/force
+
+# Add or remove space after pointer star '*', if followed by a word.
+sp_after_ptr_star                         = ignore   # ignore/add/remove/force
+
+# Add or remove space after pointer star '*', if followed by a qualifier.
+sp_after_ptr_star_qualifier               = ignore   # ignore/add/remove/force
+
+# Add or remove space after a pointer star '*', if followed by a func proto/def.
+sp_after_ptr_star_func                    = ignore   # ignore/add/remove/force
+
+# Add or remove space after a pointer star '*', if followed by an open paren (function types).
+sp_ptr_star_paren                         = ignore   # ignore/add/remove/force
+
+# Add or remove space before a pointer star '*', if followed by a func proto/def.
+sp_before_ptr_star_func                   = ignore   # ignore/add/remove/force
+
+# Add or remove space before a reference sign '&'
+sp_before_byref                           = ignore   # ignore/add/remove/force
+
+# Add or remove space before a reference sign '&' that isn't followed by a variable name
+# If set to 'ignore', sp_before_byref is used instead.
+sp_before_unnamed_byref                   = ignore   # ignore/add/remove/force
+
+# Add or remove space after reference sign '&', if followed by a word.
+sp_after_byref                            = ignore   # ignore/add/remove/force
+
+# Add or remove space after a reference sign '&', if followed by a func proto/def.
+sp_after_byref_func                       = ignore   # ignore/add/remove/force
+
+# Add or remove space before a reference sign '&', if followed by a func proto/def.
+sp_before_byref_func                      = ignore   # ignore/add/remove/force
+
+# Add or remove space between type and word. Default=Force
+sp_after_type                             = force    # ignore/add/remove/force
+
+# Add or remove space before the paren in the D constructs 'template Foo(' and 'class Foo('.
+sp_before_template_paren                  = ignore   # ignore/add/remove/force
+
+# Add or remove space in 'template <' vs 'template<'.
+# If set to ignore, sp_before_angle is used.
+sp_template_angle                         = ignore   # ignore/add/remove/force
+
+# Add or remove space before '<>'
+sp_before_angle                           = ignore   # ignore/add/remove/force
+
+# Add or remove space inside '<' and '>'
+sp_inside_angle                           = ignore   # ignore/add/remove/force
+
+# Add or remove space after '<>'
+sp_after_angle                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between '<>' and '(' as found in 'new List<byte>();'
+sp_angle_paren                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between '<>' and a word as in 'List<byte> m;'
+sp_angle_word                             = ignore   # ignore/add/remove/force
+
+# Add or remove space between '>' and '>' in '>>' (template stuff C++/C# only). Default=Add
+sp_angle_shift                            = add      # ignore/add/remove/force
+
+# Permit removal of the space between '>>' in 'foo<bar<int> >' (C++11 only). Default=False
+# sp_angle_shift cannot remove the space without this option.
+sp_permit_cpp11_shift                     = false    # false/true
+
+# Add or remove space before '(' of 'if', 'for', 'switch', and 'while'
+sp_before_sparen                          = ignore   # ignore/add/remove/force
+
+# Add or remove space inside if-condition '(' and ')'
+sp_inside_sparen                          = ignore   # ignore/add/remove/force
+
+# Add or remove space before if-condition ')'. Overrides sp_inside_sparen.
+sp_inside_sparen_close                    = ignore   # ignore/add/remove/force
+
+# Add or remove space before if-condition '('. Overrides sp_inside_sparen.
+sp_inside_sparen_open                     = ignore   # ignore/add/remove/force
+
+# Add or remove space after ')' of 'if', 'for', 'switch', and 'while'
+sp_after_sparen                           = ignore   # ignore/add/remove/force
+
+# Add or remove space between ')' and '{' of 'if', 'for', 'switch', and 'while'
+sp_sparen_brace                           = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'invariant' and '(' in the D language.
+sp_invariant_paren                        = ignore   # ignore/add/remove/force
+
+# Add or remove space after the ')' in 'invariant (C) c' in the D language.
+sp_after_invariant_paren                  = ignore   # ignore/add/remove/force
+
+# Add or remove space before empty statement ';' on 'if', 'for' and 'while'
+sp_special_semi                           = ignore   # ignore/add/remove/force
+
+# Add or remove space before ';'. Default=Remove
+sp_before_semi                            = remove   # ignore/add/remove/force
+
+# Add or remove space before ';' in non-empty 'for' statements
+sp_before_semi_for                        = ignore   # ignore/add/remove/force
+
+# Add or remove space before a semicolon of an empty part of a for statement.
+sp_before_semi_for_empty                  = ignore   # ignore/add/remove/force
+
+# Add or remove space after ';', except when followed by a comment. Default=Add
+sp_after_semi                             = add      # ignore/add/remove/force
+
+# Add or remove space after ';' in non-empty 'for' statements. Default=Force
+sp_after_semi_for                         = force    # ignore/add/remove/force
+
+# Add or remove space after the final semicolon of an empty part of a for statement: for ( ; ; <here> ).
+sp_after_semi_for_empty                   = ignore   # ignore/add/remove/force
+
+# Add or remove space before '[' (except '[]')
+sp_before_square                          = ignore   # ignore/add/remove/force
+
+# Add or remove space before '[]'
+sp_before_squares                         = ignore   # ignore/add/remove/force
+
+# Add or remove space inside a non-empty '[' and ']'
+sp_inside_square                          = ignore   # ignore/add/remove/force
+
+# Add or remove space after ','
+sp_after_comma                            = ignore   # ignore/add/remove/force
+
+# Add or remove space before ','
+sp_before_comma                           = remove   # ignore/add/remove/force
+
+# Add or remove space between an open paren and comma: '(,' vs '( ,'
+sp_paren_comma                            = force    # ignore/add/remove/force
+
+# Add or remove space before the variadic '...' when preceded by a non-punctuator
+sp_before_ellipsis                        = ignore   # ignore/add/remove/force
+
+# Add or remove space after class ':'
+sp_after_class_colon                      = ignore   # ignore/add/remove/force
+
+# Add or remove space before class ':'
+sp_before_class_colon                     = ignore   # ignore/add/remove/force
+
+# Add or remove space after class constructor ':'
+sp_after_constr_colon                     = ignore   # ignore/add/remove/force
+
+# Add or remove space before class constructor ':'
+sp_before_constr_colon                    = ignore   # ignore/add/remove/force
+
+# Add or remove space before case ':'. Default=Remove
+sp_before_case_colon                      = remove   # ignore/add/remove/force
+
+# Add or remove space between 'operator' and operator sign
+sp_after_operator                         = ignore   # ignore/add/remove/force
+
+# Add or remove space between the operator symbol and the open paren, as in 'operator ++('
+sp_after_operator_sym                     = ignore   # ignore/add/remove/force
+
+# Add or remove space after C/D cast, i.e. 'cast(int)a' vs 'cast(int) a' or '(int)a' vs '(int) a'
+sp_after_cast                             = ignore   # ignore/add/remove/force
+
+# Add or remove spaces inside cast parens
+sp_inside_paren_cast                      = ignore   # ignore/add/remove/force
+
+# Add or remove space between the type and open paren in a C++ cast, i.e. 'int(exp)' vs 'int (exp)'
+sp_cpp_cast_paren                         = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'sizeof' and '('
+sp_sizeof_paren                           = ignore   # ignore/add/remove/force
+
+# Add or remove space after the tag keyword (Pawn)
+sp_after_tag                              = ignore   # ignore/add/remove/force
+
+# Add or remove space inside enum '{' and '}'
+sp_inside_braces_enum                     = ignore   # ignore/add/remove/force
+
+# Add or remove space inside struct/union '{' and '}'
+sp_inside_braces_struct                   = ignore   # ignore/add/remove/force
+
+# Add or remove space inside '{' and '}'
+sp_inside_braces                          = ignore   # ignore/add/remove/force
+
+# Add or remove space inside '{}'
+sp_inside_braces_empty                    = ignore   # ignore/add/remove/force
+
+# Add or remove space between return type and function name
+# A minimum of 1 is forced except for pointer return types.
+sp_type_func                              = ignore   # ignore/add/remove/force
+
+# Add or remove space between function name and '(' on function declaration
+sp_func_proto_paren                       = ignore   # ignore/add/remove/force
+
+# Add or remove space between function name and '(' on function definition
+sp_func_def_paren                         = ignore   # ignore/add/remove/force
+
+# Add or remove space inside empty function '()'
+sp_inside_fparens                         = ignore   # ignore/add/remove/force
+
+# Add or remove space inside function '(' and ')'
+sp_inside_fparen                          = ignore   # ignore/add/remove/force
+
+# Add or remove space inside the first parens in the function type: 'void (*x)(...)'
+sp_inside_tparen                          = ignore   # ignore/add/remove/force
+
+# Add or remove between the parens in the function type: 'void (*x)(...)'
+sp_after_tparen_close                     = ignore   # ignore/add/remove/force
+
+# Add or remove space between ']' and '(' when part of a function call.
+sp_square_fparen                          = ignore   # ignore/add/remove/force
+
+# Add or remove space between ')' and '{' of function
+sp_fparen_brace                           = ignore   # ignore/add/remove/force
+
+# Java: Add or remove space between ')' and '{{' of double brace initializer.
+sp_fparen_dbrace                          = ignore   # ignore/add/remove/force
+
+# Add or remove space between function name and '(' on function calls
+sp_func_call_paren                        = ignore   # ignore/add/remove/force
+
+# Add or remove space between function name and '()' on function calls without parameters.
+# If set to 'ignore' (the default), sp_func_call_paren is used.
+sp_func_call_paren_empty                  = ignore   # ignore/add/remove/force
+
+# Add or remove space between the user function name and '(' on function calls
+# You need to set a keyword to be a user function, like this: 'set func_call_user _' in the config file.
+sp_func_call_user_paren                   = ignore   # ignore/add/remove/force
+
+# Add or remove space between a constructor/destructor and the open paren
+sp_func_class_paren                       = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'return' and '('
+sp_return_paren                           = ignore   # ignore/add/remove/force
+
+# Add or remove space between '__attribute__' and '('
+sp_attribute_paren                        = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'defined' and '(' in '#if defined (FOO)'
+sp_defined_paren                          = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'throw' and '(' in 'throw (something)'
+sp_throw_paren                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'throw' and anything other than '(' as in '@throw [...];'
+sp_after_throw                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'catch' and '(' in 'catch (something) { }'
+# If set to ignore, sp_before_sparen is used.
+sp_catch_paren                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'version' and '(' in 'version (something) { }' (D language)
+# If set to ignore, sp_before_sparen is used.
+sp_version_paren                          = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'scope' and '(' in 'scope (something) { }' (D language)
+# If set to ignore, sp_before_sparen is used.
+sp_scope_paren                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between macro and value
+sp_macro                                  = ignore   # ignore/add/remove/force
+
+# Add or remove space between macro function ')' and value
+sp_macro_func                             = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'else' and '{' if on the same line
+sp_else_brace                             = ignore   # ignore/add/remove/force
+
+# Add or remove space between '}' and 'else' if on the same line
+sp_brace_else                             = ignore   # ignore/add/remove/force
+
+# Add or remove space between '}' and the name of a typedef on the same line
+sp_brace_typedef                          = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'catch' and '{' if on the same line
+sp_catch_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between '}' and 'catch' if on the same line
+sp_brace_catch                            = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'finally' and '{' if on the same line
+sp_finally_brace                          = ignore   # ignore/add/remove/force
+
+# Add or remove space between '}' and 'finally' if on the same line
+sp_brace_finally                          = ignore   # ignore/add/remove/force
+
+# Add or remove space between 'try' and '{' if on the same line
+sp_try_brace                              = ignore   # ignore/add/remove/force
+
+# Add or remove space between get/set and '{' if on the same line
+sp_getset_brace                           = ignore   # ignore/add/remove/force
+
+# Add or remove space between a variable and '{' for C++ uniform initialization
+sp_word_brace                             = add      # ignore/add/remove/force
+
+# Add or remove space between a variable and '{' for a namespace
+sp_word_brace_ns                          = add      # ignore/add/remove/force
+
+# Add or remove space before the '::' operator
+sp_before_dc                              = ignore   # ignore/add/remove/force
+
+# Add or remove space after the '::' operator
+sp_after_dc                               = ignore   # ignore/add/remove/force
+
+# Add or remove around the D named array initializer ':' operator
+sp_d_array_colon                          = ignore   # ignore/add/remove/force
+
+# Add or remove space after the '!' (not) operator. Default=Remove
+sp_not                                    = remove   # ignore/add/remove/force
+
+# Add or remove space after the '~' (invert) operator. Default=Remove
+sp_inv                                    = remove   # ignore/add/remove/force
+
+# Add or remove space after the '&' (address-of) operator. Default=Remove
+# This does not affect the spacing after a '&' that is part of a type.
+sp_addr                                   = remove   # ignore/add/remove/force
+
+# Add or remove space around the '.' or '->' operators. Default=Remove
+sp_member                                 = remove   # ignore/add/remove/force
+
+# Add or remove space after the '*' (dereference) operator. Default=Remove
+# This does not affect the spacing after a '*' that is part of a type.
+sp_deref                                  = remove   # ignore/add/remove/force
+
+# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. Default=Remove
+sp_sign                                   = remove   # ignore/add/remove/force
+
+# Add or remove space before or after '++' and '--', as in '(--x)' or 'y++;'. Default=Remove
+sp_incdec                                 = remove   # ignore/add/remove/force
+
+# Add or remove space before a backslash-newline at the end of a line. Default=Add
+sp_before_nl_cont                         = add      # ignore/add/remove/force
+
+# Add or remove space after the scope '+' or '-', as in '-(void) foo;' or '+(int) bar;'
+sp_after_oc_scope                         = ignore   # ignore/add/remove/force
+
+# Add or remove space after the colon in message specs
+# '-(int) f:(int) x;' vs '-(int) f: (int) x;'
+sp_after_oc_colon                         = ignore   # ignore/add/remove/force
+
+# Add or remove space before the colon in message specs
+# '-(int) f: (int) x;' vs '-(int) f : (int) x;'
+sp_before_oc_colon                        = ignore   # ignore/add/remove/force
+
+# Add or remove space after the colon in immutable dictionary expression
+# 'NSDictionary *test = @{@"foo" :@"bar"};'
+sp_after_oc_dict_colon                    = ignore   # ignore/add/remove/force
+
+# Add or remove space before the colon in immutable dictionary expression
+# 'NSDictionary *test = @{@"foo" :@"bar"};'
+sp_before_oc_dict_colon                   = ignore   # ignore/add/remove/force
+
+# Add or remove space after the colon in message specs
+# '[object setValue:1];' vs '[object setValue: 1];'
+sp_after_send_oc_colon                    = ignore   # ignore/add/remove/force
+
+# Add or remove space before the colon in message specs
+# '[object setValue:1];' vs '[object setValue :1];'
+sp_before_send_oc_colon                   = ignore   # ignore/add/remove/force
+
+# Add or remove space after the (type) in message specs
+# '-(int)f: (int) x;' vs '-(int)f: (int)x;'
+sp_after_oc_type                          = ignore   # ignore/add/remove/force
+
+# Add or remove space after the first (type) in message specs
+# '-(int) f:(int)x;' vs '-(int)f:(int)x;'
+sp_after_oc_return_type                   = ignore   # ignore/add/remove/force
+
+# Add or remove space between '@selector' and '('
+# '@selector(msgName)' vs '@selector (msgName)'
+# Also applies to @protocol() constructs
+sp_after_oc_at_sel                        = ignore   # ignore/add/remove/force
+
+# Add or remove space between '@selector(x)' and the following word
+# '@selector(foo) a:' vs '@selector(foo)a:'
+sp_after_oc_at_sel_parens                 = ignore   # ignore/add/remove/force
+
+# Add or remove space inside '@selector' parens
+# '@selector(foo)' vs '@selector( foo )'
+# Also applies to @protocol() constructs
+sp_inside_oc_at_sel_parens                = ignore   # ignore/add/remove/force
+
+# Add or remove space before a block pointer caret
+# '^int (int arg){...}' vs. ' ^int (int arg){...}'
+sp_before_oc_block_caret                  = ignore   # ignore/add/remove/force
+
+# Add or remove space after a block pointer caret
+# '^int (int arg){...}' vs. '^ int (int arg){...}'
+sp_after_oc_block_caret                   = ignore   # ignore/add/remove/force
+
+# Add or remove space between the receiver and selector in a message.
+# '[receiver selector ...]'
+sp_after_oc_msg_receiver                  = ignore   # ignore/add/remove/force
+
+# Add or remove space after @property.
+sp_after_oc_property                      = ignore   # ignore/add/remove/force
+
+# Add or remove space around the ':' in 'b ? t : f'
+sp_cond_colon                             = ignore   # ignore/add/remove/force
+
+# Add or remove space before the ':' in 'b ? t : f'. Overrides sp_cond_colon.
+sp_cond_colon_before                      = ignore   # ignore/add/remove/force
+
+# Add or remove space after the ':' in 'b ? t : f'. Overrides sp_cond_colon.
+sp_cond_colon_after                       = ignore   # ignore/add/remove/force
+
+# Add or remove space around the '?' in 'b ? t : f'
+sp_cond_question                          = ignore   # ignore/add/remove/force
+
+# Add or remove space before the '?' in 'b ? t : f'. Overrides sp_cond_question.
+sp_cond_question_before                   = ignore   # ignore/add/remove/force
+
+# Add or remove space after the '?' in 'b ? t : f'. Overrides sp_cond_question.
+sp_cond_question_after                    = ignore   # ignore/add/remove/force
+
+# In the abbreviated ternary form (a ?: b), add/remove space between ? and :.'. Overrides all other sp_cond_* options.
+sp_cond_ternary_short                     = ignore   # ignore/add/remove/force
+
+# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make sense here.
+sp_case_label                             = ignore   # ignore/add/remove/force
+
+# Control the space around the D '..' operator.
+sp_range                                  = ignore   # ignore/add/remove/force
+
+# Control the spacing after ':' in 'for (TYPE VAR : EXPR)' (Java)
+sp_after_for_colon                        = ignore   # ignore/add/remove/force
+
+# Control the spacing before ':' in 'for (TYPE VAR : EXPR)' (Java)
+sp_before_for_colon                       = ignore   # ignore/add/remove/force
+
+# Control the spacing in 'extern (C)' (D)
+sp_extern_paren                           = ignore   # ignore/add/remove/force
+
+# Control the space after the opening of a C++ comment '// A' vs '//A'
+sp_cmt_cpp_start                          = ignore   # ignore/add/remove/force
+
+# Controls the spaces between #else or #endif and a trailing comment
+sp_endif_cmt                              = ignore   # ignore/add/remove/force
+
+# Controls the spaces after 'new', 'delete', and 'delete[]'
+sp_after_new                              = ignore   # ignore/add/remove/force
+
+# Controls the spaces before a trailing or embedded comment
+sp_before_tr_emb_cmt                      = ignore   # ignore/add/remove/force
+
+# Number of spaces before a trailing or embedded comment
+sp_num_before_tr_emb_cmt                  = 0        # number
+
+# Control space between a Java annotation and the open paren.
+sp_annotation_paren                       = ignore   # ignore/add/remove/force
+
+#
+# Code alignment (not left column spaces/tabs)
+#
+
+# Whether to keep non-indenting tabs
+align_keep_tabs                           = false    # false/true
+
+# Whether to use tabs for aligning
+align_with_tabs                           = false    # false/true
+
+# Whether to bump out to the next tab when aligning
+align_on_tabstop                          = false    # false/true
+
+# Whether to left-align numbers
+align_number_left                         = false    # false/true
+
+# Whether to keep whitespace not required for alignment.
+align_keep_extra_space                    = false    # false/true
+
+# Align variable definitions in prototypes and functions
+align_func_params                         = false    # false/true
+
+# Align parameters in single-line functions that have the same name.
+# The function names must already be aligned with each other.
+align_same_func_call_params               = false    # false/true
+
+# The span for aligning variable definitions (0=don't align)
+align_var_def_span                        = 0        # number
+
+# How to align the star in variable definitions.
+#  0=Part of the type     'void *   foo;'
+#  1=Part of the variable 'void     *foo;'
+#  2=Dangling             'void    *foo;'
+align_var_def_star_style                  = 0        # number
+
+# How to align the '&' in variable definitions.
+#  0=Part of the type
+#  1=Part of the variable
+#  2=Dangling
+align_var_def_amp_style                   = 0        # number
+
+# The threshold for aligning variable definitions (0=no limit)
+align_var_def_thresh                      = 0        # number
+
+# The gap for aligning variable definitions
+align_var_def_gap                         = 0        # number
+
+# Whether to align the colon in struct bit fields
+align_var_def_colon                       = false    # false/true
+
+# Whether to align any attribute after the variable name
+align_var_def_attribute                   = false    # false/true
+
+# Whether to align inline struct/enum/union variable definitions
+align_var_def_inline                      = false    # false/true
+
+# The span for aligning on '=' in assignments (0=don't align)
+align_assign_span                         = 0        # number
+
+# The threshold for aligning on '=' in assignments (0=no limit)
+align_assign_thresh                       = 0        # number
+
+# The span for aligning on '=' in enums (0=don't align)
+align_enum_equ_span                       = 0        # number
+
+# The threshold for aligning on '=' in enums (0=no limit)
+align_enum_equ_thresh                     = 0        # number
+
+# The span for aligning struct/union (0=don't align)
+align_var_struct_span                     = 0        # number
+
+# The threshold for aligning struct/union member definitions (0=no limit)
+align_var_struct_thresh                   = 0        # number
+
+# The gap for aligning struct/union member definitions
+align_var_struct_gap                      = 0        # number
+
+# The span for aligning struct initializer values (0=don't align)
+align_struct_init_span                    = 0        # number
+
+# The minimum space between the type and the synonym of a typedef
+align_typedef_gap                         = 0        # number
+
+# The span for aligning single-line typedefs (0=don't align)
+align_typedef_span                        = 0        # number
+
+# How to align typedef'd functions with other typedefs
+# 0: Don't mix them at all
+# 1: align the open paren with the types
+# 2: align the function type name with the other type names
+align_typedef_func                        = 0        # number
+
+# Controls the positioning of the '*' in typedefs. Just try it.
+# 0: Align on typedef type, ignore '*'
+# 1: The '*' is part of type name: typedef int  *pint;
+# 2: The '*' is part of the type, but dangling: typedef int *pint;
+align_typedef_star_style                  = 0        # number
+
+# Controls the positioning of the '&' in typedefs. Just try it.
+# 0: Align on typedef type, ignore '&'
+# 1: The '&' is part of type name: typedef int  &pint;
+# 2: The '&' is part of the type, but dangling: typedef int &pint;
+align_typedef_amp_style                   = 0        # number
+
+# The span for aligning comments that end lines (0=don't align)
+align_right_cmt_span                      = 0        # number
+
+# If aligning comments, mix with comments after '}' and #endif with less than 3 spaces before the comment
+align_right_cmt_mix                       = false    # false/true
+
+# If a trailing comment is more than this number of columns away from the text it follows,
+# it will qualify for being aligned. This has to be > 0 to do anything.
+align_right_cmt_gap                       = 0        # number
+
+# Align trailing comment at or beyond column N; 'pulls in' comments as a bonus side effect (0=ignore)
+align_right_cmt_at_col                    = 0        # number
+
+# The span for aligning function prototypes (0=don't align)
+align_func_proto_span                     = 0        # number
+
+# Minimum gap between the return type and the function name.
+align_func_proto_gap                      = 0        # number
+
+# Align function protos on the 'operator' keyword instead of what follows
+align_on_operator                         = false    # false/true
+
+# Whether to mix aligning prototype and variable declarations.
+# If true, align_var_def_XXX options are used instead of align_func_proto_XXX options.
+align_mix_var_proto                       = false    # false/true
+
+# Align single-line functions with function prototypes, uses align_func_proto_span
+align_single_line_func                    = false    # false/true
+
+# Aligning the open brace of single-line functions.
+# Requires align_single_line_func=true, uses align_func_proto_span
+align_single_line_brace                   = false    # false/true
+
+# Gap for align_single_line_brace.
+align_single_line_brace_gap               = 0        # number
+
+# The span for aligning ObjC msg spec (0=don't align)
+align_oc_msg_spec_span                    = 0        # number
+
+# Whether to align macros wrapped with a backslash and a newline.
+# This will not work right if the macro contains a multi-line comment.
+align_nl_cont                             = false    # false/true
+
+# # Align macro functions and variables together
+align_pp_define_together                  = false    # false/true
+
+# The minimum space between label and value of a preprocessor define
+align_pp_define_gap                       = 0        # number
+
+# The span for aligning on '#define' bodies (0=don't align, other=number of lines including comments between blocks)
+align_pp_define_span                      = 0        # number
+
+# Align lines that start with '<<' with previous '<<'. Default=true
+align_left_shift                          = true     # false/true
+
+# Span for aligning parameters in an Obj-C message call on the ':' (0=don't align)
+align_oc_msg_colon_span                   = 0        # number
+
+# If true, always align with the first parameter, even if it is too short.
+align_oc_msg_colon_first                  = false    # false/true
+
+# Aligning parameters in an Obj-C '+' or '-' declaration on the ':'
+align_oc_decl_colon                       = false    # false/true
+
+#
+# Newline adding and removing options
+#
+
+# Whether to collapse empty blocks between '{' and '}'
+nl_collapse_empty_body                    = false    # false/true
+
+# Don't split one-line braced assignments - 'foo_t f = { 1, 2 };'
+nl_assign_leave_one_liners                = false    # false/true
+
+# Don't split one-line braced statements inside a class xx { } body
+nl_class_leave_one_liners                 = false    # false/true
+
+# Don't split one-line enums: 'enum foo { BAR = 15 };'
+nl_enum_leave_one_liners                  = false    # false/true
+
+# Don't split one-line get or set functions
+nl_getset_leave_one_liners                = false    # false/true
+
+# Don't split one-line function definitions - 'int foo() { return 0; }'
+nl_func_leave_one_liners                  = false    # false/true
+
+# Don't split one-line C++11 lambdas - '[]() { return 0; }'
+nl_cpp_lambda_leave_one_liners            = false    # false/true
+
+# Don't split one-line if/else statements - 'if(a) b++;'
+nl_if_leave_one_liners                    = false    # false/true
+
+# Don't split one-line OC messages
+nl_oc_msg_leave_one_liner                 = false    # false/true
+
+# Add or remove newlines at the start of the file
+nl_start_of_file                          = ignore   # ignore/add/remove/force
+
+# The number of newlines at the start of the file (only used if nl_start_of_file is 'add' or 'force'
+nl_start_of_file_min                      = 0        # number
+
+# Add or remove newline at the end of the file
+nl_end_of_file                            = ignore   # ignore/add/remove/force
+
+# The number of newlines at the end of the file (only used if nl_end_of_file is 'add' or 'force')
+nl_end_of_file_min                        = 0        # number
+
+# Add or remove newline between '=' and '{'
+nl_assign_brace                           = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '=' and '[' (D only)
+nl_assign_square                          = ignore   # ignore/add/remove/force
+
+# Add or remove newline after '= [' (D only). Will also affect the newline before the ']'
+nl_after_square_assign                    = ignore   # ignore/add/remove/force
+
+# The number of blank lines after a block of variable definitions at the top of a function body
+# 0 = No change (default)
+nl_func_var_def_blk                       = 0        # number
+
+# The number of newlines before a block of typedefs
+# 0 = No change (default)
+nl_typedef_blk_start                      = 0        # number
+
+# The number of newlines after a block of typedefs
+# 0 = No change (default)
+nl_typedef_blk_end                        = 0        # number
+
+# The maximum consecutive newlines within a block of typedefs
+# 0 = No change (default)
+nl_typedef_blk_in                         = 0        # number
+
+# The number of newlines before a block of variable definitions not at the top of a function body
+# 0 = No change (default)
+nl_var_def_blk_start                      = 0        # number
+
+# The number of newlines after a block of variable definitions not at the top of a function body
+# 0 = No change (default)
+nl_var_def_blk_end                        = 0        # number
+
+# The maximum consecutive newlines within a block of variable definitions
+# 0 = No change (default)
+nl_var_def_blk_in                         = 0        # number
+
+# Add or remove newline between a function call's ')' and '{', as in:
+# list_for_each(item, &list) { }
+nl_fcall_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'enum' and '{'
+nl_enum_brace                             = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'struct and '{'
+nl_struct_brace                           = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'union' and '{'
+nl_union_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'if' and '{'
+nl_if_brace                               = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '}' and 'else'
+nl_brace_else                             = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'else if' and '{'
+# If set to ignore, nl_if_brace is used instead
+nl_elseif_brace                           = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'else' and '{'
+nl_else_brace                             = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'else' and 'if'
+nl_else_if                                = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '}' and 'finally'
+nl_brace_finally                          = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'finally' and '{'
+nl_finally_brace                          = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'try' and '{'
+nl_try_brace                              = ignore   # ignore/add/remove/force
+
+# Add or remove newline between get/set and '{'
+nl_getset_brace                           = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'for' and '{'
+nl_for_brace                              = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'catch' and '{'
+nl_catch_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '}' and 'catch'
+nl_brace_catch                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '}' and ']'
+nl_brace_square                           = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '}' and ')' in a function invocation
+nl_brace_fparen                           = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'while' and '{'
+nl_while_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'scope (x)' and '{' (D)
+nl_scope_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'unittest' and '{' (D)
+nl_unittest_brace                         = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'version (x)' and '{' (D)
+nl_version_brace                          = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'using' and '{'
+nl_using_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between two open or close braces.
+# Due to general newline/brace handling, REMOVE may not work.
+nl_brace_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'do' and '{'
+nl_do_brace                               = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '}' and 'while' of 'do' statement
+nl_brace_while                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'switch' and '{'
+nl_switch_brace                           = ignore   # ignore/add/remove/force
+
+# Add a newline between ')' and '{' if the ')' is on a different line than the if/for/etc.
+# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch, and nl_catch_brace.
+nl_multi_line_cond                        = false    # false/true
+
+# Force a newline in a define after the macro name for multi-line defines.
+nl_multi_line_define                      = false    # false/true
+
+# Whether to put a newline before 'case' statement
+nl_before_case                            = false    # false/true
+
+# Add or remove newline between ')' and 'throw'
+nl_before_throw                           = ignore   # ignore/add/remove/force
+
+# Whether to put a newline after 'case' statement
+nl_after_case                             = false    # false/true
+
+# Add or remove a newline between a case ':' and '{'. Overrides nl_after_case.
+nl_case_colon_brace                       = ignore   # ignore/add/remove/force
+
+# Newline between namespace and {
+nl_namespace_brace                        = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'template<>' and whatever follows.
+nl_template_class                         = ignore   # ignore/add/remove/force
+
+# Add or remove newline between 'class' and '{'
+nl_class_brace                            = ignore   # ignore/add/remove/force
+
+# Add or remove newline after each ',' in the class base list
+nl_class_init_args                        = ignore   # ignore/add/remove/force
+
+# Add or remove newline after each ',' in the constructor member initialization
+nl_constr_init_args                       = ignore   # ignore/add/remove/force
+
+# Add or remove newline between return type and function name in a function definition
+nl_func_type_name                         = ignore   # ignore/add/remove/force
+
+# Add or remove newline between return type and function name inside a class {}
+# Uses nl_func_type_name or nl_func_proto_type_name if set to ignore.
+nl_func_type_name_class                   = ignore   # ignore/add/remove/force
+
+# Add or remove newline between function scope and name in a definition
+# Controls the newline after '::' in 'void A::f() { }'
+nl_func_scope_name                        = ignore   # ignore/add/remove/force
+
+# Add or remove newline between return type and function name in a prototype
+nl_func_proto_type_name                   = ignore   # ignore/add/remove/force
+
+# Add or remove newline between a function name and the opening '('
+nl_func_paren                             = ignore   # ignore/add/remove/force
+
+# Add or remove newline between a function name and the opening '(' in the definition
+nl_func_def_paren                         = ignore   # ignore/add/remove/force
+
+# Add or remove newline after '(' in a function declaration
+nl_func_decl_start                        = ignore   # ignore/add/remove/force
+
+# Add or remove newline after '(' in a function definition
+nl_func_def_start                         = ignore   # ignore/add/remove/force
+
+# Overrides nl_func_decl_start when there is only one parameter.
+nl_func_decl_start_single                 = ignore   # ignore/add/remove/force
+
+# Overrides nl_func_def_start when there is only one parameter.
+nl_func_def_start_single                  = ignore   # ignore/add/remove/force
+
+# Add or remove newline after each ',' in a function declaration
+nl_func_decl_args                         = ignore   # ignore/add/remove/force
+
+# Add or remove newline after each ',' in a function definition
+nl_func_def_args                          = ignore   # ignore/add/remove/force
+
+# Add or remove newline before the ')' in a function declaration
+nl_func_decl_end                          = ignore   # ignore/add/remove/force
+
+# Add or remove newline before the ')' in a function definition
+nl_func_def_end                           = ignore   # ignore/add/remove/force
+
+# Overrides nl_func_decl_end when there is only one parameter.
+nl_func_decl_end_single                   = ignore   # ignore/add/remove/force
+
+# Overrides nl_func_def_end when there is only one parameter.
+nl_func_def_end_single                    = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '()' in a function declaration.
+nl_func_decl_empty                        = ignore   # ignore/add/remove/force
+
+# Add or remove newline between '()' in a function definition.
+nl_func_def_empty                         = ignore   # ignore/add/remove/force
+
+# Whether to put each OC message parameter on a separate line
+# See nl_oc_msg_leave_one_liner
+nl_oc_msg_args                            = false    # false/true
+
+# Add or remove newline between function signature and '{'
+nl_fdef_brace                             = ignore   # ignore/add/remove/force
+
+# Add or remove newline between C++11 lambda signature and '{'
+nl_cpp_ldef_brace                         = ignore   # ignore/add/remove/force
+
+# Add or remove a newline between the return keyword and return expression.
+nl_return_expr                            = ignore   # ignore/add/remove/force
+
+# Whether to put a newline after semicolons, except in 'for' statements
+nl_after_semicolon                        = false    # false/true
+
+# Java: Control the newline between the ')' and '{{' of the double brace initializer.
+nl_paren_dbrace_open                      = ignore   # ignore/add/remove/force
+
+# Whether to put a newline after brace open.
+# This also adds a newline before the matching brace close.
+nl_after_brace_open                       = false    # false/true
+
+# If nl_after_brace_open and nl_after_brace_open_cmt are true, a newline is
+# placed between the open brace and a trailing single-line comment.
+nl_after_brace_open_cmt                   = false    # false/true
+
+# Whether to put a newline after a virtual brace open with a non-empty body.
+# These occur in un-braced if/while/do/for statement bodies.
+nl_after_vbrace_open                      = false    # false/true
+
+# Whether to put a newline after a virtual brace open with an empty body.
+# These occur in un-braced if/while/do/for statement bodies.
+nl_after_vbrace_open_empty                = false    # false/true
+
+# Whether to put a newline after a brace close.
+# Does not apply if followed by a necessary ';'.
+nl_after_brace_close                      = false    # false/true
+
+# Whether to put a newline after a virtual brace close.
+# Would add a newline before return in: 'if (foo) a++; return;'
+nl_after_vbrace_close                     = false    # false/true
+
+# Control the newline between the close brace and 'b' in: 'struct { int a; } b;'
+# Affects enums, unions, and structures. If set to ignore, uses nl_after_brace_close
+nl_brace_struct_var                       = ignore   # ignore/add/remove/force
+
+# Whether to alter newlines in '#define' macros
+nl_define_macro                           = false    # false/true
+
+# Whether to not put blanks after '#ifxx', '#elxx', or before '#endif'
+nl_squeeze_ifdef                          = false    # false/true
+
+# Add or remove blank line before 'if'
+nl_before_if                              = ignore   # ignore/add/remove/force
+
+# Add or remove blank line after 'if' statement
+nl_after_if                               = remove   # ignore/add/remove/force
+
+# Add or remove blank line before 'for'
+nl_before_for                             = ignore   # ignore/add/remove/force
+
+# Add or remove blank line after 'for' statement
+nl_after_for                              = remove   # ignore/add/remove/force
+
+# Add or remove blank line before 'while'
+nl_before_while                           = ignore   # ignore/add/remove/force
+
+# Add or remove blank line after 'while' statement
+nl_after_while                            = ignore   # ignore/add/remove/force
+
+# Add or remove blank line before 'switch'
+nl_before_switch                          = ignore   # ignore/add/remove/force
+
+# Add or remove blank line after 'switch' statement
+nl_after_switch                           = ignore   # ignore/add/remove/force
+
+# Add or remove blank line before 'do'
+nl_before_do                              = ignore   # ignore/add/remove/force
+
+# Add or remove blank line after 'do/while' statement
+nl_after_do                               = ignore   # ignore/add/remove/force
+
+# Whether to double-space commented-entries in struct/enum
+nl_ds_struct_enum_cmt                     = false    # false/true
+
+# Whether to double-space before the close brace of a struct/union/enum
+# (lower priority than 'eat_blanks_before_close_brace')
+nl_ds_struct_enum_close_brace             = false    # false/true
+
+# Add or remove a newline around a class colon.
+# Related to pos_class_colon, nl_class_init_args, and pos_class_comma.
+nl_class_colon                            = ignore   # ignore/add/remove/force
+
+# Add or remove a newline around a class constructor colon.
+# Related to pos_constr_colon, nl_constr_init_args, and pos_constr_comma.
+nl_constr_colon                           = ignore   # ignore/add/remove/force
+
+# Change simple unbraced if statements into a one-liner
+# 'if(b)\n i++;' => 'if(b) i++;'
+nl_create_if_one_liner                    = false    # false/true
+
+# Change simple unbraced for statements into a one-liner
+# 'for (i=0;i<5;i++)\n foo(i);' => 'for (i=0;i<5;i++) foo(i);'
+nl_create_for_one_liner                   = false    # false/true
+
+# Change simple unbraced while statements into a one-liner
+# 'while (i<5)\n foo(i++);' => 'while (i<5) foo(i++);'
+nl_create_while_one_liner                 = false    # false/true
+
+#
+# Positioning options
+#
+
+# The position of arithmetic operators in wrapped expressions
+pos_arith                                 = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of assignment in wrapped expressions.
+# Do not affect '=' followed by '{'
+pos_assign                                = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of boolean operators in wrapped expressions
+pos_bool                                  = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of comparison operators in wrapped expressions
+pos_compare                               = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of conditional (b ? t : f) operators in wrapped expressions
+pos_conditional                           = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of the comma in wrapped expressions
+pos_comma                                 = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of the comma in the class base list
+pos_class_comma                           = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of the comma in the constructor initialization list
+pos_constr_comma                          = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of colons between class and base class list
+pos_class_colon                           = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+# The position of colons between constructor and member initialization
+pos_constr_colon                          = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force
+
+#
+# Line Splitting options
+#
+
+# Try to limit code width to N number of columns
+code_width                                = 0        # number
+
+# Whether to fully split long 'for' statements at semi-colons
+ls_for_split_full                         = false    # false/true
+
+# Whether to fully split long function protos/calls at commas
+ls_func_split_full                        = false    # false/true
+
+# Whether to split lines as close to code_width as possible and ignore some groupings
+ls_code_width                             = false    # false/true
+
+#
+# Blank line options
+#
+
+# The maximum consecutive newlines
+nl_max                                    = 0        # number
+
+# The number of newlines after a function prototype, if followed by another function prototype
+nl_after_func_proto                       = 0        # number
+
+# The number of newlines after a function prototype, if not followed by another function prototype
+nl_after_func_proto_group                 = 0        # number
+
+# The number of newlines after '}' of a multi-line function body
+nl_after_func_body                        = 0        # number
+
+# The number of newlines after '}' of a multi-line function body in a class declaration
+nl_after_func_body_class                  = 0        # number
+
+# The number of newlines after '}' of a single line function body
+nl_after_func_body_one_liner              = 0        # number
+
+# The minimum number of newlines before a multi-line comment.
+# Doesn't apply if after a brace open or another multi-line comment.
+nl_before_block_comment                   = 0        # number
+
+# The minimum number of newlines before a single-line C comment.
+# Doesn't apply if after a brace open or other single-line C comments.
+nl_before_c_comment                       = 0        # number
+
+# The minimum number of newlines before a CPP comment.
+# Doesn't apply if after a brace open or other CPP comments.
+nl_before_cpp_comment                     = 0        # number
+
+# Whether to force a newline after a multi-line comment.
+nl_after_multiline_comment                = false    # false/true
+
+# The number of newlines after '}' or ';' of a struct/enum/union definition
+nl_after_struct                           = 0        # number
+
+# The number of newlines after '}' or ';' of a class definition
+nl_after_class                            = 0        # number
+
+# The number of newlines before a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label.
+# Will not change the newline count if after a brace open.
+# 0 = No change.
+nl_before_access_spec                     = 0        # number
+
+# The number of newlines after a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label.
+# 0 = No change.
+nl_after_access_spec                      = 0        # number
+
+# The number of newlines between a function def and the function comment.
+# 0 = No change.
+nl_comment_func_def                       = 0        # number
+
+# The number of newlines after a try-catch-finally block that isn't followed by a brace close.
+# 0 = No change.
+nl_after_try_catch_finally                = 0        # number
+
+# The number of newlines before and after a property, indexer or event decl.
+# 0 = No change.
+nl_around_cs_property                     = 0        # number
+
+# The number of newlines between the get/set/add/remove handlers in C#.
+# 0 = No change.
+nl_between_get_set                        = 0        # number
+
+# Add or remove newline between C# property and the '{'
+nl_property_brace                         = ignore   # ignore/add/remove/force
+
+# Whether to remove blank lines after '{'
+eat_blanks_after_open_brace               = false    # false/true
+
+# Whether to remove blank lines before '}'
+eat_blanks_before_close_brace             = false    # false/true
+
+# How aggressively to remove extra newlines not in preproc.
+# 0: No change
+# 1: Remove most newlines not handled by other config
+# 2: Remove all newlines and reformat completely by config
+nl_remove_extra_newlines                  = 0        # number
+
+# Whether to put a blank line before 'return' statements, unless after an open brace.
+nl_before_return                          = false    # false/true
+
+# Whether to put a blank line after 'return' statements, unless followed by a close brace.
+nl_after_return                           = false    # false/true
+
+# Whether to put a newline after a Java annotation statement.
+# Only affects annotations that are after a newline.
+nl_after_annotation                       = ignore   # ignore/add/remove/force
+
+# Controls the newline between two annotations.
+nl_between_annotation                     = ignore   # ignore/add/remove/force
+
+#
+# Code modifying options (non-whitespace)
+#
+
+# Add or remove braces on single-line 'do' statement
+mod_full_brace_do                         = ignore   # ignore/add/remove/force
+
+# Add or remove braces on single-line 'for' statement
+mod_full_brace_for                        = ignore   # ignore/add/remove/force
+
+# Add or remove braces on single-line function definitions. (Pawn)
+mod_full_brace_function                   = ignore   # ignore/add/remove/force
+
+# Add or remove braces on single-line 'if' statement. Will not remove the braces if they contain an 'else'.
+mod_full_brace_if                         = ignore   # ignore/add/remove/force
+
+# Make all if/elseif/else statements in a chain be braced or not. Overrides mod_full_brace_if.
+# If any must be braced, they are all braced.  If all can be unbraced, then the braces are removed.
+mod_full_brace_if_chain                   = false    # false/true
+
+# Don't remove braces around statements that span N newlines
+mod_full_brace_nl                         = 0        # number
+
+# Add or remove braces on single-line 'while' statement
+mod_full_brace_while                      = ignore   # ignore/add/remove/force
+
+# Add or remove braces on single-line 'using ()' statement
+mod_full_brace_using                      = ignore   # ignore/add/remove/force
+
+# Add or remove unnecessary paren on 'return' statement
+mod_paren_on_return                       = ignore   # ignore/add/remove/force
+
+# Whether to change optional semicolons to real semicolons
+mod_pawn_semicolon                        = false    # false/true
+
+# Add parens on 'while' and 'if' statement around bools
+mod_full_paren_if_bool                    = false    # false/true
+
+# Whether to remove superfluous semicolons
+mod_remove_extra_semicolon                = true    # false/true
+
+# If a function body exceeds the specified number of newlines and doesn't have a comment after
+# the close brace, a comment will be added.
+mod_add_long_function_closebrace_comment  = 0        # number
+
+# If a namespace body exceeds the specified number of newlines and doesn't have a comment after
+# the close brace, a comment will be added.
+mod_add_long_namespace_closebrace_comment = 0        # number
+
+# If a switch body exceeds the specified number of newlines and doesn't have a comment after
+# the close brace, a comment will be added.
+mod_add_long_switch_closebrace_comment    = 0        # number
+
+# If an #ifdef body exceeds the specified number of newlines and doesn't have a comment after
+# the #endif, a comment will be added.
+mod_add_long_ifdef_endif_comment          = 0        # number
+
+# If an #ifdef or #else body exceeds the specified number of newlines and doesn't have a comment after
+# the #else, a comment will be added.
+mod_add_long_ifdef_else_comment           = 0        # number
+
+# If TRUE, will sort consecutive single-line 'import' statements [Java, D]
+mod_sort_import                           = false    # false/true
+
+# If TRUE, will sort consecutive single-line 'using' statements [C#]
+mod_sort_using                            = false    # false/true
+
+# If TRUE, will sort consecutive single-line '#include' statements [C/C++] and '#import' statements [Obj-C]
+# This is generally a bad idea, as it may break your code.
+mod_sort_include                          = false    # false/true
+
+# If TRUE, it will move a 'break' that appears after a fully braced 'case' before the close brace.
+mod_move_case_break                       = false    # false/true
+
+# Will add or remove the braces around a fully braced case statement.
+# Will only remove the braces if there are no variable declarations in the block.
+mod_case_brace                            = ignore   # ignore/add/remove/force
+
+# If TRUE, it will remove a void 'return;' that appears as the last statement in a function.
+mod_remove_empty_return                   = false    # false/true
+
+#
+# Comment modifications
+#
+
+# Try to wrap comments at cmt_width columns
+cmt_width                                 = 0        # number
+
+# Set the comment reflow mode (default: 0)
+# 0: no reflowing (apart from the line wrapping due to cmt_width)
+# 1: no touching at all
+# 2: full reflow
+cmt_reflow_mode                           = 0        # number
+
+# Whether to convert all tabs to spaces in comments. Default is to leave tabs inside comments alone, unless used for indenting.
+cmt_convert_tab_to_spaces                 = false    # false/true
+
+# If false, disable all multi-line comment changes, including cmt_width. keyword substitution, and leading chars.
+# Default is true.
+cmt_indent_multi                          = false    # false/true
+
+# Whether to group c-comments that look like they are in a block
+cmt_c_group                               = false    # false/true
+
+# Whether to put an empty '/*' on the first line of the combined c-comment
+cmt_c_nl_start                            = false    # false/true
+
+# Whether to put a newline before the closing '*/' of the combined c-comment
+cmt_c_nl_end                              = false    # false/true
+
+# Whether to group cpp-comments that look like they are in a block
+cmt_cpp_group                             = false    # false/true
+
+# Whether to put an empty '/*' on the first line of the combined cpp-comment
+cmt_cpp_nl_start                          = false    # false/true
+
+# Whether to put a newline before the closing '*/' of the combined cpp-comment
+cmt_cpp_nl_end                            = false    # false/true
+
+# Whether to change cpp-comments into c-comments
+cmt_cpp_to_c                              = false    # false/true
+
+# Whether to put a star on subsequent comment lines
+cmt_star_cont                             = false    # false/true
+
+# The number of spaces to insert at the start of subsequent comment lines
+cmt_sp_before_star_cont                   = 0        # number
+
+# The number of spaces to insert after the star on subsequent comment lines
+cmt_sp_after_star_cont                    = 0        # number
+
+# For multi-line comments with a '*' lead, remove leading spaces if the first and last lines of
+# the comment are the same length. Default=True
+cmt_multi_check_last                      = true     # false/true
+
+# The filename that contains text to insert at the head of a file if the file doesn't start with a C/C++ comment.
+# Will substitute $(filename) with the current file's name.
+cmt_insert_file_header                    = ""         # string
+
+# The filename that contains text to insert at the end of a file if the file doesn't end with a C/C++ comment.
+# Will substitute $(filename) with the current file's name.
+cmt_insert_file_footer                    = ""         # string
+
+# The filename that contains text to insert before a function implementation if the function isn't preceded with a C/C++ comment.
+# Will substitute $(function) with the function name and $(javaparam) with the javadoc @param and @return stuff.
+# Will also substitute $(fclass) with the class name: void CFoo::Bar() { ... }
+cmt_insert_func_header                    = ""         # string
+
+# The filename that contains text to insert before a class if the class isn't preceded with a C/C++ comment.
+# Will substitute $(class) with the class name.
+cmt_insert_class_header                   = ""         # string
+
+# The filename that contains text to insert before a Obj-C message specification if the method isn't preceded with a C/C++ comment.
+# Will substitute $(message) with the function name and $(javaparam) with the javadoc @param and @return stuff.
+cmt_insert_oc_msg_header                  = ""         # string
+
+# If a preprocessor is encountered when stepping backwards from a function name, then
+# this option decides whether the comment should be inserted.
+# Affects cmt_insert_oc_msg_header, cmt_insert_func_header and cmt_insert_class_header.
+cmt_insert_before_preproc                 = false    # false/true
+
+#
+# Preprocessor options
+#
+
+# Control indent of preprocessors inside #if blocks at brace level 0 (file-level)
+pp_indent                                 = ignore   # ignore/add/remove/force
+
+# Whether to indent #if/#else/#endif at the brace level (true) or from column 1 (false)
+pp_indent_at_level                        = false    # false/true
+
+# Specifies the number of columns to indent preprocessors per level at brace level 0 (file-level).
+# If pp_indent_at_level=false, specifies the number of columns to indent preprocessors per level at brace level > 0 (function-level).
+# Default=1.
+pp_indent_count                           = 1        # number
+
+# Add or remove space after # based on pp_level of #if blocks
+pp_space                                  = ignore   # ignore/add/remove/force
+
+# Sets the number of spaces added with pp_space
+pp_space_count                            = 0        # number
+
+# The indent for #region and #endregion in C# and '#pragma region' in C/C++
+pp_indent_region                          = 0        # number
+
+# Whether to indent the code between #region and #endregion
+pp_region_indent_code                     = false    # false/true
+
+# If pp_indent_at_level=true, sets the indent for #if, #else, and #endif when not at file-level.
+# 0:  indent preprocessors using output_tab_size.
+# >0: column at which all preprocessors will be indented.
+pp_indent_if                              = 0        # number
+
+# Control whether to indent the code between #if, #else and #endif.
+pp_if_indent_code                         = false    # false/true
+
+# Whether to indent '#define' at the brace level (true) or from column 1 (false)
+pp_define_at_level                        = false    # false/true
+
+# You can force a token to be a type with the 'type' option.
+# Example:
+# type myfoo1 myfoo2
+#
+# You can create custom macro-based indentation using macro-open,
+# macro-else and macro-close.
+# Example:
+# macro-open  BEGIN_TEMPLATE_MESSAGE_MAP
+# macro-open  BEGIN_MESSAGE_MAP
+# macro-close END_MESSAGE_MAP
+#
+# You can assign any keyword to any type with the set option.
+# set func_call_user _ N_
+#
+# The full syntax description of all custom definition config entries
+# is shown below:
+#
+# define custom tokens as:
+# - embed whitespace in token using '' escape character, or
+#   put token in quotes
+# - these: ' " and ` are recognized as quote delimiters
+#
+# type token1 token2 token3 ...
+#             ^ optionally specify multiple tokens on a single line
+# define def_token output_token
+#                  ^ output_token is optional, then NULL is assumed
+# macro-open token
+# macro-close token
+# macro-else token
+# set id token1 token2 ...
+#               ^ optionally specify multiple tokens on a single line
+#     ^ id is one of the names in token_enum.h sans the CT_ prefix,
+#       e.g. PP_PRAGMA
+#
+# all tokens are separated by any mix of ',' commas, '=' equal signs
+# and whitespace (space, tab)
+#
+# You can add support for other file extensions using the 'file_ext' command.
+# The first arg is the language name used with the '-l' option.
+# The remaining args are file extensions, matched with 'endswith'.
+#   file_ext CPP .ch .cxx .cpp.in
+#

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-gsl.git



More information about the Pkg-ruby-extras-commits mailing list